상세 컨텐츠

본문 제목

전방 선언 Forward Declaration

컴퓨터 언어/C++

by cepiloth 2020. 9. 25. 15:36

본문

728x90
반응형

전방 선언

 큰 프로젝트를 컴파일하는 데 걸리는 시간은 #include를 얼마나 많이 그리고 얼마나 깊은 수준으로 사용하고 있느냐에 따라 달라진다. 일반적으로는 빌드 시간을 줄이기 위해 헤더 파일에 있는 #include 구문을 줄이기 위해 노력한다. 이를 위해 보통 다음의 방법들을 사용한다.

1. 거대한 헤더 포함 집합체의 헤더 파일 제거
2. 중복 헤더포함 제거
3. 전방 선언

 이 중에서 이번 문서에서는 전방 선언에 관련된 내용만 다룰 것이며, 전방 선언은 헤더 포함 의존성을 최소화하기 위해 사용한다는 것을 기억해 두길 바란다.

아래와 같은 class Archer 가 있다고 하자.

// Archer.h
 
class Archer
{
   // ...
};

 

전방 선언을 사용하지 않은 코드는 아래와 같이 될 것이다.

// RangeAttack.h
#include "Archer.h"

class RangeAttack
{
public:
    // 포인터 형식으로 Archer 이름만 참조
    RangeAttack(const Archer* archer); 
    // 참조 형식으로 Archer 이름만 참조
    RangeAttack(const Archer& archer);
}

 

전방 선언으로 변경해보자.

class Archer; // 전방선언

class RangeAttack
{
public:
    // 포인터 형식으로 Archer 이름만 참조
    RangeAttack(const Archer* archer); 
    // 참조 형식으로 Archer 이름만 참조
    RangeAttack(const Archer& archer);
}
// 매개변수나 리턴 타입을 위한 이름만 참조할 경우
// 이 경우 컴파일러가 Archer 클래스의 크기를 알아야 한다고 생각할 수 있지만,
// 사실 메써드를 구현하는 코드와 그 메써드를 호출하는 코드에서만 클래스의 크기를 요구한다.


class Archer; // 전방선언

class RangeAttack
{
public:
    void SetArcher(Archer archer);
    Archer GetArcher() const;
}


 RangeAttack.h 파일은 클래스나 함수, 구조체, 열거형 또는 RangeAttack.h 파일에서 사용하는 다른 엔티티(클래스 등)를 저장하기 위해 또 다른 헤더 Archer.h를 포함하였다. 이 경우 C.h에서 RangeAttack.h의 특정 클래스 하나(ex. class Archer)의 이름만 필요로 할 경우에는 class Archer에 대한 전방 선언만으로도 Archer.h를 포함하지 않을 수 있다.

이렇게 할 경우 RangeAttack.h와 C.h의 헤더 포함 의존성을 회피할 수 있고, RangeAttack.h의 수많은 다른 엔티티에 대한 정보가 C.h에 노출되지 않게 된다.

728x90
반응형

'컴퓨터 언어 > C++' 카테고리의 다른 글

template method 기본 인자에 대한 형식 연역  (0) 2021.04.29
template method  (0) 2021.04.29
타입추론  (0) 2020.06.22
Const 레퍼런스 전달 방식  (0) 2020.06.22
스마트포인터  (0) 2020.06.22

관련글 더보기

댓글 영역