ISSAC.Min

[C++ Basic] 사용자 입력(Input) / 출력(Output)(cout, cin Func) 본문

Programming Language/C++ Basic

[C++ Basic] 사용자 입력(Input) / 출력(Output)(cout, cin Func)

ISSAC.M 2019. 4. 11. 10:13
반응형

 1. 사용자 입력 / 출력(User Input / output)


소프트웨어에 있어서 제일 중요한 사람이 있다면 그것은 누구라고 할 수 있을까?

전적으로 필자는 사용자(User)라고 생각한다. 이유는 소프트웨어는 사용자의 요구를 처리하기 위한 도구이기 때문이다. 즉, 오늘할 이야기도 사용자들을 위해 꼭 필요하고 C++의 기본이 되는 함수를 포스팅 할 것이다.


오늘 소개할 사용자 입출력 함수는 앞의 포스팅들인 [연산자(Operator)]의 예시에서 계속 사용했었던 coutcin이다.


C++에서는 cout, cin을 표준 입출력 함수(콘솔 표준 입출력 함수)라고 정의하며 사용을 위해서는 <iostream>이라는 헤더파일을 불러와야한다. 


1
#include <iostream>
cs


즉, cout과 cin은 <iostream> 헤더파일 안에 존재하며 우리는 main 또는 각 함수와 클래스들에서 이 입출력 함수를 불러올 수 있다. (헤더파일을 불러오기 위해선 #include를 사용하여 불러온다.)


1
2
3
4
5
6
7
8
#include <iostream>
 
int main(){
    int num1;
    cin >> num1;
    cout << num1 << endl;
    return 0;
}
cs


그렇다면 <iostream>을 불러왔고 num1의 선언도 제대로 했으니 cout과 cin은 제대로 작동할까? 그렇지 않다. 위의 코드에서는 버그가 발생하는데 이유는 cout과 cin가 수많은 헤더파일 안의 코드들중 어디에 포함되었는지 모르기 때문이다.


cout과 cin은 namespace안의 std에 포함되어있는 함수이다. 그러므로 추가적으로 std사용을 명시해주어야한다.


1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
using namespace std;
 
int main(){
    int num1;
    cin >> num1;
    cout << num1 << endl;
    return 0;
}
cs 


그렇다면 using namespace std;라고 명시해주면 정말 이 코드는 최적화 되어있다고 불 수 있을까? 물론 위의 코드 자체는 문제가 없지만 위 코드에는 간과한 한 부분이 있다고도 볼 수 있다.


필자가 namespace안에 std안에 cout, cin가 포함되어있다고 했는데 std안에는 cout, cin만 포함되어있는게 아니다. 즉 using namespace std;를 사용하면서 모든 std에 관한 함수들을 불러왔다는 말이다. 


아니 그래서 무슨 문제라도?


단순 코드작업이나 쉬운 코드 예제같은 경우 위의 코드는 전혀 문제가 되지 않지만 다른 헤더파일들을 같이 불러왔을때 std에 포함된 함수가 다른 헤더파일에도 같은 이름으로 포함되어있다면 둘의 구분이 되지 않기 때문이다. 즉, 충돌이 발생할 수 있다.


그래서 우리의 선생님들은 이러한 충돌을 방지하기위해서 여러가지 방법을 고안해 냈다.


첫번째는 cout, cin만을 std에서 뽑아와서 언제나 사용하는 방법이다. 말로 표현하면 이해가 되지 않을 수 있으니 아래의 예시를 참고하자.


1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
using std::cout;
using std::cin;
using std::endl;
 
int main(){
    int num1;
    cin >> num1;
    cout << num1 << endl;
    return 0;
}
cs


위의 코드를 확인해보면 3 ~ 5 번 라인에서 using std::cout, std::cin 을 명시해놓았다. 이 뜻은 using 사용하겠습니다. std:: std안에 포함된 cout,cin을 이라는 뜻이다.

그러므로 코드 전체에서 우리는 충돌없이 std안의 cout, cin의 사용이 가능해진다.

참고로 endl도 <iostream>의 namespace std 안에 포함된 함수이며 개행함수라고 하며 역활은 코드의 줄바꿈을 나타낸다.


두번째는 cout, cin의 사용할때마다 std를 명시해주는 방법이다. 아래의 예시를 참고하자.


1
2
3
4
5
6
7
8
#include <iostream>
 
int main(){
    int num1;
    std::cin >> num1;
    std::cout << num1 << std::endl;
    return 0;
}
cs

 2. 실습



반응형