[JAVA] 자바란 무엇이고, 어떤 특징이 있는가?

Java의 특징

WORA(Write Once, Run Anywhere), 플랫폼에 독립적이다.

  • Java로 작성된 프로그램은 JVM (자바를 실행하기 위한 소프트웨어) 위에서 실행된다.
  • OS에서 직접 실행하는 것이 아니기 때문에 자바 코드는 JVM만 있다면 어디서든 실행할 수 있다. 

JVM은 OS에 종속적이다.

 

객체지향 언어이다.

OOP의 특징인 상속, 캡슐화, 다형성이 잘 적용된 순수한 객체지향 언어이며, C++ 처럼 포인터를 사용하지도 않기 때문에 배우기 쉽다.

 

메모리를 자동으로 관리해준다.

C언어에서는 malloc()으로 메모리를 할당하면 반드시 free()를 호출해서 개발자가 직접 메모리를 반환해주어야 했다.

Java에서는 GC(Garbage Collection)가 new를 통해 생성되어 메모리를 할당받은 객체를 일정 주기로 검사한다.

이때 사용이 끝나고 더 이상 참조가 없는 객체를 삭제하여 메모리를 자동으로 반환해준다.  

 

멀티스레드를 지원한다.

OS에 따라 멀티스레드 구현 방법과 처리 방식이 다르다. 자바에서는 OS와 관계 없이 구현이 가능하며 여러 쓰레드에 대한 스케줄링 또한 자바 인터프리터가 담당하게 된다.

 

동적 로딩

Java는 javac이라는 컴파일러를 통해서 .java 파일을 JVM이 읽을 수 있는 바이트 코드(.class)로 변환한다.

(java 파일 개수 만큼 .class 파일이 생성된다. 기본적으로 /out 위치에 생성되며, 위치는 변경할 수 있다.)

JVM은 .class 파일을 자바 인터프리터를 통해 한 줄씩 읽게 되고, 그 과정에서 필요한 .class 파일이 생길 때마다 해당 파일을 메모리에 로드한다.

동적 로딩은 메모리를 효율적으로 쓸 수 있고, 일부 클래스가 변경되어도 전체 애플리케이션을 다시 컴파일하지 않아도  된다는 장점이 있다.

 

실행 속도가 느리다.

자바로 작성된 프로그램은 JVM에서 실행되지만, 실제 PC에서 프로그램이 동작하기 위해선 OS의 명령이 수행되어야 한다. 즉, 바이트 코드를 기계어로 변환하는 작업이 필요하다.

하지만 자바는 위에서 설명했듯이 실행 시 인터프리터가 바이트 코드를 기계어로 변환하는 작업이 추가되어 속도가 느리다.

또한, 실행 중에 GC의 작업이 실행되는 순간에는 GC를 제외한 다른 스레드가 모두 멈추기 때문에 성능에 영향을 미칠 수 있다.

 

메모리를 많이 사용한다.

코테 문제를 풀고 메모리 사용량을 보면 C, C++로 작성된 코드 보다 훨씬 많은 메모리를 사용하는 것을 볼 수 있다.

그 이유는 Java는 기능이 많은 만큼 객체의 헤더 정보, 상속, 다형성 등을 위한 추가 정보를 포함하기 때문이다.

 

 

 

 

 

 

자바의 단점 개선 

JIT 컴파일러를 사용한 속도 개선

실행 시점에 컴파일한다는 뜻으로 Just In Time 컴파일러라고 한다.

 

자바 소스 코드가 컴파일되어 생성된 바이트 코드를 인터프리터에 의해 한 줄씩 실행하는 과정은 동일하다.

이후 JIT 컴파일러에 의해 번역된 기계어를 캐싱하여 메모리에 저장하게 되는데 이때부터는 번역된 기계어를 바로 사용하기 때문에 빠르게 실행될 수 있다. 

예를 들어 print()가 호출되었다면, 이후부터 print()를 호출할 때는 더 빠르게 동작한다.

 

또한, 번역한 코드에 최적화 기법( 루프 최적화, 인라이닝 ..등)을 적용하여 성능을 개선한다.

 

 

GC 성능 개선

GC는 자바 버전이 업데이트 될 때마다 점차 GC 알고리즘을 개선하여 성능이 개선되었다.

 

 

 

 

 

+++

컴파일

전체 소스 코드를 읽어, 문법 검사를 한 후 목적 코드(기계어 또는 중간 코드)로 변환한다.

  • 실행 시행 시점에 미리 번역된 코드를 읽기만 하기 때문에 빠르다.
  • 소스 코드의 변경이 일어날 때마다 재컴파일이 필요하다.

 

인터프리터

소스 코드를 실행 시점에 한 줄씩 읽어 즉시 실행한다.

  • 개발 시점에 코드를 해석하기 때문에 느리다.
  • 수정된 코드를 컴파일 할 필요 없이 바로 실행이 가능하다.

 

빌드

컴파일 결과물을 패키징하여 실행 가능한 애플리케이션, 라이브러리로 만든다.

  • 프로젝트 관리, 의존성 관리, 테스트 실행, 배포 등에서 편리하다.
  • 컴파일 후 빌드 시간이 추가로 필요하다.
  • 대표적인 빌드 툴로 Maven과 Gradle이 있으며, 자바에서 빌드된 결과물이 바로 .jar, .war이다.

 

 

자바 버전과 배포판

자바 소프트웨어

JDK는 자바 개발 키트라는 뜻으로 모든 자바 소프트웨어가 포함되어 있다. 

JRE는 자바 실행 환경이라는 뜻으로 자바를 실행하기 위한 소프트웨어만 포함되어 있다.

 

배포판

Java는 용도에 따라 SE(Standard), ME(Micro), EE(Enterprise) 세 가지 Edition이 존재한다.

SE는 표준으로 가장 많이 사용되며, ME는 모바일, IOT 등 적은 메모리를 사용하는 플랫폼에 적합하다.

EE는 기업용으로 사용된다.

 

자바 LTS(1.8, 11, 17 ) 버전 별 간단한 특징

1.8 버전은 Stream API와 람다식, LocalDateTime이 추가되었다.

11 버전은 G1 GC가 기본 GC로 변경되었다.

17 버전은 반복 코드를 줄일 수 있는 record class가 추가되었다.

 

'개발 > java' 카테고리의 다른 글

[JAVA] Java의 메모리 구조와 GC의 동작 방식  (2) 2024.03.04