프라모델을 만들 때 부품들이 하는 다양한 역할을 프로그램에서는 함수(function)가 담당한다. 일반적으로 프로그래머는 프로그램을 작성할 때 수행할 몇 가지 주된 작업을 나누고 분리된 작업들을 전담하여 처리하는 함수를 설계한다.
main() 함수
main() 함수의 기본형은 아래와 같다.
int main()
{
//구문들
return 0;
}
1 번째 줄에 있는 in main() 이라는 부분은 함수 머리(function header)이고, 중괄호 { }로 묶여 있는 부분이 함수 몸체(function body)이다. 함수 머리는 이 함수를 프로그램의 다른 부분과 연결하는 고리 역할을 하고, 함수 몸체는 그 함수가 처리하는 동작들을 컴퓨터에게 지시하는 역할을 한다. 컴퓨터에게 내리는 지시(instruction)를 구문(statement)이라고 하는데, C++에서 모든 구문은 세미콜론(;)으로 끝나야 한다. 5 번째 줄의 return 구문은 함수를 종료와 값을 반환하는 역할을 한다.
인터페이스 역할을 하는 함수 머리
일반적으로 함수는 다른 함수에 의해 호출된다.
이때 함수 머리는 호출 함수와 피호출 함수의 인터페이스를 나타낸다. 함수 이름의 앞부분을 함수 리턴형(function return type)이라고 한다. 위 코드에서 int main()의 int 부분을 말한다. 함수 리턴형은 피호출 함수가 호출 함수로 다시 넘겨주는 정보의 데이터형을 의미한다.
함수 이름 뒤에 있는 괄호 안의 부분을 매개변수 리스트(parameter list)라고 한다. 위 코드에서 int main()의 () 부분을 말하지만 현재 빈칸이다. 호출 함수가 피호출 함수로 넘겨주는 데이터를 나타낸다. 따라서 int main()인 경우 넘겨주는 데이터인 매개변수가 없다는 의미이다. 매개변수가 없다는 의미를 명시적으로 나타내기 위해 void 키워드를 사용할 수 있다.
int main(void)
끝으로 함수 리턴형이 void가 아니라면 함수가 끝날 때까지 데이터를 반환을 해야 하는데, main()의 경우 특별하다. 5 번째 줄의 return 0;가 생략되어도 암시적 리턴을 main() 함수에만 허용한다.
이름이 반드시 main() 이어야 하는 이유
모든 C++ 프로그램에는 main() 함수가 반드시 하나 있어야 한다. Main(), MAIN(), 등 대/소문자가 틀리거나 철자가 틀리는 것도 허용하지 않는다. 모든 C++ 프로그램은 main() 함수로부터 실행한다. 프로그램에 main() 함수가 없으면 컴파일러는 main() 함수를 정의하지 않았다고 에러를 낼 것이다.
하지만 예외도 있다. 예를 들어, Windows 프로그래밍에서 동적 링크 라이브러리(DLL) 모듈을 작성할 때 그렇다. DLL 모듈은 다른 Windows 프로그램들이 사용할 수 있는 코드로서, 독립된 프로그램이 아니므로 main()이 필요하지 않을 수 있다.
C++ 주석문
C++에서 주석문은 더블슬래시(//)를 의미한다. 프로그래머가 프로그램 안에 기록해 두는 일종의 메모로, 프로그램의 구역을 구분하거나 코드의 어떤 부분이 어떤 역할을 하는지 표시하는 데 사용한다. 컴파일러는 주석문을 아예 무시하고, 주석문이 아닌 것만을 컴파일한다.
#include <iostream>
int main()
{
using namespace std;
cout << "Hello World" << endl; //Hello World 메세지를 출력한다.
return 0;
}
C++ 전처리기
C++의 일반적인 입출력 기능을 사용하려면 아래의 코드를 프로그램에 넣어야 한다.
#include <iostream> //전처리 지시자
C++은 전처리기(preprocessor)를 사용한다. 전처리기는 컴파일하기 전에 소스 파일에 미리 어떤 처리를 수행하는 프로그램이다. 특별히 따로 호출하는 것이 아니라 소스 파일을 컴파일할 때 자동으로 실행된다. 위 코드는 전처리기에게 iostream 파일의 내용을 프로그램에 추가하라고 지시한다. 컴파일되기 전에 소스 코드에 텍스트를 추가하거나 텍스트를 대체하는 것이 전처리기가 수행하는 기본적인 역할이다.
헤더 파일 이름
iostream과 같은 파일을 포함 파일, 또는 헤더 파일이라고 부른다. C++ 컴파일러는 많은 헤더 파일을 제공하는데, C에서는 헤더 파일의 이름만 보고도 파일 유형을 알 수 있도록 h 확장자를 사용했다. 하지만 최근 C++ 헤더 파일에서는 확장자를 사용하지 않기로 했다. 요약하자면 C의 헤더 파일은 확장자 h를 붙이고 C++ 헤더 파일은 확장자가 없다. C 헤더 파일이 C++ 헤더 파일로 진화한 것들도 있는데 이들은 이름의 앞부분에 c를 붙이고 확장자 h를 뺀다.
헤더 파일의 종류 | 규칙 | 보기 | 설명 |
C++ 구식 스타일 | .h로 끝남 | iostream.h | C++ 프로그램에 사용 가능 |
C 구식 스타일 | .h로 끝남 | math.h | C/C++ 모두 사용가능 |
C++ 최신 스타일 | 확장자 없음 | iostream | C++ 프로그램에 사용할 수 있고, namespace std를 사용한다. |
C 변환 스타일 | c 접두어, 확장자 없음 | cmath | C++ 프로그램에 사용할 수 있고, namespace std와 같이 C에 없는 기능은 사용할 수도 있고 못할 수도 있다. |
namespace(이름 공간)
iostream.h 대신에 iostream을 사용할 때, 프로그램이 iostream의 정의를 사용할 수 있게 하려면 다음과 같은 이름 공간 지시자를 사용해야 한다.
using namespace std;
이름 공간은 C++의 새로운 기능이다. 프로그램을 작성할 때 여러 개발업체들이 제공하는 코드들을 사용할 수 있도록 도와준다. 예를 들어, 두 업체의 제품을 사용하는데 두 제품 모두 wanda()라는 함수가 들어있다면, 컴파일러는 어느 제품의 wanda()를 사용해야 하는지 판단할 수 없다. 이와 같은 경우 이름 공간이라는 하나의 단위로 포장하여 나타낼 수 있다.
Microflop::wanda(); //Microflop 이름 공간의 버전
Piscine::wanda(); //Piscine 이름 공간의 버전
이러한 방식에 의해, C++ 컴파일러의 표준 구성 요소인 클래스, 함수, 변수는 std라는 이름 공간 안에 담겨진다. 이와 같은 일은 .h 확장자가 없는 헤더 파일들 안에서 일어난다.
std::cout << "Hello World" << std::endl;
위 코드에서 using 지시자를 사용하면 아래의 코드와 같이 타이핑을 줄일 수 있다.
using namespace std;
cout << "Hello World" << endl;
using 지시자는 std 이름 공간에 모든 이름을 사용할 수 있게 한다. 사용한다는 단어가 이상하게 느껴진다. 생략이 가능하다 라고 받아들이는 게 맞다 본다. 즉, std::cout이 아닌 cout도 사용 가능하게 한다는 의미이다.
요즘에는 이 방식을 게으른 것으로 간주하고, using 선언이라는 것을 사용하여 자신에게 필요한 이름들만 선택해서 사용할 수 있게 한다.
using std::cout; //std::를 생략한 cout을 사용할 수 있게 한다.
using std::endl; //std::를 생략한 endl을 사용할 수 있게 한다.
using namespace std; //게으른 방식, 모든 std::를 생략한다.
C++ 소스 코드의 모양
C++에서 세미콜론(;)은 구문의 끝을 의미한다. C++에서 캐리지 리턴(carriage return)(*주 1)을 빈칸이나 탭과 같은 방식으로 자유롭게 사용할 수 있다는 것을 의미한다. 다시 말해서 하나의 구문을 여러 행에 펼쳐 놓을 수도 있고, 여러 개의 구문을 한 행에 늘어놓을 수도 있다는 것을 의미한다.
int main()
{
std::cout << "Hello World" << std::endl;
return 0;
}
위 코드를 보기 흉하지만 다음과 같은 모양으로 작성하는 것이 가능하다.
int
main
()
{ std::cout
<< "Hello World"
<< std::endl
;
return
0;}
하지만 지켜야 하는 규칙이 있다. C/C++에서 이름과 같은 요소의 중간에 빈칸이나 탭, 캐리지 리턴을 넣을 순 없으며, 또한 문자열의 중간에 캐리지 리턴을 넣을 수 없다.
int ma in() //이름 안에 빈칸이 있어서 불가
{
std::cout << "Hello
World" //문자열 안에 캐리지 리턴이 있어서 불가
<< std::endl;
re
turn 0;//키워드 안에 캐리지 리턴이 있어서 불가
}
토큰과 화이트스페이스
한 행의 코드에서 더 이상 분리할 수 없는 기본 요소를 토큰(token)이라 한다. 일반적으로 하나의 토큰은 빈칸, 탭, 캐리지 리턴에 의해 분리된다. 빈칸, 탭, 캐리지 리턴을 집합적으로 화이트스페이스(white space)라고 부른다. 괄호나 콤마와 같은 일부 단일 문자들은 화이트스페이스로 분리하지 않아도 되는 토큰이다.
C++ 소스 코드 스타일
C++ 프로그램은 자유로운 스타일로 작성할 수 있다. 하지만 정형화된 스타일로 프로그램을 작성하면 가시성이 좋아 이해하기 쉽다. 대부분의 C++ 프로그래머는 다음과 같은 규칙을 따른다.
- 한 행에 하나의 구문을 사용한다.
- 함수를 여는 중괄호 {와 닫는 중괄호 }에 각각 한 행을 할애한다.
- 함수 안에 들어갈 구문들은 중괄호에서 약간 오른쪽으로 들어간 위치에서 시작한다.
- 함수 이름과 괄호 사이에는 어떠한 화이트스페이스도 넣지 않는다.
(*주 1) 캐리지 리턴(carriage return)
Carriage(운반, 수송) + Return(돌아가다)의 합성어로 문자의 새 줄을 시작하는 데 쓰이는 제어 문자나 그 구조를 가리킨다. 간단히 CR로 줄여 쓰기도 한다. C/C++에서는 /r을 사용한다.
'서적 정리 > C++ 기초 플러스' 카테고리의 다른 글
8.간단한 변수 (0) | 2022.07.22 |
---|---|
7.함수(function) (0) | 2022.07.20 |
6.C++의 기타 구문 (0) | 2022.07.20 |
5.C++ 구문 (0) | 2022.07.20 |
3.프로그램 작성 요령 (0) | 2022.07.20 |
2.이식성과 표준 (0) | 2022.07.20 |
1.C++의 탄생: 간략한 역사 (0) | 2022.07.20 |
81.클래스 설계 복습 (0) | 2022.07.19 |
댓글