[c++] 메서드 정의를 클래스 정의 외부에서 하는 이유

About_work·2024년 10월 27일
0

c++

목록 보기
17/17
  • 클래스 정의 내부가 아닌 외부에서 멤버 함수를 정의하는 것은 C++에서 선택할 수 있는 설계 방법으로, 다음과 같은 이유로 사용됩니다.
  • 클래스 정의 외부에서 멤버 함수를 정의하는 것은 객체지향 프로그래밍에서 더 좋은 설계 원칙에 부합하며, 유지보수, 확장성, 가독성 등의 측면에서 많은 이점을 제공합니다.
  • 물론, 클래스 정의 내부에서 멤버 함수를 정의할 수도 있지만, 외부에서 정의하는 방식은 다양한 이점과 이유가 있습니다.

요약

  • 가독성: 클래스 내부에 모든 함수를 정의하면 코드가 복잡해질 수 있기 때문에, 외부에 정의하여 가독성을 높이고 유지보수를 쉽게 합니다.
  • 모듈화: 헤더 파일과 소스 파일로 분리하여 인터페이스와 구현을 분리하고, 코드의 모듈화재사용성을 높입니다.
  • 인라인 처리 제한: 클래스 내부에 정의된 함수는 인라인 함수가 될 가능성이 높기 때문에, 큰 함수는 외부에서 정의하여 인라인 처리를 피할 수 있습니다.
  • 컴파일 시간 최적화: 클래스 구현의 수정으로 인한 불필요한 재컴파일을 방지할 수 있어 컴파일 시간을 줄입니다.
  • 명확한 인터페이스와 구현의 구분: 클래스의 사용 방법구현을 명확히 분리하여 코드의 유지보수와 확장성을 높입니다.

1. 코드의 가독성유지보수성 향상

  • 클래스의 선언부는 클래스가 제공하는 인터페이스를 정의하는 부분이며, 구현부는 그 인터페이스가 실제로 어떻게 동작하는지를 정의하는 부분
  • 클래스 내부에 모든 멤버 함수를 정의하게 되면 클래스 선언부와 구현부가 섞이게 되어 코드가 길어지고 복잡해집니다. 이로 인해 가독성이 떨어질 수 있습니다.
  • 특히 대규모 프로젝트복잡한 클래스에서는 클래스 선언부에 모든 함수의 구현을 포함하면 유지보수가 어려워질 수 있습니다.
  • 함수의 구현을 외부에서 정의함으로써 클래스 선언부는 간결하게 유지할 수 있고, 구현부는 별도로 관리하여 더 나은 코드 구조를 유지할 수 있습니다.

2. 헤더 파일소스 파일 분리 (캡슐화와 모듈화)

  • 클래스 정의를 일반적으로 헤더 파일(.h 또는 .hpp)에 작성하고, 함수 구현은 소스 파일(.cpp)에 작성합니다.
  • 이렇게 분리함으로써 모듈화가 가능해지고, 코드의 재사용성컴파일 시간도 개선됩니다.
  • 헤더 파일에는 클래스의 인터페이스만을 정의하고, 실제 구현은 소스 파일에서 하게 되면,
    • 헤더 파일을 포함하는 다른 파일들이 불필요하게 많은 코드를 가져오지 않도록 할 수 있습니다. (중요)
    • 이로 인해 컴파일 시간이 줄어들고, 필요하지 않은 내부 구현을 숨겨서 캡슐화를 강화할 수 있습니다. (중요)

3. 인라인 함수의 사용 제한

  • 클래스 정의 내부에서 정의된 멤버 함수는 자동으로 인라인 함수로 처리될 가능성이 있습니다. (중요)
    • 이는 컴파일러가 함수 호출 오버헤드를 줄이기 위해 함수의 코드를 호출 지점에 직접 삽입하는 최적화 기법입니다. (중요)
    • 인라인 함수는 코드의 크기를 증가시킬 수 있으므로, 크기가 큰 함수나 자주 호출되는 함수는 인라인 처리에 적합하지 않을 수 있습니다. (중요)
  • 클래스 외부에서 멤버 함수를 정의하면,
    • 자동 인라인 처리에서 자유로우며, 컴파일러에게 특정 함수를 인라인으로 처리할지 여부를 결정하게 할 수 있습니다. (중요)
    • 이는 코드의 크기와 성능 측면에서 더 효율적인 관리를 가능하게 합니다. (중요)

4. 헤더 파일 변경 최소화 (컴파일 의존성 감소)

  • 클래스 내부에서 모든 함수 구현을 정의하게 되면, 함수의 구현을 수정할 때마다 헤더 파일을 수정해야 합니다.
    • 이는 이 헤더 파일을 포함하는 모든 파일들을 다시 컴파일해야 함을 의미하며, 컴파일 시간이 증가하게 됩니다. (중요)
  • 반면, 클래스 정의는 헤더 파일에 두고, 함수의 구현을 소스 파일에 두면,
    • 함수의 구현만 수정될 때 헤더 파일의 변경 없이도 수정할 수 있으며,
    • 컴파일 범위를 줄일 수 있습니다.

5. 명확한 인터페이스와 구현의 구분

  • 클래스를 설계할 때, 인터페이스와 구현을 명확히 분리하는 것이 좋은 객체지향 설계 원칙 중 하나
  • 클래스 정의(헤더 파일)에는 클래스의 사용 방법만을 제공하고, 구현 파일(.cpp)에는 실제 행동의 구체적인 내용을 제공함으로써 인터페이스와 구현의 분리가 이루어짐
  • 이는 클래스를 사용하는 개발자가 내부 동작을 알 필요 없이 클래스를 사용할 수 있도록 하며, 유지보수확장을 쉽게 만듭니다.

예시 코드 비교

  1. 클래스 내부에 모든 멤버 함수 정의

    class Car {
    public:
        void start() { cout << "Car started" << endl; }
        void stop() { cout << "Car stopped" << endl; }
    };
    • 이렇게 작성하면 간단한 클래스라면 괜찮을 수 있지만, 멤버 함수의 구현이 많아질 경우 코드가 길어지고 읽기 힘들어질 수 있습니다.
  2. 클래스 선언부와 구현부 분리

    // Car.h
    class Car {
    public:
        void start();
        void stop();
    };
    
    // Car.cpp
    #include "Car.h"
    #include <iostream>
    
    void Car::start() {
        std::cout << "Car started" << std::endl;
    }
    
    void Car::stop() {
        std::cout << "Car stopped" << std::endl;
    }
    • 이렇게 분리함으로써 헤더 파일(Car.h)에는 클래스의 인터페이스만 정의되고, 구현 파일(Car.cpp)에는 구체적인 구현이 정의됩니다.
    • 이를 통해 가독성이 좋아지고, 클래스의 사용과 구현을 명확히 분리할 수 있습니다.
profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글