본문 바로가기
💻 개발/Java

자바 기본과 객체 지향 (1) - 자바의 특징과 프로그램 실행 과정

by 컴쏘 2024. 10. 31.

자바는 대표적인 객체 지향적 프로그래밍 언어이다. 이러한 자바의 자바의 기본과 객체 지향에 대해 알아보자.

Java의 특징

Java의 특징은 7가지 이다.

  1. 객체 지향 언어 : 자바는 대표적인 객체 지향 언어이다.
    -> 캡슐화, 상속, 추상화, 다형성이 잘 적용된 언어이다.
  2. 컴파일 언어와 인터프리터 언어의 특성을 모두 가지고 있다. : 자바 소스코드는 먼저 자바 컴파일러에 의해 바이트 코드로 변환되고, 이 바이트 코드는 자바 가상 머신(JVM)에서 인터프리트 되어 실행된다.
  3. 모든 운영체제에서 실행 가능: 자바로 작성된 프로그램은 운영체제와 상관 없이 모두 실행될 수 있다.
  4. 자동 메모리 관리 : JVM에서 가비지 콜렉터가 데몬 쓰레드에 의해 Garbage Collection이 일어난다. 이때 불필요한 메모리르 자동으로 제거해준다.
  5. 멀티 쓰레딩 지원: 스레드 생성 및 제어와 관련된 라이브러리 API를 제공해서 운영체제에 관계 없이 멀티스레드를 쉽게 구현할 수 있다.
  6. 오픈 소스: 오픈 소스로 풍부한 라이브러리가 제공된다.
  7. 동적 로딩: 각 객체가 필요한 시점에 클래스를 동적 로딩하여 생성한다.

Java의 단점

그렇다면, Java의 단점에는 뭐가 있을까?

  1. JVM 위에서 동작하기 때문에 실행속도가 상대적으로 느리다.
  2. 다중 상속이나 타입에 엄격하며, 제약이 많다.

Java 프로그램 실행 과정

Java 프로그램 실행 과정은 5가지로 정리해 볼 수 있다.

참고 블로그

Compile Time 환경

  1. 자바 소스 코드 파일(.java)를 생성한다.
  2. 이 파일을 자바 컴파일러(javac.exe)를 통해 자바 바이트 코드 파일(.class)로 컴파일한다.
자바 바이트 코드?
자바 바이트 코드는 JVM이 이해할 수 있는 언어로 변환된 자바 소스코드를 의미한다. 
자바 컴파일러에 의해 변환된 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불린다. 

RunTime 환경

  1. 컴파일된 자바 바이트 코드 파일(.class)을 Runtime으로 가져가는 시점에 클래스 로더(Class Loader)가 동작한다.
  2. 클래스 로더(Class Loader)가 동적 로딩(Dynamic Loading)을 통해 자바 바이트 코드를 런타임 데이터 영역(RunTime Data Areas), JVM의 메모리에 로드한다.
  3. 실행 엔진(Execution Engine)은 JVM 메모리에 적재된 바이트 코드들을 명령어 단위로 읽어서 실행한다.

실행 엔진은 런타임 데이터 영역에 할당된 데이터를 읽어, 바이트 코드의 명령을 한 줄씩 실행한다.

  • 자바의 바이트 코드는 기계가 바로 실행할 수 없기 때문에 2가지 방식을 통해서 자바 바이트 코드를 기계가 실행할 수 있는 형태로 변경한다.

    1. Interpreter

    • 인터프리터는 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행한다. 하나씩 해석하고 실행하기 때문에 바이트 코드 하나하나의 해석은 빠르지만, 해석된 결과의 실행은 느리다는 단점이 있다.
    • 인터프리터의 단점은 하나의 메서드가 여러 번 호출될 때마다 인터프리터를 작동해야 한다. 그리고 이를 보완하기 위해 도입된 것이 JIT 컴파일러이다.

    2. JIT(Just In Time) 컴파일러

    • 인터프리터 방식으로 실행하다가, 적절한 시점에 바이트코드 전체를 컴파일하여 네이티브 코드로 변경하고, 이후에는 해당 메서드를 더 이상 인터프리팅하지 않고 네이티브 코드로 직접 실행하는 방식이다.
    • 네이티브 코드를 실행하는 것이 하나씩 인터프리팅하는 것보다 빠르고, 네이티브 코드는 캐시에 보관하기 때문에 한 번 컴파일된 코드는 계속 더 빨리 실행할 수 있다.
    • JIT 컴파일러의 단점은 컴파일러가 컴파일하는 과정이 인터프리터가 바이트 코드를 하나씩 해석하는 것보다 훨씬 오래 걸린다는 것이다.

    따라서, JVM들은 내부적으로 해당 메서드가 얼마나 자주 수행되는지 체크하고, 일정 정도를 넘을 때에만 컴파일을 수행한다.



[참고 1] (https://s-bug.tistory.com/57#2.%20자바의%20특징%207가지✅-1)
[참고 2] (https://velog.io/@ariul-dev/차근차근-알아보는-Java-프로그램-실행-과정)