이번 포스팅 내용은 함수입니다.

 

함수의 문법적인 내용이 아니고 함수에 대한 여러가지 질문들에 대하여 각종 자료를 기반으로 고찰하는 내용입니다.

C언어 함수(function) 

사람에 따라서는 함수라는 단어 자체에 거부감이 있을지도 모르겠습니다.

 

대부분 사람들에게 함수라는 이름을 처음 들었던 건 중학 수학때 부터 였을 것 입니다.

 

y = f(x)

 

주로 이런 식으로 사용하죠. 뭐... C언어의 함수도 비슷하게 생기긴 했습니다.

result = function( int number );

하지만 당연하게도 그것과 이것은 전혀 다르다는 생각이 든다면 정상입니다.

 

C언어 마스터 가이드는 기존 문법 교과서를 재탕하려고 작성하는 포스팅이 아니라서

 

이런 것을 생각하게 되는데요.

 

본질에 대하여 생각해 볼 시간입니다.

 

C언어 함수 문법에 대해서는 아래의 문서를 참고합니다.

 

C언어 3 - 3 | 함수 기초, 재귀함수, main 함수, 함수 선언 (tistory.com)

 

C언어 3 - 3 | 함수 기초, 재귀함수, main 함수, 함수 선언

순수 C언어에는 객체가 없고 함수가 있다. C언어의 특징을 가장 잘 나타내는 것이 함수이다. 객체 지향 프로그래밍으로 넘어가면 함수가 메소드가 되지만 원리 자체는 비슷하다고 느낀다. 함수

digiconfactory.tistory.com

 

C언어 함수와 수학의 함수와의 차이점

수학과 프로그래밍의 함수가 다르다는 것은 다들 아는 사실이죠.

 

그러면 뭐가 다른가? 에 대해서는 별로 다루지 않는 것 같습니다.

 

사실 몰라도 프로그래밍을 하는데 문제는 없다고 합니다.

 

이렇게 생각하는게 골머리죠. 

 

1. 내용이 다른데 왜 이름을 같은 것을 붙여서 혼란스럽게 하는가?

 

- 둘은 다르지만 일종의 공통분모가 있기 때문입니다.

 

예를 들어 수학의 함수에도 입력하는 변수 x가 있고 출력하는 변수 y가 있습니다. x를 독립 y를 종속 변수라고 하는 등 수학도 하나의 함수를 관점에 따라 다양한 이름으로 정의하죠.

 

프로그래밍에서도 입력하는 매개변수가 있고 출력하는 반환값이 있습니다. 반환값을 받는 변수도 있고요.

마찬가지로 함수를 모듈, 프로시저, 루틴, 서브루틴 등 다양한 이름으로 부릅니다.

 

2. 비슷해 보이는데 무엇이 다른가?

 

- 본질이 다릅니다.

 

질문자체가 돌아오는 것 같지만 처음으로 돌아가봅니다.

 

컴퓨터의 연산 단위는 0과 1이라고 했습니다. 0과 1은 이산수학입니다.

 

아무리 이산수학을 해서 세밀하게 수를 나누어도 무한대의 수를 처리할 수는 없습니다.

 

컴퓨터에서 실수를 다루지만 그것은 정확도가 낮습니다.

 

현재 64비트 PC에서는 정수(long 형) 는 2의 64승까지를 사용하고

 

실수(Double 형) ±1.7E-308 and ±1.7E308 까지를 사용합니다.

 

물론 매우 큰 숫자이고 메모리가 허용하면 자료형을 더 크게 만들수는 있습니다.

 

하지만 64비트 머신에 그 이상의 숫자를 사용하는 것이 효율을 떨어뜨리죠. 원래 설계 취지에 맞지 않습니다.

 

시스템을 32비트 64비트라고 부르는 것은 가장 최적의 동작단위를 설정해둔 것입니다.

 

수학은 그럴 필요가 없죠.

 

수식은 종이에 쓰고 계산은 관념속에서 일어나는 일이니까.

 

무한대, 무한소, 실수, 허수 등을 마음대로 다룰 수 있습니다.

 

컴퓨터는 이산수학을 사용하지만 이산수학은 수학의 하나의 단위에 지나지 않습니다.

 

애초에 취급하는 영역에서 두개를 비교한다는 자체가 무의미한 일입니다.

 

3. 그럼 컴퓨터의 함수가 가진 장점이 뭐냐?

