- 입출력
- 함수 오버로딩
- 매개변수 디폴트 값
- 이름공간
1. 헤더파일 선언/입출력의 기본구성/개행의 진행
#include <iostream> //헤더파일 선언
int main(void)
{
int num;
std::cout<<"Hello World!"<<std::endl;
std::cout<<"Hello"<<"World!"<<std::endl;
std::cin>>num;
std::cout<<num<<' '<<'A';
std::cout<<' '<<3.14<<std::endl;
return 0;
}
실행 결과
Hello World!
Hello World!
20
20 A 3.14
의미 | 코드 | 설명 |
헤더파일 선언 | #include <iostream> | 헤더파일 선언 |
출력 | std::cout<<'출력대상1'<<'출력대상2'<<'출력대상3'; | C언어와 달리 출력 대상에 따른 서식 지정 불필요 |
개행 | std::endl | std::endl를 출력하면 개행이 이루어짐 |
입력 | std::cin>>'변수1'>>'변수2'; | 별도의 서식 지정 불필요(문자열 입력방식 포함)/ 데이터의 구분은 스페이스바, 엔터, 탭 등의 공백을 통해서 이루어짐 |
2. 함수 오버로딩
C++은 함수 호출 시 함수의 이름과 전달되는 인자의 정보를 동시에 참조하여 호출할 함수를 결정
매개변수의 선언이 다르다면 동일한 이름의 함수 정의 가능
- 반환형의 차이는 함수 오버로딩의 조건을 만족시키지 않음
3. 매개변수에 설정하는 디폴트 값
int MyFuncOne(int num=7) {}
// 인자를 전달하지 않으면 7이 전달된 것으로 간주
// 여기서 디폴트 값은 7
int MyFuncTwo(int num1=5, int num2=7) {}
// 인자를 전달하지 않으면 각각 5와 7이 전달된 것으로 간주
디폴트 값은 함수의 선언에만 위치
-> 컴파일러는 함수의 디폴트 값의 지정여부를 알아야 함수의 호출문장을 적절히 컴파일 가능
부분적 디폴트 값 설정
- 매개변수의 일부에만 디폴트 값을 지정하고 채워지지 않은 매개변수에만 인자를 전달 가능
- 전달되는 인자가 왼쪽에서부터 채워지므로, 디폴트 값은 오른쪽부터 채워져야 함
- 오른쪽이 빈 상태로 왼쪽의 매개변수에만 일부 채워진 디폴트 값은 컴파일 에러를 일으킴
4. 이름공간
namespace Np1 //Np1이라는 이름의 공간
{
void func1(void)
{
stf::cout<<"Np1이 정의한 함수"<<std::endl;
}
}
namespace Np2 //Np2이라는 이름의 공간
{
void func1(void)
{
stf::cout<<"Np2이 정의한 함수"<<std::endl;
}
}
int main(void)
{
Np1::func1(); //Np1의 func1 호출
Np2::func1(); //Np2의 func1 호출
return 0;
}
존재하는 이름공간이 다르면 동일한 이름의 함수 및 변수 선언 가능
이름공간은 프로잭트의 진행에 있어서 발생할 수 있는 이름의 충돌을 막을 목적으로 존재
이름공간 기반의 함수 선언과 정의의 분리
namespace Np1
{
void func1(void);
}
namespace Np2
{
void func1(void);
}
void Np1::func1(void)
{
stf::cout<<"Np1이 정의한 함수"<<std::endl;
}
void Np2::func1(void)
{
stf::cout<<"Np2이 정의한 함수"<<std::endl;
}
동일한 이름동간 내에서의 함수 호출
선언된 이름공간의 이름이 동일하다면, 이 둘은 동일한 이름공간으로 간주
이름공간을 명시하지 않고 함수를 호출하면, 함수의 호출문이 존재하는 함수와 동일한 이름공간 안에서 호출할 함수를 찾음
이름공간의 중첩
namespace Parent //이름공간 Parent
{
int num=2; //Parent::num
namespace Sub1 //이름공간 Parent::Sub1
{
int num=3; //Parent::Sub1::num
}
namespace Sub2 //이름공간 Parent::Sub2
{
int num=4; //Parent::Sub2::num
}
}
이름공간은 중첩 가능
계층적 구조를 갖게끔 이름공간 구성 가능
std::cout, stf::sin, std::endl
<iostream>에 선언되어 있는 cout, cin, endl은 이름공간 std안에 선언되어 있음
이렇듯 이름 충돌을 막기 위해, C++ 표준에서 제공하는 다양한 요소들은 이름공간 std안에 선언되어 있음
using을 이용한 이름공간 명시
#include <iostream>
using namespace std;
//std라는 이름공간의 선언없이 접근하겠다는 선언
int main(void)
{
int num;
cin>>num;
cout<<num<<endl;
return 0;
}
너무 빈번한 using namespace의 선언은 이름의 충돌을 막기위한 이름공간의 선언을 의미 없게 만듬
제한적으로 사용할 필요가 있음
이름공간의 별칭 지정
namespace AA
{
namespace BB
{
namespace CC
{
int num1;
int num2;
}
}
}
namespace ABC=AA::BB::CC; //AA::BB::CC에 대해 ABC라는 별칭 지정
ABC::num1=10;
ABC::num2=20; //별칭으로 이름공간의 선언을 대신함
전역변수의 접근
int num=100;
void func(void)
{
int num=10; //지역변수
num+=3; //지역변수 num의 값 3 증가
::num+=7; //전역변수 num의 값 7 증가
}
범위지정 연산자는 전역변수의 접근에도 사용이 가능