본문 바로가기

C 프로그램의 기본 구조

1. C 프로그램은 함수로 이루어진다.


1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main()
{
    printf("Hello, world!\n");
 
    return 0;
}
cs

 

1장에서 위와 같은 프로그램을 작성했다.

 

가장 기본적인 프로그램이지만, 우리에게 많은 것을 시사한다.

 

첫 번째 행부터 보자.

 

1
#include <stdio.h>
cs

 

대략적인 의미는 다음과 같다.

 

stdio.h 파일의 내용을 현재 소스 코드 파일에 포함시킨다.

 

#include현재 소스 코드에 무언가를 포함시킨다(include)는 의미다.

 stdio.h 는 파일의 일종이다.

따라서 다음과 같이 이해하고 넘어가면 된다.

 

모니터에 Hello, world!를 출력하려면 stdio.h 파일의 내용이 필요하다.

 

 

두 번째 행은 가독성을 위한 줄바꿈일 뿐이니 넘어가고, 이제 세 번째 행을 볼 차례인데

그 전에 함수(function)에 대한 이해가 필요하다.

 

C언어를 공부하다 보면 다음과 같은 말을 듣게 될 것이다.

 

C언어는 함수로 시작해서 함수로 끝난다.

 

C 프로그램을 만든다는 것은, 함수를 만들고, 그들의 실행 순서를 명시하는 것이다.

다시 말해, C 프로그램의 기본 단위는 함수라는 것이다.

 

그렇다면 함수는 무엇이고, 함수의 실행이 의미하는 것은 무엇일까?

 

y = 2x + 3

 

 

그럼 다음과 같은 관계를 알 수 있다.

 

x에 1을 넣으면 y는 5.

x에 2를 넣으면 y는 7.

x에 3을 넣으면 y는 9.

...

 

본래 함수는 위와 같이 한 변수에 대해 다른 변수가 대응되는 관계를 말한다.

바꿔 말하면 'x에 어떤 값을 넣으면 y가 얻어진다'고 할 수 있다.

그러니까 앞의 관계는 다음과 같다.

 

1을 입력하면 5가 얻어지고,

2을 입력하면 7가 얻어지고,

3을 입력하면 9가 얻어지고,

...

 

따라서 C언어에서 함수는 "적절한 입력에 따른 출력이 존재하는 것"이라고 할 수 있다.

 

 

2. 함수의 구조

 

1장에서 작성한 소스 코드는 다음과 같다.

 

1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main() 
{
    printf("Hello, world!");
 
    return 0;
}
cs


 

C언어는 기본적으로 main이라는 함수를 실행하는 것으로 프로그램을 시작한다.

따라서 모든 C 프로그램은 main 함수가 정의되어 있어야 한다.

 

위 예제에서 main 함수의 정의 부분만 보면 다음과 같다.

 

1
2
3
4
5
6
int main() 
{
    
 
 
}
cs

 

4가지 부분으로 나누어 보면 다음과 같다.

int: 출력 형태. 이를 반환형(return type)이라 한다. 일반적으로 '출력 형태'라는 말보다는

     '반환형'이라는 말을 사용한다.

main: 함수의 이름.

(): 입력 형태. 위 예제와 같이 아무것도 없는 것은 입력이 없음을 의미한다.

{}: 함수의 몸체(body).

 

따라서 main 함수를 다음과 같이 정리할 수 있다.

 

int의 형태로 출력하며 입력을 받지 않고, 이름이 main인 함수

 

함수의 기능은 함수에 몸체에 정의된다.

 

앞에서 본 함수  y = 2x + 3 의 경우 입력값에 2를 곱하고 3을 더한 값을 출력하는 기능을 하는 것이다.

 

결국 예제의 함수 main()은 모니터에 Hello, world!를 출력하고 0을 반환하는 기능을 한다고 할 수 있다.

 

 

3. 함수와 관련된 용어

 

