본문 바로가기
컴퓨터/C언어

2. 프로그램의 기본 구성

by Naught 2016. 12. 1.



2. 프로그램의 기본구성

과거에는 아래와 같은 구조로 단순히 '익숙함'을 치중해서 공부했었다.

1. 무조건 시작할 때, #include <stdio.h>라고 쓰고시작

2. int main(void) {                    } 이것은 프로그램의 기본 틀이다.

3. 중괄호 사이에 내가 원하는 프로그램 코드를 넣으면 된다.

그러나 프로그램은 함수로 시작해서 함수로 끝난다고 할 만큼 기본적인 이해를 하려면 함수라던지 여러가지의 구조들을 이해할 필요성이 있다.


(1) 함수

  어느정도 깊게 다뤄보도록 하겠다. 입력이 존재하고 그 입력을 처리하여 결과값이 나오는 구조를 함수라고 한다.

음료자판기(자동판매기)나 사다리타기 게임을 생각하면 쉽다. 내가 음료자판기에서 돈을 넣으면 기계가 인식하여 내가 음료를 선택할 수 있는 기능이 활성화가 된다. 그리고 음료의 그림 아래에 있는 버튼을 누르면 그 음료가 아래로 출력된다. 이것은 자판기가 시각적으로 무슨 음료를 누르는지 보고 빼주는 것이 아니라 각 버튼마다 열리는 곳이 달라서 내가 특정한 버튼을 투르면 약속된 장소의 통로가 열리는 것 뿐이다. 즉, 나의 입력에 따라서 각자의 기능이 활성화되고 그 기능에 따라 출력값이 형성되는 것이다.

  그런데 수학적 함수의 조건을 살펴보자. 먼저, 내가 음료버튼을 하나 누르면 그에 해당되는 값이 하나씩 나와야 한다.

예를 들어, 사이다를 눌렀는데 사이다와 환타가 같이 출력된다고 해보자. 그건 망가진 기계일 뿐이다.

간혹 버튼 하나를 눌렀는데 복합적인 결과가 나오는 것처럼 보일 수 있는데, 그것은 사실 하나의 함수가 연쇄적으로 일어나는 것이다. 예를 들어, 내가 키보드로 한글을 적으면 내가 누른다고 해보자. 

키보드를 누른다. → 입력신호 전달 → 시스템의 명령 → 그래픽카드 → 모니터 출력

이런 식으로 순차적인 기능의 전달이 연쇄적으로 일어날 뿐이라는 것이다.

  또, 함수는 모든 버튼에 의미가 있어야 한다. 버튼을 눌렀는데 아무일도 일어나지 않는 것은 함수가 아니라는 것이다.

이것도 간혹 버튼을 눌렀는데 작동하지 않는 경우가 있다. 그것은 버튼자체가 활성화되지 않은 것이지 버튼에 해당하는 값을 가지지 못하는 것과는 다르다. 예를 들어, 돈을 넣지 않고 아무리 음료수 버튼을 눌러봐야 값이 출력되지 않는 것은 당연하다. 돈을 넣는다는 '조건'에 부합하지 않기 때문이다. 즉, 이 경우에는 버튼에 해당하는 출력값이 없는 것이 아니라, 조건에 따라 버튼이 비활성화될 수 있다는 것 뿐이라는 것이다. 다시말하자면, 조건만 부합한다면 그 버튼은 값을 출력할 수 있게 되는 것이다.

  즉, 수학적으로 함수의 조건은 ① 하나의 입력에 하나의 출력값을 가진다. ② 입력값이 모두 유효해야한다.


1) 인자전달과 함수호출

  인자전달이란 예를 들어, 우리가 음료수 자판기에서 음료수 버튼을 누르는 행위자체를 의미한다. 또는, 우리가 수학에서 어떤 함수식의 x 대신 다른 숫자를 '대입'하는 경우가 있었을 것이다. 그 대입하는 행위를 의미한다. 즉, 입력을 하는 행위를 인자전달이라고 한다. 함수 호출이란 대입된 인자를 전달하면서 함수의 실행을 요구하는 행위를 말한다. 입력에 따라 다른 함수가 필요할 때가 있다. 예를 들어, 자판의 한글이나 영어는 최종결과값으로 모니터에 출력을 가지지만 경우에 따라, 방향키라던가 다른 기능키들은 다른 기능(함수)을 가지고 다른 결과를 만들어낸다. 이 때, 필요한 함수를 불러오는 것을 함수호출이라고 하는 것이다.


