이번 장에는 C++ 코드의 기본 구조와 개념을 설명합니다.
다음은 " 프로그래밍 기초 "라는 문장을 화면에 보여주는 코드이며 기본 구조를 알아보겠습니다.
※ C언어의 기본 문법 (반복문,배열 등)을 안다는 전제로 진행합니다.
/*
여러 줄의 주석문을 만들때 쓰는 기호
*/
#include <iostream>
// 한 줄만 주석문으로 만들때 쓰는 기호
int main( ) {
std::cout << "프로그래밍 기초\n"; // 화면에 프로그래밍 기초를 출력하고 다음줄로 넘어감
return 0; // main( ) 함수의 종료 기준이 됩니다.
}
주석문
프로그램의 코드에 영향을 미치지 않으며 개발자가 자유롭게 쓸 수 있는 메모장이라고 보면 됩니다. 개발자들끼리 서로 소통할 때 쓰거나 코드를 정리할 때 사용합니다.
저 같은 경우 변수 선언할 때의 용도나 후에 배울 중괄호의 범위를 표시할 때 주로 사용합니다. 총 두 가지가 있는데
1. /* 주석 내용_1처럼 여러 줄의 주석문을 만들기 위해 ' /* ' 와 ' */ '를 사용합니다.
주석 내용_2 */
2. // 주석 내용 _1처럼 한 줄만 주석무을 만들기 위해 ' // '를 사용합니다.
컴파일러는 코드를 기계어로 변환할 때 주석을 무시하기에 자유롭게 쓸 수 있습니다.
main( ) 함수
프로그램의 시작과 끝을 담당하는 함수입니다. 즉, main( ) 함수가 없으면 프로그램의 시작과 끝이 없기에 응용 프로그램에는 반드시 main( ) 함수가 있어야 합니다.
main( ) 앞에 있는 int는 함수의 리턴 타입 (정수인지 문자인지를 구분하는 것인데 변수선언 파트일 때 더 자세히 설명)을 나타내고 위의 코드를 볼 때 main()가 정수 타입 "0"을 리턴하는 순간 프로그램이 종료됩니다.
이때 정수를 반환하는 int 타입이 아닌 void(아무 리턴도 없는 타입) 타입일 경우 리턴값이 없는 데 이경우 컴파일러가 문제 삼지 않지만 프로그램의 종료기준이 모호해지기 때문에 int형을 사용하는 것을 추천합니다.
※ 그러나 C++은 개발자 편의를 위해 예외적으로 return 문을 생략해도 자동으로 0을 리턴할 수 있는 기능이 있기에 앞으로 코드 작성 시 return 0; 은 생략하겠습니다.
main( ) 함수의 리턴값은 어디로 가기에 프로그램이 종료되나요?
개발자가 따로 설정하지 않았다면 운영체제하에 응용 프로그램이 실행되므로 main( ) 함수의 리턴값은 운영체제에 보내지게 되고, 이때 0은 정상적인 종료를 그 외의 값은 에러가 발생했는 신호거나 다른 프로그래밍 동작을 하겠다는 표시로 보내집니다.
전처리기 #include <iostream>
C++ 컴파일러에게 <iostream>이라는 헤더 파일을 미리 읽게 하는 것입니다. 함수들이 헤더파일에 들어있고 그걸 참조해 꺼내 쓰는 느낌으로 많이 알고 있는데, "함수 원형" 개념처럼 미리 클래스와 객체가 선언되었다고 이해하면 좋습니다. 자세한 내용은 나중에 다룹니다.
내용 출력 ( ' cout ' 과 ' << 연산자 ')
cout (C++ 표준 출력 스트림 객체 : standard output stream object) 은 콘솔에서 데이터를 출력합니다. << 연산자 (스트림 삽입 연산자 : stream insertion operator)는 오른쪽에 있는 데이터를 왼쪽 객체에 삽입합니다.
std::cout << "프로그래밍 기초\n";
위의 코드를 해석하면 다음과 같습니다.
1. std 이름 공간에 있는 cout 스트림 객체에 "프로그래밍 기초"라는 데이터를 삽입하라
2. 삽입된 정보를 콘솔 화면에 출력하라
<< 연산자를 이용해 한 문장으로 여러 개의 데이터를 출력할 수 있습니다.
std::cout << "프로그래밍 기초\n" << "프로그래밍 기초2";
/* 위의 코드는 std::cout << "프로그래밍 기초\n";
std::cout << "프로그래밍 기초2"; 와 같습니다. */
참고로 명령어 한 줄마다 " ; " 새미콜론을 붙이는데 이는 C++언어에서 한 문장의 끝을 알려주는 중요한 기호입니다. 각 명령어가 끝날 때마다 붙이지만 전처리기(include)와 나중에 배울 정의 #define에서는 붙이지 않습니다.
다음줄로 넘어가기 (' \n ' 과 ' endl ')
화면(콘솔)의 커서를 다음 줄로 바꾸기 위해서 ' \n ' 문자를 사용합니다. 줄 바꿈이라고 해석할 수 있습니다.
\ (역슬래시)와 / (슬래시)를 구분하세요.
std::cout << "프로그래밍 기초\n" << "프로그래밍 기초2";
/* 위의 코드는 std::cout << "프로그래밍 기초\n";
std::cout << "프로그래밍 기초2"; 와 같습니다. */
위의 코드를 출력하면 결과는 다음과 같고, 마우스 커서는 " 프로그래밍 기초 2 " 라인에 있습니다.
프로그래밍 기초 |
프로그래맹 기초2 |
' \n ' 대신에 ' endl ' 조작자를 사용하기도 합니다.
std::cout << "안녕하세요" << std::endl;
// std::cout << "안녕하세요" << '\n'; 와 동일
namespace와 std::
cout와 endl앞에 std::가 붙은 것을 확인할 수 있는데, 이를 "이름 공간"이라고 합니다. 이름이 중복되는 경우가 발생해 "소속"을 정해주는 것이라고 생각하시면 됩니다.
cout나 endl 같은 것들이 중복될 일이 뭐가 있을 수 있냐라고 생각하실 텐데 여러 사람이 같이 프로젝트할 때나 다른 사람이 작성한 코드를 사용할 때 내가 만들어놓은 코드의 것과 중복으로 인한 이름 충돌이 발생할 수 있습니다.
예시를 들어보면
void a(){ void a(){
... ...
} }
void b(){ void c(){
... ...
a();
} }
// A의 코드.cpp // B의 코드.cpp
두 파일을 합쳐 컴파일을 하면 A의 코드의 b( ) 함수가 a( ) 함수를 불러올 때 B의 a( ) 함수를 불러와야 할지 A( ) 함수를 불러와야 할지 알 수 없어 충돌이 일어납니다.
때문에 이를 방지하고자 서로 다른 이름 공간 안에 선언된 이름들은 별개의 이름으로 취급하기 위해 namespace (이름공간)이라는 키워드를 사용합니다.
여기서 std::cout는 범위지정자 ::를 사용하여 다음과 같이 읽을 수 있습니다. "std라는 C++ 표준 이름 공간에 cout를 정의해 사용하라."
std:: 이름 공간에 매번 사용하기 번거로우니 모든 cout에 std::접두어를 붙인 것과 같은 개념인 using 지시어를 사용해 코드 앞에 using std::cout;를 하면 됩니다.
하지만 이러면 endl앞에는 std::를 붙여야 하므로 아예 모든 이름에 std::를 생략하기 위해서는 using namespace std; 를 선언하면 됩니다.
앞으로 <iostream> 헤더 파일 내에 선언된 클래스, 객체, 함수들을 사용할 때 std::의 이름공간을 매번 붙이기 번거로우니 using namespace std;를 사용할 것입니다.
#include <iostream>
using namespace std; // <iostream> 헤더 파일에 선언된 모든 이름은 std 공간으로 정의한다.
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 4장. #2 this 포인터와 string 클래스 (0) | 2023.12.08 |
---|---|
[C++] 4장. #1 객체 포인터와 객체 배열 (0) | 2023.12.04 |
[C++] 3장. #2 접근 지정자와 인라인 함수 (1) | 2023.12.03 |
[C++] 3장. #1 클래스와 객체 (0) | 2023.12.02 |
[C++] 2장. #2 입력 받기 (0) | 2023.11.30 |