컴파일과 링크는 소스 코드를 실행 가능한 프로그램으로 변환하는 과정의 두 가지 주요 단계입니다.

  • 컴파일(Compilation): 이 과정에서는 소스 코드(일반적으로 고급 언어로 작성됨)가 중간 혹은 객체 코드(기계어로 작성됨)로 변환됩니다. 컴파일러는 소스 코드의 각 줄을 읽고, 이를 실행 가능한 코드로 변환한 후 오류가 있는지 확인합니다. 오류가 없다면 컴파일러는 이를 객체 파일로 저장합니다.
    -> 기계어(0과 1로 변환하는 것)
  • 링크(Linking): 링킹 단계에서는 이전에 컴파일된 여러 객체 파일이나 라이브러리를 모아 하나의 실행 가능한 파일, 즉 바이너리를 생성합니다. 링커는 컴파일 단계에서 생성된 여러 객체 파일들 사이에서 상호 참조를 확인하고, 모든 객체 코드와 필요한 라이브러리를 하나의 실행 가능한 파일로 결합합니다.

링킹에는 일반적으로 두 가지 유형이 있습니다:

  • 정적 링킹: 이 방법은 모든 모듈이 하나의 실행 파일에 결합되는 방식입니다. 이렇게 하면 실행 파일 크기가 커지지만, 따로 필요한 라이브러리를 찾아볼 필요가 없습니다.
  • 동적 링킹: 이 방법은 실행 파일이 필요한 라이브러리를 실행 시점에 찾아서 로드하는 방식입니다. 이렇게 하면 실행 파일 크기는 작아지지만, 필요한 라이브러리가 시스템에 설치되어 있지 않으면 실행할 수 없습니다.

단계는 각각 다른 목적을 가지고 있지만, 모두 소스 코드에서 실행 가능한 프로그램을 만들어내는 과정의 일부입니다.

 

Classpath는 Java 런타임 환경(JRE)이 사용자의 프로그램을 실행할 때, 사용자의 클래스 파일들(.class 또는 .jar)이 위치한 디렉토리를 찾을 수 있게 해주는 환경 변수입니다. 즉, Java 컴파일러와 Java 가상 머신(JVM)이 사용자의 클래스 파일들을 찾을 수 있는 경로를 제공합니다.

Java 프로그램이 실행되면 JVM은 이 Classpath에서 클래스 파일을 찾게 됩니다. Classpath는 디렉토리 이름, ZIP 파일, JAR 파일 등을 포함한 목록이며, 이들은 콜론(:) 또는 세미콜론(;)으로 구분되어 있습니다(운영 체제에 따라 다릅니다. Unix 계열에서는 콜론(:), Windows에서는 세미콜론(;)).

Classpath는 다음과 같은 방법으로 설정할 수 있습니다:

  • 커맨드라인에서 직접 지정: -cp 또는 -classpath 플래그를 사용하여 Java 컴파일러 또는 JVM에 직접 전달할 수 있습니다. 예를 들어, java -cp .;mylib.jar MyClass 처럼 사용할 수 있습니다.
  • 환경 변수로 설정: 시스템의 CLASSPATH 환경 변수를 설정하여 JVM이 참조하게 할 수 있습니다.
  • Manifest 파일에서 지정: JAR 파일을 실행할 때, JAR 파일 내의 META-INF/MANIFEST.MF 파일에서 Classpath를 지정할 수 있습니다.

클래스 경로를 제대로 설정하지 않으면, JVM 사용자의 클래스 파일을 찾지 못하고 ClassNotFoundException이나 NoClassDefFoundError 등의 오류를 발생시킬 있습니다.

 

* 아키텍쳐