- 간단합니다. 컴퓨터의 함수는 실제 세상에 구현합니다.

 

C가 들어가는 하드웨어, 소프트웨어, 네트워크 할 것 없이 함수없이 돌아가는 것은 없습니다.

 

오늘날 쓰는 사람이 없는 것 같은데 왜 C언어가 Tiobe 에서 항상 1위하는지 내막을 보면,

 

PC나 모바일에서는 C언어로 앱을 만드는 일은 이제 줄고 있지만

 

산업현장과 가전제품, 운영체제, 자동화 시스템 등 에는 C언어가 탑재되어 있습니다.

 

리눅스에서 출발한 안드로이드나 IOS 운영체제에도 들어가 있죠.

 

일상생활에 숨어있는게 다 C언어입니다.

 

수학은 과학을 발전시키고 세상을 이롭게 하지만

 

컴퓨터 코드는 구체적으로 세상을 바꿉니다.

 

수학이 원리라면 C언어는 적용 사례지요.

 

그래서 컴퓨터공학 (Computer engineering) 이라고 합니다.

 

컴퓨터공학은 과학, 수학 등에 관한 내용을 통합하여 실세계에 적용하는 학문입니다.

 

4. 이산수학의 문제

 

- 컴퓨터 구조가 이산수학의 원리기 때문에 실수를 처리할 방법이 있어야 합니다.

 

하나의 방법은 부동소수점 방식으로 소수점에 대한 정밀도를 사용하는 것입니다.

 

현재 유효한 값의 범위와 한계가 정해집니다.

 

그 다음의 방법이 더 현실적이겠네요.

 

컴퓨터의 속도는 아주 빠릅니다. 무한의 숫자를 다룰수는 없지만 무한대로 연산을 시킬 수는 있습니다.

 

우리 인류가 살아있는 동안에 말이죠. 1초는 인간에게는 짧은 순간이지만 컴퓨터에게는 영겁의 시간입니다.

 

현재 보통의 PC의 동작속도는 기가단위입니다. 2기가 3기가는 기본이죠. 기가는 10의 9승입니다.

 

CPU의 주파수는 1초동안 컴퓨터의 심장 박동 수 이고 계산능력입니다. 이런 CPU에게 무한대로 일을 시키는 거죠.

 

슈퍼컴퓨터를 사용하면 수학적으로도 충분히 유의미한 결과를 만들 수 있습니다.

 

C언어의 함수

어느정도 수학의 함수와 C언어의 함수를 분리하는 정리를 해봤습니다.

 

뭐 또 다른 차이점이야 얼마나 많겠습니까마는 학문적인 탐구는 그 정도롤 해두죠.

 

C언어에서 함수를 쓰는 이유는 코드의 재사용성 때문입니다.

 

똑같은 일을 여러번 반복할 필요가 없죠.

 

또 똑같은 일을 위해서 메모리와 저장공간을 많이 사용하지 않아도 됩니다.

 

제어문에 대한 포스팅에서 말한 것 처럼

 

코드를 반복하는 것입니다.

 

아래의 mySwap 함수는 포인터를 사용하여 두 변수의 값을 교환합니다.

#include <stdio.h>

#define Line printf("------------------------\n")

void mySwap(int*, int*);

int main()
{
    int x1 = 10;
    int x2 = 7;

    printf("x1: %2d, x2: %2d\n", x1, x2);
    Line;
    mySwap(&x1, &x2);
    printf("x1: %2d, x2: %2d\n", x1, x2);

    return 0;
}
void mySwap(int* a, int* b)
{
    int temp = 0;

    temp = *a;
    *a = *b;
    *b = temp;
}
x1: 10, x2:  7
------------------------
x1:  7, x2: 10

mySwap 함수는 32비트 부호있는 정수형의 두개의 변수의 값을 서로 교환하는 함수입니다.

 

한번만 만들면 프로그램에서 얼마든지 사용할 수 있습니다.

 

더욱 놀라운 것은 C를 사용하는 모든 프로그램에서 이 함수를 사용할 수 있다는 것입니다.

 

모든 프로그램에서 사용할 수 있는 함수들을 모아놓은 것을 라이브러리 라고 합니다.

 

printf 는 대표적인 라이브러리입니다.

 

C에서 제공하는 다양한 기본 라이브러리들은 함수입니다.

 

블랙박스

오늘날에는 수많은 함수들이 개발되었고 라이브러리들이 오픈소스로 배포되고 있습니다.

 

