CPP의 문법은 논문 문법과 비슷하다.
CPP가 C의 문법을 빌려왔으니 C의 문법에 대해서 이야기해보자.
우선 C를 개발한 데니스 리치는 언어 학자가 아니었다. 데니스 리치는 물리학자이자 수학자였고 전형적인 공학자였다.
그렇다 보니 데니스 리치는 대학 시절 논문을 작성했던 경험을 토대로 C 언어를 개발하게 된다.
C언어에서 쓰이는 괄호(Bracket)는 (소괄호), {중괄호}, [대괄호], <홑 화살 괄호> 이렇게 4가지가 존재한다.
우리나라 국어 문법에서는 괄호를 잘 사용하지 않기 때문에 처음 C 프로그래밍을 배우는 사람에겐 익숙해지기 어렵다.
하지만 괄호의 의미만 이해해도 C언어를 공부하는 데 큰 도움이 된다.
(소괄호)
영어로는 Round Bracket(영국권) / Parentheses(미국권)으로 읽는다.
C언어를 개발한 데니스 리치가 미국인이기 때문에 Parentheses로 읽는 게 정석이지만, 구글의 검색엔진은 둘 다 동일한 소괄호로 검색해 준다. Round Bracket이 형태에 따라 직관적이라 외우기 편하다.
영문법에서 사용되는 소괄호의 기능 중 ' 부가설명 '을 위한수식 문법과 ' 빈칸 '을 그대로 가져와서 사용했다.
▼ 영문법에서 (소괄호)의 부가설명 예시
George Washington(the first president of the U.S.) gave his farewell address in 1796. |
▼ 영문법에서 (소괄호)의 빈칸 예시
My name is ( ). |
실제 CPP 코드를 이 문법으로 해석하면 어떨지 아래의 코드로 확인해보자.
▼ 실제 CPP에서 (소괄호) 해석
// (인자로 int a와 int b를 가지는) void형 함수 sum
void sum(int a, int b) {}
int main()
{
// (인자)를 가지는 함수 sum
sum(1, 2);
return 0;
}
함수 선언부에서는 영어 문장에서와 같이 (int a, int b)가 sum을 수식하고 있다.
굳이 한국어로 해석하면 문장이 길어지지만 영어를 모국어로 사용하는 프로그래머들에게는 익숙한 문법이다.
반면 Main 함수에서 실제로 함수를 사용할 때는 빈칸으로서 인자를 맞춰 넣도록 되어 있다.
{중괄호}
영어로는 Curly Bracket으로 읽는다.
우리나라 국어 문법에서는 거의 사용되지 않는 괄호고 영어권에서도 특정 형태의 글에서만 사용된다.
영문법에서 중괄호의 기능은 같은 맥락의 글/문장을 묶음 표시할 때 사용한다.
좀 더 명확하게 이해하기 위해 아래의 자료를 살펴보자.
▼ 영문법에서의 {중괄호} 예시
모두가 잘 알다시피 위의 4개의 문장은 모두 애국가의 가사다.
4개의 문장이 같은 맥락 속에 있기 때문에 중괄호(})로 묶어서 표시할 수 있다.
주로 신문의 좁은 공간에서 문단을 표시할 때 사용한다.
C에서는 같은 목적, 기능을 위해 작성된 코드를 함수라고 정의한다.
그리고 데니스 리치는 C 문법에서 함수를 명확하게 구분짓기 위해서 중괄호를 사용했다.
문제는 그 당시 컴퓨터의 성능상으로나 디자인상으로나 위의 자료처럼 코드 옆에 대문짝만하게 그리기는 곤란했다는 것이다.
그래서 지금과 중괄호 양쪽을 사용하여 코드 문단 시작과 끝을 표시하는 방법을 사용했다.
이제 다시 CPP로 돌아와서 중괄호를 해석해보자.
▼ 실제 CPP에서 {중괄호} 해석
#include <cstdio>
int main()
{ // Main 함수를 위한 코드 문단 시작
{ // a를 출력하기 위한 코드 문단 시작
int a;
a = 1;
printf("%d\n", a);
} // a를 출력하기 위한 코드 문단 종료
return 0;
} // Main 함수를 위한 코드 문단 종료
우리가 익숙하게 사용하는 Main 함수 역시 같은 목적을 위해 작성되기 때문에 중괄호로 묶여있다.
여기서 눈여겨 봐야할 점은 Main 함수 속에 또 다른 코드 문단이 있다는 것이다.
C와 CPP 문법 상 이 코드는 문제없이 컴파일되고 작동한다.
많은 사람들이 이 중괄호를 단순히 함수의 시작과 끝으로만 이해하고 넘어가는 경우가 많지만 그건 단순히 하나의 사용방법일 뿐이다.
위의 예시에서 a를 출력하기 위한 코드 문단이 끝나고 나서 다시 a에 접근하려고 하면 정의되지 않았다고 에러가 발생할 것이다.
CPP의 컴파일러는 해당 문단이 마무리 되면 그 문단에서 사용한 메모리는 삭제한다.
우리가 작성한 프로그램이 종료되고 메모리에서 정리되는 것도 컴파일러가 이 중괄호를 통해서 Main 함수의 문단이 종료되었다는 것을 확인했기 때문이다.
이것과 관련하여 재밌는 설화가 하나 있다.
데니스 리치가 한창 C를 개발할 적에 FORTRAN 언어에서는 begin과 end로 코드 단락을 나눴었다.
벨 연구소 동료들이 데니스 리치에게 코드 단락을 익숙하게 사용할 방법에 대해 문의했고 데니스 리치는 전처리기를 구현하여 줬다고 한다.
▼ FORTRAN 언어를 위한 전처리기 응용 예시
#define begin {
#define end }
[대괄호]
영어로는 Square Bracket으로 읽는다.
영문법에서 굉장히 다양한 의미로 사용되는 괄호지만 C에서는 함축 문법을 가져왔다.
함축 문법은 우리나라에서도 가끔 사용하는데 긴 문장을 요약할 때 사용한다.
▼ 영문법에서 [대괄호] 예시
He said: "Yes, [...] it is achiveable." |
이 문법은 C에 그대로 들어와서 배열의 표시법으로 사용되고 있다.
배열이 하나 이상의 자료형을 가지는 자료구조 중 하나인 만큼 문법상으로도 잘 어울린다.
▼ 실제 CPP에서 [대괄호] 예시
int main()
{
int arr[3] = {1, 2, 3};
return 0;
}
<홑화살괄호>
영어로는 Angle Bracket으로 읽는다.
영문법에서 주로 인용 부호로 사용하며, 키보드 자판의 편리를 위해서 부등호(< >)로 대신 한다.
C언어에서 표준 라이브러리를 인용할 때 사용한다.
▼ 실제 CPP에서 <홑화살괄호> 예시
#include <cstdio>
다른 코드들을 보다보면 라이브러리를 인용할 때 ""와 <> 두가지의 경우가 있는 것을 알 수 있다.
둘 다 컴파일 에러는 발생하지 않으며 결과적으로는 같은 결과물이 나온다.
차이점은 기본적으로 C 표준 라이브러리를 인용할 때 <>를 사용한다.
이렇게 구분지어둔 이유는 프로그래머가 만든 라이브러리와 표준 라이브러리를 구분지어 관리하기 위함이라고 한다.
그래서 컴파일러가 소스코드를 인용할 때 검색하는 위치가 다르다.
▼ <>과 ""은 컴파일 에러는 발생하지 않지만 임용 검색하는 시작 위치가 다르다.
CPP에서는 표준 라이브러리는 <>를 사용하여 인용하도록 표준 문법으로 지정되어있다.
▼ CPP 표준 라이브러리 인용 방법
// CPP Standard
#include <cstdio>
// Custom Library
#include "iLibrary.h"
프로그래머가 임의로 만든 코드는 ""를 사용해서 인용할 수 있다.
'<CPP> > BASIC' 카테고리의 다른 글
5. 정수 (0) | 2021.01.08 |
---|---|
4. 출력문 (0) | 2021.01.08 |
3. 주석(Comment) (0) | 2021.01.08 |
2. 문장부호 (0) | 2021.01.08 |
0. Main 함수 (0) | 2021.01.07 |
댓글