C++은 C언어 위에 객체 지향이라는 새로운 패러다임을 얹은 언어다. C로 짠 코드를 거의 그대로 쓸 수 있을 만큼 C와의 호환을 목표로 설계됐지만, 거기에 클래스와 객체 개념을 더해 더 큰 프로그램을 체계적으로 다룰 수 있게 했다.
이 글에서는 C++의 첫 프로그램과 입출력 방식(cin/cout)을 보며, C와 무엇이 같고 무엇이 달라졌는지를 짚는다.
1. C++ 개요와 첫 프로그램
#include <iostream> // 입출력 헤더
using namespace std; // std 네임스페이스 사용
int main() {
cout << "Hello, C++!" << endl;
return 0;
}
C의 #include <stdio.h>, printf 자리에 #include <iostream>, cout이 들어온 게 한눈에 보인다. main 함수 구조는 C와 같다.
네임스페이스(namespace)
이름 충돌을 막기 위해 식별자들을 담아두는 공간이다. C++ 표준 라이브러리는 모두 std라는 네임스페이스에 속해 있어, 원래는 std::cout처럼 써야 한다. using namespace std; 를 한 줄 적어두면 std::를 생략하고 cout, cin을 바로 쓸 수 있다.
C++은 객체 지향 언어지만, C와의 호환을 위해 클래스 밖의 전역 변수·함수도 허용한다. 그래서 위 예처럼 클래스 없이 C 스타일로도 작성할 수 있다(순수 객체 지향 언어와 다른 점이다).
2. 변수와 자료형
변수는 C와 마찬가지로 선언 후 사용한다(자료형 변수이름;). 자료형도 대부분 같지만, C++에서 새로 추가되거나 편해진 것들이 있다.
| 분류 | 자료형 |
|---|---|
| 정수 | int, short, long |
| 실수 | float, double |
| 문자 | char |
| 논리 | bool (true / false) |
| 문자열 | string (<string> 헤더) |
특히 눈여겨볼 것이 두 가지다.
- bool: C에는 없던 논리형이 C++엔 정식으로 있어, 참/거짓을
true/false로 명확히 표현한다. - string: C에서 문자 배열과
strcpy로 고생하던 문자열을, C++은string타입으로=복사·+연결까지 자연스럽게 다룬다.
상수는 const로 선언하며, 한 번 정한 값을 바꿀 수 없다(const double PI = 3.14;).
3. 입출력: cin과 cout
C++의 입출력은 스트림(stream)이라는 개념 위에서 연산자로 이뤄진다.
출력은 <<, 입력은 >>
- 출력: cout << 값; (삽입 연산자 <<)
- 입력: cin >> 변수; (추출 연산자 >>)
- endl 또는 '\n' 으로 줄바꿈
int iNo;
cout << "정수 입력 : ";
cin >> iNo; // 입력 (& 불필요!)
cout << "3을 더한 값 : " << iNo + 3 << endl;
C의 scanf와 비교하면 편리함이 분명하다. %d 같은 형식 지정자도, &도 필요 없다. cin >> iNo라고만 쓰면 컴파일러가 iNo의 타입(int)을 보고 알아서 정수로 읽어준다.
화살표 방향은 "데이터가 흘러가는 방향"으로 기억하면 헷갈리지 않는다. cin >> 변수는 입력에서 변수로, cout << 값은 값에서 출력으로 흐른다.
4. 수업 코드로 보는 초 변환 입출력
cin, cout, 정수 나눗셈, 나머지 연산을 함께 쓰는 초반 실습이었다.
#include <iostream>
using namespace std;
int main()
{
int iTotalSeconds;
int iHour;
int iMinute;
int iSecond;
cout << "초를 입력하세요: ";
cin >> iTotalSeconds;
iHour = iTotalSeconds / 3600;
iMinute = (iTotalSeconds % 3600) / 60;
iSecond = iTotalSeconds % 60;
cout << iHour << "시간 "
<< iMinute << "분 "
<< iSecond << "초" << endl;
return 0;
}
| 입력 초 | iHour | iMinute | iSecond |
|---|---|---|---|
| 3661 | 1 | 1 | 1 |
| 85490 | 23 | 44 | 50 |
이 예제는 C의 scanf/printf와 같은 문제를 C++의 cin/cout으로 푼 것이다. & 없이 입력하고, 여러 값을 <<로 이어 붙여 출력한다는 차이가 핵심이다.
한 걸음 더
cin >> iNo에&가 필요 없는 이유는, C++의 참조(reference) 덕분이다.>>연산자가 내부적으로 변수를 참조로 받아 직접 값을 채우도록 만들어져 있다. C에서 포인터(&)로 명시적으로 하던 일을, C++은 참조로 가려준 셈이다. 참조는 이후 함수 인자 전달에서 본격적으로 다룬다.using namespace std;는 입문 단계에선 편하지만, 큰 프로젝트에선 권장되지 않는다. std의 모든 이름을 끌어와 다른 라이브러리와 충돌할 수 있기 때문이다. 실무에서는std::cout처럼 명시하거나 필요한 것만(using std::cout;) 가져오는 방식을 선호한다.- C++의
cout은printf보다 타입 안전하다.printf("%d", 3.14)처럼 형식과 값이 안 맞아도 C는 그냥 실행해 엉뚱한 값을 내지만,cout << 3.14는 컴파일러가 타입을 보고 알맞게 출력한다. 대신 출력 서식(자릿수 맞춤 등)을 세밀히 제어하기엔printf가 더 간결한 면도 있어, 둘은 장단이 갈린다.