-
[C++] Forward Declaration(전방 선언)프로그래밍/C & C++ 2024. 7. 28. 06:05728x90반응형
Forward Declaration(전방 선언)은 C++에서 중요한 개념으로, 클래스나 함수의 전체 정의를 제공하지 않고, 그 존재를 컴파일러에 알려주는 것입니다. 전방 선언을 사용하면 컴파일 시간과 의존성을 줄일 수 있습니다.
Forward Declaration의 필요성
- 컴파일 시간 단축: 헤더 파일에 불필요한 포함을 줄여서 컴파일 시간을 줄일 수 있습니다.
- 순환 의존성 해결: 두 클래스가 서로를 참조할 때 순환 의존성 문제를 해결할 수 있습니다.
- 캡슐화 개선: 클래스 정의를 감추고, 의존성을 최소화하여 더 좋은 캡슐화를 제공합니다.
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의 제한
- 크기 정보 부족: 전방 선언된 클래스의 크기를 알 수 없으므로, 해당 클래스의 객체를 직접 생성하거나 크기를 사용하는 연산은 불가능합니다.
- 구체적인 멤버 접근 불가: 전방 선언된 클래스의 멤버 함수나 변수에 접근할 수 없습니다.
- 포인터와 참조만 사용 가능: 전방 선언된 클래스를 가리키는 포인터나 참조만 선언할 수 있습니다.
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 }이 예제에서는
Foo와Bar가 서로를 참조해야 하지만, 전방 선언을 사용하여 순환 의존성을 해결하고 필요한 곳에서만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