Egloos | Log-in
무신론자네.
무신론자네.
static의 의미에 대하여.
static 같은 단어, 다른 의미

최근에 SICP를 읽으면서 Lisp(정확히는 Scheme)의 개념들을 많은 언어에서 차용하고 있구나 하는 느낌을 많이 받고 있습니다. 특히 함수 자체를 반환값으로 줄 수 있다는 개념이 정말 재미있었어요. 70년대에 나온 책에 이런 개념을 아무렇지도 않게 말하는 것을 보니, 역시 MIT 이름이 어디 가지는 않는구나 라고 생각했습니다.

함수 자체를 반환값으로 줄 수 있다는 의미는 바로 '함수 영역 자체의 변수화'가 가능하다는 점입니다. 이 말은 뭐냐 하면, 다음과 같은 코드의 작성이 가능하다는 거죠.

float (*GetPtr1(const char opCode))(float, float){
    if(opCode == '+')
         return &Plus;
     else
         return &Minus; // 잘 못된 연산자가 전달되면 디폴트로 반환
}

// typedef를 이용한 해결 법: 두 개의 float를 인자로 받고 float를 반환하는
// 함수에 대한 포인터를 정의한다.
typedef float(*pt2Func)(float, float);

// 함수는 char를 인자로 받고 위에서 typedef로 정의된 함수 포인터를 반환한다.
// <opCode>는 어떤 함수가 반환될지를 명시한다.
pt2Func GetPtr2(const char opCode){
    if(opCode == '+')
        return &Plus;
    else
        return &Minus; // 잘 못된 연산자가 전달되면 디폴트로 반환
}


// 예제 코드 실행
void Return_A_Function_Pointer()
{
     cout << endl << "Executing 'Return_A_Function_Pointer'" << endl;

     // 함수 포인터를 정의하고 NULL로 초기화 한다.
     float (*pt2Function)(float, float) = NULL;

     //'GetPtr1' 함수로 부터 함수 포인터를 얻는다.
    pt2Function=GetPtr1('+');
     // 반환된 포인터를 이용해서 함수를 호출한다.
     cout << (*pt2Function)(2, 4) << endl;

     //'GetPtr2' 함수로 부터 함수 포인터를 얻는다.
    pt2Function=GetPtr2('-');
     // 반환된 포인터를 이용해서 함수를 호출한다.
    cout << (*pt2Function)(2, 4) << endl;
}

(함수 포인터를 설명하는 위키 페이지에서 가져왔습니다.)

보시면 pt2Func라는 함수 포인터 타입을 설정하고 매개변수에 따라 함수를 리턴하게 되어 있습니다.

C에서는 아직 함수형 프로그래밍의 개념을 많이 도입하지 않았기 때문에 함수 포인터로 '함수가 저장되어 있는 위치'를 넘기는 정도에 그쳤습니다만, C++에서는 함수형 객체(Functor)의 도입으로 '함수 자체'를 넘기는 것이 가능하게 되었습니다. Java의 경우에도 마찬가지로 static 변수를 쓰는 static 함수를 사용해서 함수 자체를 넘길 수 있는 여건을 마련했다고 볼 수 있겠습니다.

하지만 static 함수의 경우 진정한 '함수를 생성해서 다른 객체나 프로세스에 함수를 넘기는' 정도가 아니라 단순히 '전역 라이브러리' 정도의 수준이라는 한계를 가지고 있으니 Java에서 함수를 객체간의 메시지로 넘기기 위해서는 다른 기법을 써야 할 겁니다.

자세한 것은 SICP라는 책에 나와 있습니다(인사이트에서 컴퓨터 프로그램의 구조와 해석이라는 제목으로 번역 출간되어 있습니다.). 요즘 이 책을 읽으며 절차지향 프로그래밍의 개념을 상당히 많이 깨뜨리고 있는데, 나중에 한번쯤 읽어보시면 상당히 재미있다고 생각하실 겁니다.
by 파라미르 | 2008/11/20 00:25 | 트랙백 | 덧글(3)
트랙백 주소 : http://paramirr.egloos.com/tb/3986155
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented at 2008/11/20 01:46
비공개 덧글입니다.
Commented by 파라미르 at 2008/11/20 08:22
요즘 책에 너무 빠져서 그런지 동문서답 포스팅을 한 거 같네요.;; 덧글 남겨주셔서 감사합니다.
Commented at 2008/11/22 20:50
비공개 덧글입니다.

:         :

:

비공개 덧글

◀ 이전 페이지 다음 페이지 ▶

카테고리
전체
생활
마비노기
雜像
판타지

게임
모종의 프로젝트
변경 혹은 공지
미분류
이글루 파인더
이전블로그
more...
라이프로그
컴퓨터 프로그램의 구조와 해석
컴퓨터 프로그램의 구조와 해석

rss

skin by jiinny
X