💬 윤성우 님의 <열혈 C++ 프로그래밍> 책을 혼자 공부하며 배운 내용을 정리합니다. 글의 모든 내용은 책에서 발췌하였습니다.
기본 입출력
std::cin >> a;
std:: cout << a;
std
: namespace
동일한 이름의 함수를 매개변수의 선언형태가 다르게 여러 번 정의하는 것
C는 함수 오버로딩이 불가능하지만 C++은 가능하다.
이는 C와 C++이 함수를 찾는 방법의 차이에서 기인한다.
int myFunc(char c) {}
int myFunc(int a) {}
int myFunc(int a, int b) {}
오버로딩이 가능하려면 매개변수의 자료형
이나 개수
가 달라야 한다. 함수의 반환타입만 다르다면 오버로딩 X
int myFunc(int num=7) {}
매개변수가 없으면 7이 전달된 것으로 간주하도록 할 수 있다.
myFunc();
myFunc(7);
둘은 동일.
int func(int n1, int n2=5, int n3=7);
func(10); // func(10, 5, 7) 과 같은 의미
func(10, 50); // func(10, 50, 7)과 같은 의미
그러나 아래와 같이 오른쪽 매개변수를 먼저 비울 수 없다.
int func(int n1=3, int n2=5, int n3);
int func(int n1=3, int n2, int n3);
유의할 점
int func(int n=10);
int func(void);
이런 식으로의 오버로딩은 불가능. (func();
을 호출했을 때 어느 함수를 실행할 지 난감하기 때문)
#define SQUARE(x) ((x) * (x))
인라인 함수 : 일반 함수처럼 정의할 수 있고, 실행 속도 측면에선 유리한 함수
inline int SQUARE(int x) {
return x * x;
}
매크로 함수는 전처리기
에 의해 컴파일러에게 넘어가기 전에 처리되지만 키워드 inline
에 의한 인라인 함수의 처리는 컴파일러
에 의해 처리된다.
그러나, 매크로 함수가 갖고 있는 또 다른 장점 중 하나인 자료형에 의존적이지 않다
는 단점은 해결하기가 어렵다.
-> 템플릿 template
의 등장
여러 명이 협업한다면 다음과 같은 문제가 발생할 수 있음
void f() {
std:: cout << "A가 만든 함수" << "\n";
}
void f() {
std:: cout << "B가 만든 함수" << "\n";
}
int main() {
f();
return 0;
}
어떤 함수의 이름과 매개변수 형태까지 똑같은 함수들이 있다.
이럴 때 namespace를 분리해줌으로써 문제를 해결 가능
namespace A {
void f() {
std:: cout << "A가 만든 함수" << "\n";
}
}
namespace B{
void f() {
std:: cout << "B가 만든 함수" << "\n";
}
}
int main() {
A::f();
return 0;
}
범위지정 연산자 ::
를 이용하여 namespace를 명시.
동일 namespace 내에 정의된 함수를 호출할 땐 범위지정 연산자 필요 X
namespace A {
void f1();
void f2();
}
void A::f2() {
std::cout << "f2 function" << "\n";
}
void A::f1() {
std::cout << "f1 function" << "\n";
f2();
}
namespace는 중첩될 수 있다.
namespace Parent {
int num = 2;
namespace Child1 {
int num = 3;
}
namespace Child2 {
int num = 4;
}
}
int main()
{
std:: cout << Parent::num << "\n";
std:: cout << Parent::Child1::num << "\n";
std:: cout << Parent::Child2::num << "\n";
}
범위지정 연산자도 중복해서 사용해주면 된다.
using
의 사용으로 매번 귀찮게 범위지정 연산자를 붙이는 일을 줄일 수 있다.
namespace A {
int num = 2;
}
int main()
{
using A::num;
std:: cout << num << "\n";
}
아니면 극단적으로 한 namespace에 선언된 모든 것에 대해 범위지정 연산자를 생략하겠다는 뜻으로 다음과 같이도 사용 가능
using namespace std;
int main() {
cout << "Hello world" << "\n";
}
좋은 방법은 아님.