Daily Dev Q&A: 자바는 컴파일 언어? 인터프린터 언어?

2025. 11. 28. 17:41·Archive/Daily Dev Q&A

Topic (오늘의 주제)

자바(Java)의 실행 방식과 언어적 특성: 하이브리드 언어 (Hybrid Language)


Why (왜 사용하는가? 왜 중요한가?)

이 개념이 실무, 설계, 면접에서 중요한 이유를 정리합니다.

  • 실무: 컴파일 타임(Compile-time) 오류와 런타임(Runtime) 오류를 구분하여 디버깅 전략을 수립하기 위해 필수적입니다. (컴파일러가 잡아주는 에러인지, 실행 중에 터지는 에러인지 구분)
  • 구조적 의미: 자바의 핵심 철학인 **WORA(Write Once, Run Anywhere)**를 가능게 하는 구조이며, JIT 컴파일러를 통해 실행 속도를 최적화하는 원리입니다.
  • 면접 의도: 단순한 암기가 아니라, JVM의 동작 원리와 OS 독립성을 이해하고 있는지, 그리고 프로그램이 메모리에 로드되어 실행되는 전체 흐름을 아는지 확인하기 위함입니다.

Core Concept (핵심 개념 정리)

자바는 **컴파일 언어의 특징(바이트코드 생성)**과 **인터프리터 언어의 특징(JVM 실행)**을 모두 가진 하이브리드 언어입니다.

요소 내용
개념 정의 소스 코드를 바이트코드로 컴파일한 후, 가상 머신(JVM)이 이를 인터프리팅(해석)하여 실행하는 언어.
동작 방식 1. 작성: .java 소스 코드 작성

2. 컴파일: javac가 .class(바이트코드)로 변환 (문법 검사)

3. 실행: JVM의 Class Loader가 바이트코드를 로드

4. 해석: Execution Engine(인터프리터 + JIT)이 기계어로 번역하여 실행
장점/단점 장점: OS에 독립적(이식성 높음), JIT를 통한 성능 최적화 가능.

단점: C/C++ 같은 네이티브 언어보다 초기 실행 속도가 느릴 수 있음(JVM 구동 비용).
필요 조건 실행하려는 환경(OS)에 맞는 **JVM(JRE)**이 반드시 설치되어 있어야 함.
비교 C/C++: 소스가 바로 기계어로 컴파일됨 (속도 빠름, OS 종속적)

Python/JS: 소스를 실행 시점에 한 줄씩 해석 (개발 편리, 속도 상대적으로 느림)

Interview Answer Version (면접 답변식 요약)

"자바는 컴파일 언어와 인터프리터 언어의 특징을 모두 가진 하이브리드 언어입니다.

개발자가 작성한 소스 코드를 컴파일러(javac)가 바이트코드로 변환한다는 점에서는 컴파일 언어의 특성을 가지며, 이 덕분에 문법 오류를 미리 발견할 수 있습니다.

하지만 실행 시에는 이 바이트코드를 JVM이 운영체제에 맞춰 한 줄씩 해석하고 실행한다는 점에서 인터프리터 언어의 특성을 가집니다. 특히 성능 저하를 막기 위해 실행 중 자주 사용되는 코드는 JIT 컴파일러가 기계어로 변환하여 캐싱함으로써 실행 속도를 최적화합니다."


Practical Tip (사용 시 주의할 점 & 활용 예)

실무에서 이 개념을 이해하고 있을 때의 차이점입니다.

1. 에러 로그 해석의 차이 (Build vs Run)

  • 컴파일 에러: javac 단계에서 발생. 오타, 타입 불일치 등 문법적 오류. IDE(인텔리제이 등)에서 빨간 줄로 미리 알려줍니다. (배포 전 수정 가능)
  • 런타임 에러: JVM이 인터프리팅하는 도중 발생. NullPointerException, IndexOutOfBoundsException 등. 실제 사용자가 프로그램을 쓰다가 멈추는 심각한 상황입니다.
  • Tip: "이게 컴파일 때 잡히는 건가요?"라는 질문을 스스로 던져보세요. Checked Exception은 컴파일러가 강제하고, Unchecked Exception은 런타임에 맡깁니다.

