프로그래밍에서, 정의 부분에서 자신을 참조하는 것에 대하여.

조회수 713회

안녕하세요.

프로그래밍 언어들의 대다수가 어떤 함수나 클래스를 정의하면서 자기자신을 참조할 수가 있는 것으로 알고 있습니다.

대표적으로 Recursive Function.

# Python3

sum = 0;

def factorial(a, n)
    if (n==1):
        return 1
    else:
        return factorial(a-1, n-1)

어떻게 factorial 함수의 정의에서 factorial 함수를 사용할 수 있는 걸까요?

실제로 물어보고 싶은건 사실 이런 코드가 있어서입니다.

// CPP 14
struct Bye : PassInfoMixin<Bye> {
 // Some codes..
}

어떻게 Bye 라는 Structure를 define 하면서, Bye라는 Structure를 사용하는 Template Class 를 상속받을 수 있는 건가요??

이런걸 프로그래밍 용어로 무엇이라고 하나요?

검색해서 찾아볼려고 해도 쉽게 찾아볼 수가 없어서 이렇게 질문을 남겨봅니다.

감사합니다.

1 답변

  • 좋아요

    3

    싫어요
    채택 취소하기

    어떻게 factorial 함수의 정의에서 factorial 함수를 사용할 수 있는 걸까요?

    각 언어는 정적 스코프, 동적 스코프와 같은 스코핑 규칙이 존재 합니다. 스코프 규칙은 식별자(변수 이름, 클래스 이름, 함수 이름 등)가 어떤 것을 지칭 하고 바인딩 될지를 결정합니다.

    이러한 규칙을 통해 어떤 영역에서 접근 가능한 식별자가 결정되고, 이 식별자들과 바인딩될객체가 결정됩니다.

    factorial 내에서 factorial을 호출 할 있는 것은 전역에 정의된 함수를 더 낮은 범위인 factorial 함수 내에서 접근할 수 있기 때문니다.

    factorial의 재귀 호출 중 an이란 이름의 변수가 충돌나지 않는 이유는 매 호출 마다 새로운 an이 생성되어 이름은 갖지만 상위 호출에서의 변수와 구분되기 때문입니다.

    어떻게 Bye 라는 Structure를 define 하면서, Bye라는 Structure를 사용하는 Template Class 를 상속받을 수 있는 건가요??

    이런걸 프로그래밍 용어로 무엇이라고 하나요?

    템플릿은 템플릿 인자가 결정되고 사용되는 시점에 인스턴스화 됩니다. 클래스 템플릿의 경우 템플릿 인자가 결정어도, 멤버 함수는 사용되기 전까지 인스턴스화 되지 않습니다.

    이러한 특성을 이용하여, 부모 클래스를 템플릿 인자를 자신으로 정하고, 특질 같은 것을 정하는 방식을 CRTP라고 합니다.

    PassInfoMixin 클래스 템플릿의 내용은 상속 과정에서 템플릿 인자로 Bye 결정되고 사용하였기에 인스턴스화가 진행되고 상속됩니다. 하지만 위에서 말씀 드렸듯이 PassInfoMixin<Bye>의 멤버 함수는 사용되는 시점에 인스턴스화 가 됩니다. 해당 멤버 함수는 대개 Bye의 정의가 완료 된 다음 줄에서 사용하게 될테니, 문제 없이 멤버 함수의 인스턴스화도 진행될 되어 문제 없이 사용 가능하게됩니다.

    예를 들면 아래과 같은 적정 다형성 구현도 CRTP의 한 예가 되겠네요.

    template<typename T>
    struct IPrinter {
        void print() { static_cast<T*>(this)->doPrint(); }
    };
    struct PrintImpl : IPrinter<PrintImpl> {
        void doPrint() { std::cout << "hello\n"; }
    };
    
    PrintImpl t;
    t.print();
    
    • 감사합니다. 후자는 이해가 충분히 되었습니다. 전자의 경우에 질문의 의도는 Factorial 함수가 정의되지 않았는데(아직) 어떻게 호출할 수 있느냐는 의미로 했던 질문이었습니다. 혹시 이것에 관한 용어가 있을까요? .ㅅ. dbwodlf3 2020.8.20 11:30

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)