> For the complete documentation index, see [llms.txt](https://byulseop-til.gitbook.io/sinheeseop_til/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://byulseop-til.gitbook.io/sinheeseop_til/c++/101/cpp_separate_compilation.md).

# SeparateCompilation

아래는 분할 컴파일의 개념을 간략하게 정리한 내용이며, Java와의 비교도 포함되어 있습니다.

***

#### C++ 분할 컴파일

* **개념:**

  소스 코드를 여러 개의 파일(예: .cpp, .h)로 나눈 후, 각 파일을 개별적으로 컴파일하여 객체 파일(.o)을 만들고, 최종적으로 링크하여 실행 파일을 생성하는 방식입니다.
* **장점:**
  * **컴파일 시간 단축:** 변경된 파일만 재컴파일 가능
  * **모듈화 및 유지보수:** 코드 분리로 관리와 협업 용이
  * **코드 재사용:** 공통 기능을 라이브러리로 분리
* **단점 및 주의점:**
  * 올바른 헤더 관리(인클루드 가드 필요)
  * 링크 단계에서 외부 참조 해결 문제
* **예시 파일 구조:**

  **utils.h**

  ```cpp
  #ifndef UTILS_H
  #define UTILS_H

  int add(int a, int b);

  #endif // UTILS_H
  ```

  **utils.cpp**

  ```cpp
  #include "utils.h"

  int add(int a, int b) {
      return a + b;
  }
  ```

  **main.cpp**

  ```cpp
  #include <iostream>
  #include "utils.h"
  using namespace std;

  int main() {
      cout << "Sum: " << add(3, 4) << endl;
      return 0;
  }
  ```
* **컴파일 및 링크 명령:**

  ```bash
  g++ -c main.cpp   // main.o 생성
  g++ -c utils.cpp  // utils.o 생성
  g++ -o myProgram main.o utils.o  // myProgram 실행 파일 생성
  ```

#### Java의 컴파일 방식과 비교

* **Java:**
  * 소스 파일(.java)을 컴파일하면 각각의 클래스 파일(.class)이 생성됩니다.
  * JVM의 클래스 로더가 .class 파일들을 로드하고 연결하여 실행하므로, 별도의 "링크" 단계가 없습니다.
  * 모든 클래스가 동일한 런타임 환경(클래스패스)에서 관리됩니다.
* **비교 포인트:**
  * **C++ 분할 컴파일:**
    * 개발자가 소스 파일을 나누고, 객체 파일과 링크 과정을 직접 관리합니다.
    * 대규모 프로젝트에서 모듈 단위로 재컴파일이 가능해 효율적입니다.
  * **Java 컴파일:**
    * 각 클래스가 독립적인 .class 파일로 생성되며, JVM이 자동으로 연결합니다.
    * 빌드 도구(Maven, Gradle 등)를 통해 관리하지만, C++처럼 명시적 링크 단계는 보이지 않습니다.

**요약:**

* **C++ 분할 컴파일**은 소스 파일을 여러 모듈로 분리하여 개별 컴파일 후 링크하는 방식으로, 컴파일 시간 단축과 모듈화에 유리합니다.
* **Java는** 각 클래스가 별도의 .class 파일로 컴파일되고, JVM이 자동으로 로드 및 연결하여 실행합니다.
* C++에서는 헤더 관리와 링크 과정이 중요하며, Java는 클래스 로더가 이를 담당한다는 점에서 차이가 있습니다.

### 본질적으로 다른 이유

분할 컴파일과 OOP(객체 지향 프로그래밍)는 모두 모듈화와 코드 관리에 기여하지만, 본질적으로는 다른 개념입니다.

* **분할 컴파일**은
  * 소스 코드를 여러 파일(모듈)로 나누어 각 파일을 개별적으로 컴파일하고, 나중에 링크하는 빌드 방식입니다.
  * 이를 통해 변경된 파일만 다시 컴파일할 수 있어 전체 빌드 시간을 줄이고, 코드 관리와 재사용에 도움을 줍니다.
* \*객체 지향 프로그래밍 (OOP)\*\*은
  * 클래스, 객체, 상속, 캡슐화, 다형성과 같은 개념을 통해 프로그램을 구조화하는 패러다임입니다.
  * 이를 통해 코드의 재사용성, 확장성, 유지보수성을 높입니다.

**비슷해 보이는 점:**

두 개념 모두 "모듈화"를 추구하여 큰 프로그램을 작고 관리하기 쉬운 단위로 나누고, 변경이 용이하도록 만든다는 공통점이 있습니다.

**차이점:**

* 분할 컴파일은 **컴파일러와 빌드 시스템** 측면의 개념이고,
* OOP는 **프로그램 설계와 구조** 측면의 패러다임입니다.

결국, 분할 컴파일은 코드의 빌드와 관리 효율성을 높이는 방법이고, OOP는 코드의 설계와 재사용성을 개선하는 방법이라고 할 수 있습니다.