2. "Warm-up" (웜업) 개념의 이해

  • 자바 애플리케이션은 막 실행했을 때보다, 일정 시간이 지난 후 속도가 더 빨라집니다.
  • 이유: 초반에는 인터프리터가 한 줄씩 해석하다가, 반복되는 코드가 발견되면 JIT 컴파일러가 개입해 최적화된 기계어로 바꾸는 시간이 필요하기 때문입니다.
  • 적용: 성능 테스트(BMT)를 할 때, 서버를 켜자마자 부하를 주는 것이 아니라 충분히 웜업(Warm-up)을 시킨 후 측정해야 정확한 성능을 알 수 있습니다.

예상 꼬리질문 정리

이 주제로 면접이 진행될 경우, 면접관이 추가로 물어볼 수 있는 질문들입니다.

  1. Q: JIT(Just-In-Time) 컴파일러가 정확히 무엇이고 어떻게 동작하나요?
    • Key Point: 인터프리터의 느린 속도를 보완하기 위해 자주 실행되는 코드(Hot Spot)를 식별해 네이티브 코드로 변환하고 캐싱하는 기술임을 설명.
  2. Q: 바이트코드(Bytecode)란 무엇이며, 왜 기계어가 아닌 바이트코드를 쓰나요?
    • Key Point: 가상 머신이 이해하는 중간 언어, OS 독립성(WORA) 확보가 목적임을 설명.
  3. Q: JDK, JRE, JVM의 차이는 무엇인가요?
    • Key Point: 포함 관계 설명 (JDK > JRE > JVM). 개발 도구(javac 등) 유무와 실행 환경의 차이를 언급.

'Archive > Daily Dev Q&A' 카테고리의 다른 글

Daily Dev Q&A: 객체지향언어란? & 왜 JAVA가 객체지향언어인가?  (0) 2025.12.01
Daily Dev Q&A: 자바의 예외 처리(Exception) 구조  (0) 2025.11.28
Daily Dev Q&A: 자바의 메모리 구조  (0) 2025.11.26
Daily Dev Q&A: 자바의 Garbage Collection  (0) 2025.11.25
Daily Dev Q&A: JVM  (0) 2025.11.24
'Archive/Daily Dev Q&A' 카테고리의 다른 글
  • Daily Dev Q&A: 객체지향언어란? & 왜 JAVA가 객체지향언어인가?
  • Daily Dev Q&A: 자바의 예외 처리(Exception) 구조
  • Daily Dev Q&A: 자바의 메모리 구조
  • Daily Dev Q&A: 자바의 Garbage Collection
tlsgkstj
tlsgkstj
짱구의 성장 일기
  • tlsgkstj
    코딩하는 짱구
    tlsgkstj
  • 전체
    오늘
    어제
    • 분류 전체보기 (159)
      • About (1)
      • Projects (35)
        • Personal Projects (21)
        • Team Projects (14)
      • Engineering (20)
        • CS & Tools (0)
        • Backend Core (15)
        • Frontend (1)
        • Infra & Cloud (2)
        • AI & Tools (1)
      • Trouble Shooting & Issues (0)
      • Growth & Career (38)
        • Interview Prep (0)
        • Retrospectives (38)
      • Archive (65)
        • TIL (8)
        • Daily Dev Q&A (56)
  • 블로그 메뉴

    • 홈
    • About
    • Projects
    • Tech Stack
    • Dev Log
    • GitHub
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    spring
    network
    커리어리셋
    프로덕트개발자
    경기기후바이브코딩
    DevFestIncheon2025
    java
    프로젝트회고
    데브페스트
    OrphanRemova
    SpringBoot
    aws_s3
    REACT
    devlog
    Spring비교
    jpa
    클로드코드
    backend
    Project_Review
    til
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
tlsgkstj
Daily Dev Q&A: 자바는 컴파일 언어? 인터프린터 언어?
상단으로

티스토리툴바