자바를 공부하다 보면 컴파일, 컴파일에러, 런타임 같은 단어를 많이 듣게 될 것입니다.
정적 바인딩과 동적 바인딩에 대해 공부하던 중 컴파일과 런타임을 알아야 이해가 되는 것들이 많아서 먼저 간단하게 이해하고 넘어가려 합니다.
이번 문서에서는 자바의 컴파일과 실행 과정을 알아보겠습니다.
우리가 열심히 java로 간단한 서비스 코드를 작성했습니다.
이후 이 소스코드를 실행시킨다고 생각해보죠, 우리의 코드는 어떤 과정에 의해 실행되는 걸까요?
우리의 소중한 소스 코드는 먼저 컴파일(compile) 되어야 합니다.
컴파일 (compile)
우리가 작성한 자바 코드는 .java
확장자로 저장됩니다.
이 자바 파일을 실행(Run)시키면 자바 컴파일러(javac
)에 의해 자바 바이트코드로 작성된 .class
파일로 변환됩니다.
이렇게 .java 파일을 JVM이 읽기 쉬운 바이트코드로 변환하는 과정을 컴파일이라고 하며, 컴파일타임은 소스 코드가 컴파일러에 의해 컴파일되는 시간을 의미합니다.
이때 발생하는 오류를 컴파일에러라고 합니다. 일반적으로 구문(syntax)오류, 라이브러리 오류, 클래스 경로 오류 등이 있습니다. 컴파일에러가 발생한 경우 소스 코드를 컴파일할 수 없게 되고, 어느 부분에서 오류가 발생했는지 알려줍니다.
컴파일된 이후에는 .class
파일이 JVM
위에서 실행되어야 합니다.
런타임 (runtime)
자바 런타임은 자바 프로그램이 실행되는 과정을 말합니다.
컴파일된 .class
파일은 클래스로더에 의해 JVM의 런타임 데이터 영역에 로드되고, 실행 엔진이 바이트코드 들을 명령어 단위로 실행됩니다.
이렇게 프로그램이 실행되면서 발생하는 오류를 런타임 에러라고 합니다. 무시무시한 널포인터에러가 런타임 에러에 포함되며, 프로그래머가 역추적해서 오류 원인을 확인해야 합니다.
클래스로더(Class Loader)
클래스 로더는 .class
파일을 읽고, 그 내용에 따라 적절한 바이너리 데이터를 생성하고 메소드 영역에 저장합니다. 이때 저장되는 데이터는 FQCN
(Fully Qualified Class Name), Class
, Interface
, Enum
, static
으로 선언된 변수와 메소드 입니다. 그리고 이러한 과정을 로딩
이라 합니다.
이후 JVM 학습 시 런타임과, 클래스로더, 로딩에 대해 더 자세하게 다뤄보려 합니다.
'JAVA' 카테고리의 다른 글
[JAVA] Object (0) | 2023.04.03 |
---|---|
[JAVA] 정적(Static) 바인딩 vs 동적(Dynamic) 바인딩 (0) | 2023.03.27 |
[JAVA] 코드의 배포와 재사용 (0) | 2023.03.24 |
[JAVA] 객체지향은 왜 생겼고 캡슐화는 뭘까? (0) | 2023.03.24 |
[JAVA] Runtime Constant Pool? 자바는 상수와 문자열을 어떻게 변수에 저장할까 (0) | 2023.03.24 |