* 블로그에 작성된 따라배우는 C++ 관련 모든 코드와 사진들의 저작권은 강의의 저자이신 홍정모 교수님께 있습니다.
인프런 사이트(www.inflearn.com)의 '홍정모의 따라하며 배우는 C++' 유료강좌를 실제로 구매하였고
강의를 수강하며 제 스스로 복습 및 내용 정리를 위해
강의에 나오는 코드들을 따라친 코드와 교수님의 말씀, 그리고 강의에 나오는 사진들을
활용하였음을 미리 알립니다.
마지막으로, 좋은 강의를 제작해주신 홍정모 교수님께 감사드립니다.
______________________________________________________________________________________________________________________________
inline 함수에 대해 배웠다.
inline 함수를 봤을 때 어떤 느낌이 들었냐면 C언어의 register 명령어와 매우 유사한 느낌이 들었다.
register도 변수 앞에 붙여서 조금 더 빠르게 cpu안의 캐시?가 작동하게 해주세요라고 권유하는 느낌이었는데
inline 키워드 역시 컴파일러에게 이런 식으로 컴파일해주세요 라고 권장하는 느낌이다.
굳이 inline 키워드를 안써도 컴파일러가 편의에 따라 inline으로 해석하기도 한다.
함수 오버로딩에 관해 이야기해보자.
프로그래머 입장에서 단순히 add 함수 하나를 이용해 연산을 하고 싶지
들어가는 인자의 자료형에 따라서 저렇게 addInt, addDouble함수를 일일이 구현을 하기엔 너무 귀찮고 복잡하다.
처음에 든 생각은 그냥 auto로 자료형을 저절로 컴퓨터가 정하게 하면 어떨까 싶었다
좋은 생각인 것 같다. 근데 컴퓨터가 실수할 수도 있어서 오류날 수도 있잖아.
또 다른 방법은, 지금 사진처럼 같은 이름의 함수지만, parameter와 return type을 다르게 설정하는 것이다.
이러면 함수 오버로딩이 발생한다. 즉, 저 두 함수를 서로 구분할 수 있기 때문에 에러가 나지 않는다.
꽤 유용하다.
핵심은, 함수의 구분은 paramter와 return type이라는 것.
default paramter에 대해서도 배웠다.
default라는 말 그대로, 어떤 특정값이 안들어가면 이 default 값으로 인식하겟다라는 표현이다.
12번 줄의 print()를 보면, 인자를 넣어주지 않았기에 default로 해석이 되어서 1024를 출력하고 있다.
default parameter를 활용할 때 주의해야할 점은, 값을 입력해줄 때 오른쪽부터 입력해줘야한다는 것이다.
말이 조금 애매한데, 코드를 보자.
print(100)을 한 경우 x에만 100이 명시되고, 나머지 y,z에는 default 값이 들어가고 있다.
만약 함수 정의할 때 void print(int x = 10, int y, int z)라 하면 어떻게 될까?
100이 x에 들어갔지만, y와 z에는 값이 안들어가있기 때문에 오류가 난다. 어떻게 보면 매우 당연한것이지.
또한 우리가 함수를 구현할 때 맨 위에 프로토타입을 놓고, 그 이후에 아래에 함수 구현을 하잖아?
근데 이제 default 설정은 프로토타입과 함수 선언 둘 중 하나에만 해야한다.
왜 그럴까?
이유는 간단하다. 프로토타입과 함수 선언의 인자값이 서로 다르면, 어딜 먼저 따라야할지 모르니 문제가 되겠지?
그래서 보통은 헤더파일에 기본값 설정을 한다.
우리가 코드를 뜯어볼때, 헤더파일에 있는 프로토타입들의 형태를 보기 때문이다.
이 경우 애매하다.
1번째 함수 변수 x에 10을 넣으라는 것인지.
아니면 2번째 함수 인자 x에 10을 넣고 기본값 y = 20도 하라는 것인지.
함수의 포인터!
매우매우매우 중요.
결국 함수의 이름도 포인터, 즉 주소값이다.
그렇기에 *을 이용해 함수에 접근이 가능한것이다.
그렇기에 지금까지 함수이름() 한 것이 *함수이름과 같았다.
베열과 매우 흡사하네 음음.
함수 포인터를 선언할 때 주의해야할 점이라면, 내가 가리킬 함수의 return type과 parameter을 일치시켜야한다는 것.
어떻게 보면 매우 당연하지. 다르면 다른 함수잖아.
포인터의 특성답게, 가리키는 주소값을 바꾸면 다른 함수를 가리킬 수 있겠지.
배열을 인자로 받고, bool 인자를 받음으로써 true냐 false이냐 따라서 홀수 짝수를 출력하고 있다.
그런데 true, false를 인자로 보내기가 좀 그렇다. 좀 더 간단히 할 수 없을까?
true, false 대신에, 함수 포인터를 이용해서 만들었다.
이러면 조금 더 직관이 있게 보인다.
이번엔 아까 사용해던 인자에 default로 isEven을 함수포인터로 넣어주었다.
하지만 저렇게 bool(*check_fun)(const int&) 이렇게 길게 쓰기 귀찮다면?
using 과 typedef가 좋은 해결방안이 될 수 있다.
typedef의 경우 함수포인터는 일반적인 변수 typedef와는 약간 다르다.
typedef return형 (*별칭)(인수) 로 정해진다.
using의 경우는 아래 사진처럼
using 별칭 = return형(*)(인수) 로 된다.
요즘의 경우 typedef나 using을 쓰기 보다
std::function을 주로 쓰기도 한다.
생각보다 간단해보인다.
function<return형(인자)> 이름 = 가리킬 함수이름
받는 인자형식도 똑같이 해주면 되고.
편해보임 ㅇㅇ..
'C++(따라하며 배우는 C++)' 카테고리의 다른 글
Chapter 7-(4). 함수 (0) | 2021.09.07 |
---|---|
chapter 7-(3). 함수 (0) | 2021.09.06 |
Chapter 7-(1). 함수 (0) | 2021.09.02 |
chapter 6-(2). 행렬, 문자열, 포인터, 참조 (0) | 2021.08.31 |
chapter 6-(1). 행렬, 문자열, 포인터, 참조 (0) | 2021.08.31 |