딱히 어려운 용어도 아니고, 말 그대로 용어일 뿐이니, 그냥 그런가보다 하면 된다.

 

함수를 정의한다: 함수의 반환형,

함수의 정의: 만들어진 함수, 다시 말해 실행할 수 있는 함수.

함수를 호출한다: 함수의 몸체에 명시된 기능을 실행하도록 명령을 내린다.

*인자를 전달한다: 함수를 호출할 때 전달하는 입력값.

 

 

*인자: 매개변수라고도 한다.

 

 

 

4. 함수 내의 문장은 세미콜론으로 끝을 표시한다.

 

예제의 함수를 다시 보면, 문장 끝에  ; 이 붙어있음을 알 수 있다.

 

1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main() 
{
    printf("Hello, world!\n");
 
    return 0;
}
cs

 

 

C언어에서는 이처럼 문장이 끝났음을 표시하기 위해 문장 끝에 세미콜론을 붙인다.

세미콜론이 붙는 문장이 있고 그렇지 않은 문장이 있는데, 이는 여러 가지 예제를 접하고 코딩을 하다 보면 구별할 수 있게 된다.

 

 

 

5. main 함수의 첫 번째 문장: printf 함수

 

 

1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main() 
{
    printf("Hello, world!\n");
 
    return 0;
}
cs

 

 

 printf 는 전달받은 인자를 모니터에 출력하는 기능을 한다.

 

위 예제에서는  printf  함수가 "Hello, world!\n"라는 인자를 모니터에 출력하는 것이다.

(\n은 개행(改行, 줄바꿈)을 나타내는 특수 문자다.)

 

그런데 우리는  printf  함수를 만들지 않았다. 그런데도 모니터에는 주어진 인자가 정상적으로

출력된다. 어떻게 된 일일까?


1. C 프로그램은 함수로 이루어진다.에서 #include <stdio.h>의 의미를 다음과 같이

(대략적으로) 정의했다.

 

stdio.h 파일의 내용을 현재 소스 코드 파일에 포함시킨다

 

감이 오는가?

 

 printf  함수는 기본적으로 제공되어 사용자가 직접 만들지 않아도 실행할 수 있는 함수다.

이러한 함수를 표준 함수(standard function)라 한다.

그리고 이런 함수들이 정의된 문서를 표준 라이브러리(standard library)라 한다.

 

위 예제의 경우  stdio.h 라는 표준 라이브러리에  printf 라는 표준 함수가 정의된 것이다.

 

따라서 우리는  stdio.h 라는 표준 라이브러리의 내용을 가져오면

 printf 라는 표준 함수를 사용할 수 있는 것이다.

 

이것이 #include <stdio.h>의 의미다.

 

 

 

6. main 함수의 두 번째 문장: return 0;

 
이제 main 함수의 마지막에 있는 다음 문장에 대해 알아보자.
 
 return 0; 
 
이런 문장을 return 문이라 하며, 이 문장의 의미는 다음과 같다.
 
① 이 함수를 호출한 곳으로 0을 전달한다. (=0을 반환한다.)
② 함수를 종료한다.
 
따라서 앞의 예제의  return 0;은 main 함수를 호출한 곳으로 0을 전달한 후 종료하라는 
의미다.
 
그런데 main 함수를 종료한다는 것은 곧 프로그램의 종료를 의미하므로,
결국 프로그램이 종료된다.
 
그렇다면 0은 어디로 전달되는 것일까?
바로 OS(Operating System, 운영체제)다.
 
참고로   return 1; 이라 쓰면 0이 아닌 1도 전달할 수 있다.
0을 전달하는 것은, OS에게 이 프로그램이 정상적으로 종료되었다고 알리기 위함이다.
 
이것까진 몰라도 되고, return 문의 의미만 대강 알아두자.
 
 
 
7. 주석
 
About C Language에서 C언어는 고급 언어라고 했다.
즉, 사람이 알아듣기 쉽다는 건데, 그래도 내용을 분석하려면 시간이 필요하다.
 
