취미로 음악을 하는 개발자

[C++] 스타일 함수 심화 본문

공대인/C[++]

[C++] 스타일 함수 심화

영월특별시 2019. 4. 11. 00:48
728x90


1. 오버로딩

: 자바를 했을 때에도 오버로딩에 대해 배운 적이 있다. 당연한 얘기지만 같은 함수라도 파라미터의 타입에 따라 다른 명령어를 줄 수 있다.

void swap(int &a, int &b)
{
int tmp = a;
a = b;
b = tmp;
}
void swap(double &a, double &b)
{
double tmp = a;
a = b;
b = tmp;
}
void swap(int *(&a), int *(&b))
{
int *tmp = a;
a = b;
b = tmp;
}


int형, double형, int형 포인터 타입의 오버로딩 코드이다.

따라서 인자의 타입에 따라 다른 결과를 나타낼 수 있다.


2. 기본값 초기화

: 자바에서는 없던 걸로 기억한다. (나중에 시간 나면 테스트 해봐야겠다.)


void getItem(int itemId, int cnt, int sc) {
inventory[itemId] += cnt;
score += sc;
}

void getItem(int itemId, int cnt = 1, int sc = 0) {
inventory[itemId] += cnt;
score += sc;
}


위의 두 개의 함수가 있는데 보통 내가 자바를 할 때에는 첫 번째 코드처럼 사용했다.

이렇게 했을 때의 단점은 itemId, cnt, sc의 인자를 다 받아서 사용하지만 사용자의 의도에 따라 일부만 사용하는 함수를 쓰고 싶을 때에는

따로 오버로딩하는 함수를 만들어서 써야 했다.


하지만 C++에서는 두 번째 코드와 같이 하나의 함수에 사용자가 원하는 만큼 인자를 줄 수 있다. (물론 주어진 파라미터 개수에 한해서)

예를 들어 itemId=1, cnt=2로 주고 싶으면 getItem(1, 2)로 주면 여기서 값은 itemId=1, cnt=2, sc=0 으로 주어진다.

itemId=3, cnt=1, sc=2로 주고 싶으면 getItem(3,1,2)로 주어진다.


여기서 중요한 것은 기본값으로 초기화 하지 않은 itemId 값은 반드시 주어져야 하고 기본값을 설정해준 파라미터 뒤에는 무조건 기본값으로 초기화를 한 파라미터만 올 수 있다.

void getItem(int itemId, int cnt = 1, int sc) {
inventory[itemId] += cnt;
score += sc;
}


위와 같은 코드는 올 수 없다는 이야기다.


번외. C++ 입출력 속도에 관하여

: C++에서 입출력을 처음에 cin과 cout을 사용하는데 이것이 속도가 다른 명령어에 비해 느리다는 것이다.


std::ios_base::sync_with_stdio(false);

위의 코드를 넣으면 scanf, printf와 속도가 비슷해진다고 하지만 위의 코드를 선언한 뒤에는 C 표준 입출력을 사용할 수 없게 된다고 한다.

멀티 스레딩도 되지 않는데, 따라서 보통 코드를 짤 때 scanf/printf를 권장한다고 한다.


출처 : https://cupjoo.tistory.com/97



'공대인 > C[++]' 카테고리의 다른 글

[C++] 객체 생성과 소멸  (0) 2019.05.05
[C++] 클래스  (0) 2019.04.23
[C++] Namespace  (0) 2019.04.12
[C++] 스타일 함수, 문법  (0) 2019.04.07
개념 및 링크, 나중에 정리해서 글 써보기  (0) 2019.04.07
Comments