ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] Forward Declaration(전방 선언)
    프로그래밍/C & C++ 2024. 7. 28. 06:05
    728x90
    반응형

    Forward Declaration(전방 선언)은 C++에서 중요한 개념으로, 클래스나 함수의 전체 정의를 제공하지 않고, 그 존재를 컴파일러에 알려주는 것입니다. 전방 선언을 사용하면 컴파일 시간과 의존성을 줄일 수 있습니다.

    Forward Declaration의 필요성

    1. 컴파일 시간 단축: 헤더 파일에 불필요한 포함을 줄여서 컴파일 시간을 줄일 수 있습니다.
    2. 순환 의존성 해결: 두 클래스가 서로를 참조할 때 순환 의존성 문제를 해결할 수 있습니다.
    3. 캡슐화 개선: 클래스 정의를 감추고, 의존성을 최소화하여 더 좋은 캡슐화를 제공합니다.

    Forward Declaration의 사용 예시

    클래스 전방 선언

    클래스 A와 클래스 B가 서로를 참조해야 하는 경우를 생각해 봅시다. 전방 선언을 사용하여 순환 의존성을 해결할 수 있습니다.

    // 파일: A.h
    #pragma once
    
    class B;  // 클래스 B의 전방 선언
    
    class A {
    public:
        B* b;
    };
    
    // 파일: B.h
    #pragma once
    
    class A;  // 클래스 A의 전방 선언
    
    class B {
    public:
        A* a;
    };

    함수 전방 선언

    함수를 다른 파일에서 정의하고 싶은 경우 전방 선언을 사용할 수 있습니다.

    // 파일: main.cpp
    #include <iostream>
    
    // 함수의 전방 선언
    void MyFunction();
    
    int main() {
        MyFunction();
        return 0;
    }
    
    // 파일: MyFunction.cpp
    #include <iostream>
    
    // 함수의 정의
    void MyFunction() {
        std::cout << "Hello, World!" << std::endl;
    }

    Forward Declaration의 제한

    1. 크기 정보 부족: 전방 선언된 클래스의 크기를 알 수 없으므로, 해당 클래스의 객체를 직접 생성하거나 크기를 사용하는 연산은 불가능합니다.
    2. 구체적인 멤버 접근 불가: 전방 선언된 클래스의 멤버 함수나 변수에 접근할 수 없습니다.
    3. 포인터와 참조만 사용 가능: 전방 선언된 클래스를 가리키는 포인터나 참조만 선언할 수 있습니다.

    Forward Declaration과 Include의 차이점

    • Forward Declaration: 클래스나 함수의 존재만을 알립니다. 이를 통해 컴파일 시간과 의존성을 줄일 수 있지만, 해당 클래스나 함수의 크기 정보나 멤버에 접근할 수 없습니다.
    • Include: 헤더 파일을 포함하여 클래스나 함수의 전체 정의를 가져옵니다. 이를 통해 해당 클래스나 함수의 모든 멤버에 접근할 수 있지만, 불필요한 포함이 많아지면 컴파일 시간이 증가할 수 있습니다.

    실습 예제

    예제 1: Forward Declaration과 Include의 비교

    // 파일: Foo.h
    #pragma once
    
    class Bar;  // Forward Declaration
    
    class Foo {
    public:
        Bar* bar;  // Forward Declaration을 통해 포인터 선언 가능
        void DoSomething(Bar* bar);
    };
    
    // 파일: Bar.h
    #pragma once
    
    class Foo;  // Forward Declaration
    
    class Bar {
    public:
        Foo* foo;  // Forward Declaration을 통해 포인터 선언 가능
        void DoSomething(Foo* foo);
    };
    
    // 파일: Foo.cpp
    #include "Foo.h"
    #include "Bar.h"  // 필요한 곳에서만 include
    
    void Foo::DoSomething(Bar* bar) {
        // Do something with bar
    }
    
    // 파일: Bar.cpp
    #include "Bar.h"
    #include "Foo.h"  // 필요한 곳에서만 include
    
    void Bar::DoSomething(Foo* foo) {
        // Do something with foo
    }

    이 예제에서는 FooBar가 서로를 참조해야 하지만, 전방 선언을 사용하여 순환 의존성을 해결하고 필요한 곳에서만 include하여 컴파일 시간을 줄였습니다.

    Forward Declaration을 잘 활용하면 코드의 모듈성을 유지하면서도 효율적인 컴파일을 할 수 있습니다.

    728x90
    반응형

    '프로그래밍 > C & C++' 카테고리의 다른 글

    [C++] SOLID 법칙  (2) 2024.10.07
    [C++] 객체지향 프로그래밍(OOP, Object-Oriented Programming)  (1) 2024.10.07
    [C++] const와 constexpr 차이  (4) 2024.07.23
    [C++] History (C++11~20)  (3) 2024.07.15
    [C++] L-Value & R-Value  (0) 2024.07.15
Designed by Tistory.