C언어 함수(function)

지난 포스팅에 이어 C언어 함수에 대한 내용입니다.

 

C언어 마스터 가이드라고 감히 이름 붙인 만큼 내용이 만족스럽지는 않네요. 허나 시작을 했으니 죽이되던 밥이되던 끝까지는 가보려고 합니다. 이번에 마스터를 못하더라도 다음에 C언어를 마스터 할 수 있을지 모르니까요.

 

참고로 이 시리즈는 Stephen Prata의 C기초 플러스의 설명과 보통의 C언어 교재, 인터넷 자료를 바탕으로 만들고 있습니다.

 

C언어는 워낙 오래되고 원리적인 언어라 웬만한 책에서의 설명은 거의 비슷합니다. 어느 교재가 원리를 조금 더 깊이 파고드냐 차이 정도가 있는 것 같네요.

매개변수의 전달

함수에는 매개변수를 전달할 수 있습니다.

 

우선 인수와 매개변수에 대한 구분이 필요합니다.

 

인수(Argument) 또는 인자라고 하는 변수는 피호출함수에게 넘겨주는 값 입니다. 한편 매개변수(parameter)는 호출함수으로 부터 인수를 받아 복사합니다. 매개변수는 지역변수가 됩니다.

 

그러니까 main 에서 함수를 호출한다면 main 이 전달하는 인수(argument)는 main 의 지역변수이고,

 

인수를 받아 자신의 지역변수에 복사한 것이 매개변수(parameter) 입니다.

 

우리가 전역변수와 지역변수는 서로 접근할 수 없다고 했습니다. 두 변수의 값을 바꾸는 swap 함수의 예에서 매개변수로 포인터를 사용하는 것은 매개변수를 가지고 값을 바꿔도 소용이 없기 때문입니다.

 

매개변수는 함수 호출이 종료됨과 동시에 소멸합니다. 함수가 사라지면서 지역변수가 저장된 스택도 사라지기 때문이죠.

 

다소 반복된 내용을 설명했습니다만, 

 

C언어의 특징인 포인터, 메모리, 힙, 동적할당을 이해하기 위해 매우 중요한 내용입니다.

 

C언어의 포인터에 관한 부분이 컴퓨터를 전공하는 사람들을 참 힘들게 합니다.

 

사실 포인터가 어려운게 아니라

 

C가 포인터를 사용해서 low-level 저수준 하드웨어를 운영하는 것에 대한 이해도가 떨어져서 힘든 것 입니다.

 

C언어의 철학인 '프로그래머에게 맡긴다' 는 때로 시련을 안길 수 있지만

 

결국은 인간 승리의 정신이죠.

 

그렇습니다. 사고방식이 old한 type 이라는 것도 부정할 수 없죠.

 

데니스 리치에 의해 C언어가 세상에 나온 것은 1970년대 입니다.

 

C도 스스로 진보했지만 그럼에도 설계에 대한 많은 사고방식이 70년대 사고방식을 따른 다는 것은 무리가 아닐 겁니다.

 

뭐 어쨋든 우리나라에서는 점점 C언어를 배우는 사람도 줄고하는 것 같은데 IT선진국에서는 여전히 C언어를 열심히 배우고 연구하고 있습니다. 스마트폰이나 운영체제의 커널이 C언어로 쓰여졌으니 당연한 일이죠.

 

우리도 부족하지만 뒤지지 말고 C언어를 열심히 해서 운영체제도 잘 만들고 그래야 겠습니다.

 

북한도 자기들의 운영체제를 만들어 사용한다는데 한국이 더 잘해야죠.

 

요새 최대한 삽소리를 줄일려고 하는데 타성이 젖어갈 때 잡소리가 나오는 것 같습니다.


예제를 한 번 보겠습니다.

#include <stdio.h>

void show_char(char ch, int length);

int main()
{
    for (int i = 1; i <= 7; i++)
    {
        show_char('*', i);
    }
    for (int i = 7; i >= 1; i--)
    {
        show_char('+', i);
    }

    return 0;
}

void show_char(char ch, int length)
{
    for (int i = 1; i <= length; i++)
    {
        putchar(ch);
    }
    printf("\n");
}

show_char 라는 함수를 하나 만들었습니다. 

 

이 함수의 목적은 문자와 숫자를 주면 그 수만큼 문자를 출력하는 것 입니다.

 

for문을 사용하면 저렇게 삼각형 처럼 표시할 수 있습니다.

 

* 전달인자: 전달인자는 *와 숫자가 됩니다. main 함수에서 전달합니다.

 

* 매개변수: 매개변수는 char 형, int 형입니다. 전달인자를 받아서 스택 메모리에 매개변수를 저장합니다.

               매개변수는 모두 show_char의 지역변수가 됩니다.

 

[블랙박스 관점]

실상 많은 프로그래머들이 블랙박스의 관점으로 라이브러리 함수를 사용하고 있습니다.

 

이것을 라이브러리로 베포한다면 이 함수를 사용하는 프로그래머는 어떻게 사용해야 할까요?

 

전달 인자에 대한 설명이 있으면 됩니다.

 

문자를 몇개 출력한다라는 정보가 있으면 프로그래머는 문자 #을 사용할지 ^ 을 사용할지 결정할 수 있고 몇개를 출력할 것인지 결정할 수 있습니다.

 

블랙박스가 내부에서 어떻게 돌아가는지는 몰라도 됩니다. 그들의 목적을 달성하기 위해 함수를 사용하면 그만이죠.

 

사용자는 함수의 헤드(매개변수가 나와있는) 를 보고 어떻게 사용할지 결정할 수 있습니다.

 

이것은 의외로 명백하기 때문에 프로그래밍 언어의 종류가 다르더라도 통용되는 일이 많습니다.

 

예를들어 윈도우에 사각형을 그리는 함수라고 하겠습니다.

 

거의 대부분의 언어가 기본적으로 동일한 매개변수를 사용합니다.

void drawRectangle(100, 100, 300, 400);

처음 숫자 두개는 윈도우로 부터 상대위치(윈도우 내 위치), 나중 두 숫자는 너비와 높이입니다.

 

네개의 숫자만 있으면 윈도우에 사각형을 그릴 수 있습니다. 이제 색상이나 선의 두께, 채우기 등을 매개변수에 추가하면 차이가 있겠죠. 그런 것은 함수 오버로딩을 사용하면 어렵지 않습니다.

 

블랙박스 관점의 핵심은 프로그래밍의 문법도 중요하지만 설계와 문제해결이 더 중요함을 말합니다.

 

본질을 만들 수 있으면 어떤 함수라도 만들 수 있고 또 어떤 함수라도 사용할 수 있습니다.

 

원 그리기, 마름모 그리기 등 어떤 공식에 의해서 어떤 매개변수가 필요한가?

 

본질을 알면 문제는 이미 풀린것과 마찬가지입니다.

 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band