자바 어떻게 컴파일 되고 어떻게 실행되는가✨

YaR Lab·2024년 7월 3일
0

TIL✨

목록 보기
111/135
post-thumbnail

24.07.03

today 😉

[컴파일 언어 vs 인터프리트 언어❓]
컴파일 언어는 컴파일 단계에서 코드전체를 해석한 다음 실행하는 언어이고 인터프리트 언어는 실행단계에서 코드를 한줄한줄 해석해서 실행하는 언어이다. JAVA는 하이브리드 언어라고 한다. 소스코드를 컴파일하여 바이트코드를 만든 뒤, 다시 JVM이 바이너리코드로 컴파일하여 인터프리터를 통해 실행하기 때문에 하이브리드 언어라고 알게 됐다.

[컴파일은 빌드에 포함인가❓]
언어별로 빌드프로세스는 다른데 JAVA에서 빌드는 소스코드부터 실행되는 전 단계로 정의하기 때문에 JAVA에서는 컴파일은 빌드에 포함된다고 생각한다.

[setter는 왜 필요한가❓]
필드를 private로 접근을 막았는데 setter를 통해 접근을 열어두면 private의 의미가 있나? 라는 생각이 항상 들었다. 하지만 setter의 역할은 필드 데이터 값에 조건(정합성)을 주기 위함 이라는 것을 알게됐다.

[스프링과 스프링부트의 차이는 무엇인가❓]

설정 및 구성

spring: 개발자가 직접 XML 또는 Java 기반의 설정 파일을 작성하여 스프링 컨테이너를 구성하고, 빈 객체를 등록하며, 빈 객체 간의 의존성을 설정해야 함
sprint boot: 자동 설정을 통해 대부분의 설정을 자동으로 처리함

의존성 관리

spring: 필요 라이브러리 개별적 추가 설정
sprint boot: 대부분 필요한 라이브러리 및 의존성 자종으로 포함 돼 있음

어플리케이션 실행

spring: 외부 서버(톰캣 등)에 배포 해야 함
sprint boot: 내장 서버 제공, JAR 파일로 패키징 가능

프로젝트 초기 설정

spring: 많은 설정 파일과 구성 작업이 필요함
sprint boot: 몇 가지 옵션만으로 프로젝트 생성 가능

1️⃣ JDK (Java Development Kit)

  • JDK는 자바 애플리케이션을 개발하기 위한 도구 모음
    [JDK 주요 구성요소]
  1. javac: 자바 컴파일러로, 자바 소스 파일(.java)을 바이트코드(.class)로 변환함
  2. java: 자바 애플리케이션을 실행하는 자바 인터프리터로, 바이트코드(.class)를 실행함
  3. JRE (Java Runtime Environment): 자바 애플리케이션을 실행하기 위한 환경으로, JVM(Java Virtual Machine)과 표준 자바 클래스 라이브러리를 포함함
  4. 기타 도구들: 디버거, 문서 생성기 등

2️⃣ JVM (Java Virtual Machine)

  • 자바 바이트코드를 실행하는 가상 머신

    [JVM 주요 구성요소]
  1. JAVA 코드를 javac 명령어를 통해 .class 라는 바이트코드 파일로 변환
  2. Classloader가 클래스 파일을 JVM 메모리에 로드함
  3. Method Cache는 이미 실행된 메서드의 바이트코드를 캐싱하여 빠르게 재사용할 수 있도록 함
  4. JIT Compiler: 바이트코드를 기계어(바이너리 코드)로 변환. JIT 컴파일러는 다음 두 가지 주요 구성 요소로 이루어짐
  • Profiler: 실행 중인 코드의 성능을 분석하여 자주 실행되는 부분을 식별함
  • Emitter: 프로파일러가 식별한 자주 실행되는 바이트코드를 네이티브 기계어로 변환함
  1. Code Cache: JIT 컴파일러가 생성한 기계어 코드를 캐싱하여, 반복 실행 시 빠르게 실행될 수 있도록 함

3️⃣ linking(at. java)

  • 링킹은 컴파일된 오브젝트 파일과 라이브러리를 결합하여 하나의 실행 파일 또는 라이브러리 파일을 생성하는 과정
  • 위의 그림에서 클래스 로더가 링킹작업을 수행함
  • 전통적인 링킹은 컴파일 후 링커가 오브젝트 파일을 결합하여 하나의 실행 파일을 생성하는 반면, 자바에서는 런타임 시에 JVM이 클래스 파일을 동적으로 로드하고 심볼을 결합한다는 것에 차이가 있음

4️⃣ 빌드 도구(feat. java)

  • 빌드를 해주는 도구
  • Ant -> Maven -> Gradle
  • 라이브러리를 자동으로 받아옴
  • 호환되는 버전을 신경써줌

Maven

  • 빌드 스크립트: pom.xml
  • Ant 빌드 스크립트 개선
  • 필요한 라이브러리 다운로드 후, 내 컴퓨터 캐시로 저장

Gradle

  • 빌드 스크립트: build.gradle
  • Ant, Maven 빌드 스크립트 개선
  • 필요한 라이브러리 다운로드 후, 내 컴퓨터 캐시로 저장

  • 빌드 캐시: 빌드 작업의 출력물을 저장하고 재사용함
  • 점진적 빌드(Incremental Build)
  • 데몬 프로세스: 백그라운드에서 실행, 점진적 빌드를 위해 실행됨

0개의 댓글