2) C 언어의 함수 특성

당연한 소리지만 입력과 출력이 존재하며 순차적이다. 함수의 기능을 정의하는 몸체 부분이 존재한다.


3) C에서의 함수 형태

일단 컴파일러에서 프로그래밍을 할 때, 약속된 언어와 규칙이 존재한다.

먼저 함수를 생각해보자. 함수란 어떤 기능을 하는 놈인데, 컴퓨터에서 어떤 기능을 하게 하려면 결국 기계적인 움직임을 수반해야한다는 것이다. 즉, 기계적 움직임을 정형화 하는것이 프로그래밍에서의 함수인데, 그것은 명령어체계로 하나하나 만들 수 밖에 없다. 따라서, 우리가 프로그래밍을 하기 위해서는 함수부터 하나하나 만들어야한다는 것을 의미하는데, 그것은 시간이 너무 오래걸리고 힘든다. 그래서 이미 사람들을 함수를 만들어서 표준화했다. 그렇게 만들어놓은 함수의 집합을 '표준 라이브러리'라고 한다.

따라서, 우리는 각 함수가 담겨있는 파일을 먼저 가지고 있어야 하는데 그것을 '헤더파일'이라고 한다.

그리고 우리가 컴파일러에서 프로그래밍을 할 때, 먼저 어떤 헤더파일을 쓸 것인지를 선언하고 함수를 사용해야한다.

말하자면 프로그램을 작성할 때는 헤더→함수 순으로 작성해야 한다는 것이다.

나중에 또 배우겠지만 실제 예를 들면,

#include <stdio.h>   → 헤더부분

int main(void)       → 함수부분

{

몸통부분      → 함수의 몸통

}

C++에서 이렇게 작성했다고 한다면 헤더파일 stdio.h을 포함한다(include)고 선언하고

거기의 함수를 끌어온 것이다. 조금 더 자세히 설명하자면

void라는 형태의 입력, 함수의 이름이 main이라고 명명되고, int라는 출력의 형태로 나타난다는 것이다.

(부가적으로 알려주자면 어떤 프로그램이던 메인함수를 먼저 만들어 놔야한다.)


즉, 아래와 같이 설명할 수 있다.


출력의 형태 / 함수의 이름 / 입력의 형태

                                      int             main            (void)

main(함수)의 몸체시작 {

함수의 몸체

main(함수)의 몸체 종료                 }






정리

- 함수 : 함수란 특정 기능을 가지는 역할을 하는 것이다. 입력과 출력이 존재하고, 하나의 입력에 하나의 결과를 출력해야한다. 순차적이고 연쇄적으로 함수에 대입될 수 있다.

- 표준 라이브러리 : 모든 함수를 만들려면 불편하고 오래걸리기 때문에 표준화하여 만들어 놓은 함수들의 집합이다. 사용하려면 그 헤더파일을 포함한다고 선언해야만 사용할 수 있다. 

- 헤더 : 컴파일러로 프로그래밍 할 때, 함수를 입력하기 전 단계의 부분이다. (머리부분)

- 중괄호 { } : 명령을 내리는 문장이 아니라 함수의 시작과 끝을 알리는 것으로 함수의 내용(몸통)을 표현하는 것이다.

※ 메인함수가 반드시 존재해야하고 처음에 반드시 호출하도록 약속이 되어있다.



'컴퓨터 > C언어' 카테고리의 다른 글

4. 연산과 printf 함수 (2)  (0) 2016.12.14
4. 연산과 printf 함수 (1)  (0) 2016.12.08
3. 주석  (0) 2016.12.04
1. C 언어란? (2)  (0) 2016.11.26
1. C 언어란  (0) 2016.11.24