그런데 이 함수들을 만드는 방법까지 다 알아야만 할까요?

 

- 정답은 아니오입니다.

 

많은 프로그래머들이 궁극적으로 함수는 블랙박스라고 생각합니다.

 

함수의 개발자가 아니라면 블랙박스 안에서 일어난 일은 몰라도 됩니다.

 

소프트웨어는 저작권의 보호를 받기 때문에 내부를 보지 못하게 하는 것이 기본이구요.

 

오픈소스라 하더라도 사용자에게 소스코드를 읽어보기를 강요할 수는 없습니다.

 

즉 함수의 사용자는 자기가 보고싶으면 보고 싫으면 안보면 됩니다.

 

사용법만 있으면 되는데 사용법은 헤더파일의 함수 원형에 나와있습니다.

 

이런 블랙박스 개념을 극대화한 것이 프레임워크입니다.

 

단순한 함수모듈만 사용하지 말고 더 고차원적인 블랙박스를 만들어 보면 어떨까?

 

소프트웨어의 생산성이 높아지지 않겠는가? 라는 질문에 답한 것 입니다.

 

프레임워크는 하나의 툴이지만 프로그래밍 언어 자체가 프레임워크 처럼 진화할 수 도 있습니다.

 

앤드류 타넨바움 교수가 말한 가상화 머신은 얼마든지 상위 n 단계로 추가할 수 있습니다.

 

상위단계로 나아가면? 소프트웨어의 개발은 더욱 편리해지겠죠.

 

하위단계로 가면? 컴퓨터의 본질에 가까워지게 됩니다.

 

사실 이 n 단계를 완전히 다듬어서 컴퓨터를 아무것도 모르는 사용자가 사용할 수 있는 프로그램도 가상화 머신입니다.

 

이 웹브라우저도 n 차원의 가상화 머신이라고 할 수 있죠.

 

그런데 n 단계의 하위 단계와 너무 동떨어져 있으니까 어플리케이션이라고 부릅니다.

 

n 단계를 알아야 할 사람들은 컴퓨터 공학자들이기 때문이죠.

 

관련된 자세한 내용은 아래의 링크을 참조하시고 다른 내용을 더 찾아 보시길 바랍니다.

 

 

추상화(Abstraction)와 가상화(Virtualization) | 컴퓨터구조 (tistory.com)

 

추상화(Abstraction)와 가상화(Virtualization) | 컴퓨터구조

추상화와 가상화는 무엇인가? 컴퓨터 공학을 제대로 이해하기 위해서 알아야 할 가장 핵심적인 용어다. 추상성을 클래스화 해버리는 객체지향 프로그래밍은 물론 현대 소프트웨어의 큰 방향성

digiconfactory.tistory.com

그래서 블랙박스를 사용하는 것의 최대 장점은 프로그램의 전체적인 설계에 집중하도록 도움을 준다는 뜻입니다.

 

예를 들어 파이썬에 플라스크라는 프레임워크가 있습니다.

 

이 프레임워크는 설치하면 1분안에 웹페이지를 만들 수 있습니다.

 

이렇게 출발이 웹페이지 부터 시작해서 아래의 모듈(게시판, 자료실 등)을 설계하는 방식입니다.

 

아마 프레임워크가 발달한 미래에는 프론트엔드의 정의가 바뀌어 있을지 모릅니다.

프론트엔드라는 단어가 등장한지 얼마 되지 않았으니 어떻게 바뀔지는 두고봐야 합니다.

 

C언어에서는 블랙박스를 만들어 볼 수 있습니다.

 

그리고 다른 언어와 다른 점은 오래된 만큼 원시적인 모습을 한다는 점이죠.

 

C의 main 함수 자체가 하나의 블랙박스입니다.

 

예전에 도스 시스템의 프로그램들은 arg 인자들을 사용해서 실행을 시켰습니다.

 

프로그램의 작동원리는 알필요가 없는 거죠. 단지 인자(매개변수)가 무엇인지만 알면됩니다.

 

CLI를 사용하는 리눅스는 지금도 그렇죠.

 

그래서 리눅스를 사용하시는 분들이 컴퓨터 자체에 대한 이해도가 높을 수 밖에 없습니다.

 

요약

함수와 수학의 차이점을 생각해 봤습니다.

 

C언어 함수에 대하여 알아봤습니다.

 

함수를 블랙박스에 비유해봤습니다.

 

다음 포스팅에도 함수에 관한 내용입니다.

 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band