자료 저장소

# C++의 입·출력

#include <iostream> 

usingstd::cin;
usingstd::cout;
usingstd::endl;


int main(void)
{
int val;

cout<<"Hello World!"<<endl;

cout<<"숫자 입력 :";
cin>>val;

cout<<val<<endl;

return0;
}

ㆍcout과 <<을 이용한 출력(printf)
ㆍendl을 이용한 개행(\n)
ㆍcin과 >>을 이용한 입력(scnaf)

※ C++에서는 데이터의 입출력이 별도의 포맷지정이 없이 사용이 가능하다.

※ 헤더파일의 확장자는 C언어와 마찬가지로 .h이다. 그러나 C++에서는 프로그래머가 정의하는 헤더파일의
선언이 아닌, 표준 헤더파일의 선언에서는 확장자를 생략하기로 약속되어있다.


# 함수 오버로딩
#include <iostream> 

usingstd::cin;
usingstd::cout;
usingstd::endl;

void MyFunc(void)
{
cout<<"MyFunc(void) called"<<endl;
}

void MyFunc(char c)
{
cout<<"MyFunc(char c) called"<<endl;
}

void MyFunc(int a, int b)
{
cout<<"MyFunc(int a, int b) called"<<endl;
}

int main(void)
{
MyFunc();
MyFunc('A');
MyFunc(12, 13);
return0;
}
※ C++은 호출할 함수를 찾을때 '함수의 이름', '매개변수의 선언' 이 두 가지 정보를 동시에 활용하기때문에
오버로딩이 가능하다. 반면 C언어는 함수의 이름만 이용하기때문에 오버로딩이 불가능하다.



# 매개변수의 디폴트 값
#include <iostream> 

usingstd::cin;
usingstd::cout;
usingstd::endl;

int Adder(int num1=1, int num2=2);

int main(void)
{
cout<<Adder()<<endl;
cout<<Adder(5)<<endl;
cout<<Adder(3, 5)<<endl;
return0;
}

int Adder(int num1, int num2)
{
return num1+num2;
}

※ 함수 호출시 인자를 전달하지 않으면 num1은 1, num2는 2가 전달된 것으로 간주하겠다는 뜻이다.

※ 디폴트 값은 함수의 선언 부분에만 표현하면 되고 함수에 전달되는 인자는 왼쪽에서부터 오른쪽으로 채워지기
때문에  반드시 오른쪽 매개변수의 디폴트 값부터 채우는 형태여야 한다.



# 인라인(inline) 함수

C의 매크로 함수와 비슷하며 C++ 기반의 인라인 함수의 정의 방법은 다음과 같다.
inlineint SQUARE(int x) 
{
return x*x;
}

int main(void)
{
std::cout<<SQUARE(5)<<std::endl;
std::cout<<SQUARE(12)<<std::endl;
return0;
}
매크로 함수는 정의하기가 복잡하지만 인라인함수는 일반 함수처럼 정의가 가능하다.
단, 인라인 함수는 매크로 함수의 자료형에 의존적이지 않는 함수를 만들 수는 없다. (템플릿을 이용)

※ 매크로를 이용한 함수의 인라인화는 전처리기에 의해서 처리되지만, 키워드 inline을 이용한 함수의 인라인화는
컴파일러에 의해서 처리가된다. 따라서 컴파일러는 함수의 인라인화가 오히려 성능에 해가 된다고 판단할 경우,
이 키워드를 무시해버리기도 한다. 또한 컴파일러는 필요한 경우 일부 함수를 임의로 인라인 처리하기도 한다.


# 이름공간(namespace)

프로젝트가 대형화 되었을때 각각의 회사가 함수를 만들면 이름이 겹치는 경우가 있다. 그래서 C++의 표준에서는
'이름공간(namespace)'이라는 문법을 정의해서 이러한 문제에 대한 근본적인 해결책을 제시하고 있다.
#include <iostream> 

namespace BestComImpl // 'BestComImpl'의 이름공간의 이름
{
void SimpleFunc(void);
}

namespace ProgComImpl // 'ProgComImpl'의 이름공간의 이름
{
void SimpleFunc(void);
}

int main(void)
{
BestComImpl::SimpleFunc();
ProgComImpl::SimpleFunc();
return0;
}


void BestComImpl::SimpleFunc(void)
{
std::cout<<"BestCom이 정의한 함수"<<std::endl;
}

void ProgComImpl::SimpleFunc(void)
{
std::cout<<"ProgCom이 정의한 함수"<<std::endl;
}
※ 연산자 :: 을 가리켜 '범위지정 연산자(scope resolution operator)'라 하며, 그 이름이 의미하듯이
이름공간을 지정할 때 사용하는 연산자이다. 이외에도 다양하게 사용된다.

위에서도 사용된 using을 이용한 이름공간의 명시는 이름공간을 지정하지 않고 호출하겠다라는 말한다.

using std::cout; // cout을 이름공간 std에서 찾아라

std는 cout,cin,endl..이외에도 많은 함수들이 선언되어있는 이름공간이다.

using namespace std라고 사용할 경우 using을 세번이나 선언하는 번거로움이 없어지는 반면에 그만큼 이름충돌이
발생할 확률은 상대적으로 높아진다.


댓글 로드 중…

최근에 게시된 글