필자의 경우 다른 사람의 코드를 이해하는 데에 (간단한 것일 지라도) 많은 시간이 필요하다.
그러나 이는 다른 사람의 코드를 분석할 때만의 이야기는 아니다.
믿기지 않겠지만 자신의 코드를 분석하는 데에도 상당한 시간이 필요한 경우도 생긴다.
 
이런 경우를 최소화하기 위해 주석이 필요하다.
이런 이유로, 주석은 사실상 반드시 필요한 요소다.
 
주석(comment)은 컴파일러가 코드로 인식하지 않는 문장이다.
 
그러니까 그냥  printf("Hello, world!"); 라고 쓰면 모니터에 
Hello, world!가 출력되지만,
주석으로  printf("Hello, world!"); 를 쓰면 출력되지 않는다는 얘기다.
 
주석을 작성하는 법에는 다음의 두 가지가 있다.
 
블록 단위 주석
② 행 단위 주석
 
블록 단위 주석은 주석 영역의 시작과 끝을 명시함으로써 주석을 나타낸다.
시작은  /* 로, 끝은  */ 로 나타내며, 하나 이상의 줄을 주석 처리할 수 있다.
 
예를 들면 다음과 같다.
 
/* -------------------------------------- 이 부분은 주석 --------------------------------------- */
 
/*
주석 1
주석 2
주석 3
*/
 
 
행 단위 주석은  //  로 표시한다.  // 의 뒤에 있는 부분만 주석으로 처리한다.
 
예를 들면 다음과 같다.
 
//주석 1
//주석 2
printf("Hello, world!\n"); //여기부터만 주석
 
위의 예제에 주석을 추가하면 다음과 같다.
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*
    작성 날짜: 2019.02.24
    작성자: T0pli
    기능: 모니터로 문자열 출력
*/
#include <stdio.h>
 
int main() 
{
    printf("Hello, world!\n"); //Hello world! 출력
 
    return 0;
}
 
 
cs
 
회색으로 표시된 부분만 주석이다.
 
참고로 다음과 같은 형태의 주석은 사용할 수 없다.
 
1 /*
2     주석 1
3
4     /*
5         주석 2
6     */
7
8     주석 3
9 */
 
블록 단위 주석은 중첩될 수 없다.
 
1행의  /* 를 시작으로 해석하는 것까진 좋았으나, 6행의  */ 을 끝으로 해석하는 바람에
9행의  */ 은 시작 없는 끝이 되어버리는 것이다.
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
    작성 날짜: 2019.02.24
    작성자: T0pli
    기능: 모니터로 문자열 출력
 
    /*
        블록 단위 주석은 중첩할 수 없다.
    */
*/
#include <stdio.h>
 
int main() 
{
    printf("Hello, world!\n"); //Hello world! 출력
 
    return 0;
}
 
 
cs
 
주석은 회색으로 표시되는데, 8행의  */ 은 주석으로 해석되지 않아 분홍색으로 표시되고 있다.
 
하지만 다음과 같은 형태는 사용할 수 있다.
 
1 /*
2     주석 1
3   
4     //주석 2
5
6     주석 3
7 */
 
블록 단위 주석 안에 블록 단위 주석은 사용할 수 없지만, 행 단위 주석은 사용할 수 있다.
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
    작성 날짜: 2019.02.24
    작성자: T0pli
    기능: 모니터로 문자열 출력
 
    
    //행 단위 주석은 중첩할 수 있다.
    
*/
#include <stdio.h>
 
int main() 
{
    printf("Hello, world!\n"); //Hello world! 출력
 
    return 0;
}
 
 
cs
 
모두 회색으로 표시되는 것을 확인할 수 있다.

 

'Programming > C' 카테고리의 다른 글

입력과 출력  (0) 2019.03.02
연산자  (0) 2019.03.01
변수와 자료형  (0) 2019.02.26
Visual Studio 2017 설치  (0) 2019.02.24
About C Language  (0) 2019.02.22