JAVA
C++의 장점을 모아서 만든 프로그래밍 언어
메모리 해제에 가비지 콜렉터(garbage collector)를 사용하여 자동적으로 메모리 관리
- C언어) malloc으로 동적 할당 -> free()로 메모리 해제 (C/C++은 이렇게 직접 메모리 관리를 하기 때문에 JAVA 보다 빠름)
객체 지향 언어로 기능을 부품화
운영 체제와 상관없이 실행할 수 있다(JVM사용 때문)
풍부한 클래스 라이브러리(Java API)를 통해 프로그래밍에 필요한 요소들을 기본적으로 제공
자바에서 개발되는 멀티 쓰레드 프로그램은 시스템과는 상관없이 구현 가능(관련된 라이브러리가 제공됨으로 구현이 쉬움)하며, 여러 쓰레드에 대한 스케줄링을 자바 인터프리티가 담당
동적 로딩을 지원하여 실행 시에 모든 클래스가 로딩되지 않고 필요한 시점에 클래스를 로딩하여 사용
애플리케이션의 변경사항이 발생해도 비교적 적은 작업만으로도 처리할 수 있는 유연한 애플리케이션 작성 가능
객체 지향 프로그래밍(OOP)
컴퓨터 프로그래밍 패러다임중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법
JDK(Java Development Kit)
자바 애플리케이션을 구축하기 위한 핵심 플랫폼 구성 요소
자바 프로그램을 빌드하고 컴파일 하기위한 관련 라이브러리와 파일들,JRE, Compiler, Debugger를 포함
JDK가 없으면 자바 프로그램을 빌드할 수 없다
- JDK가 있어야 개발이 가능하고, 프로그램만 사용할거라면 JRE만 있으면 된다.
jdk의 종류: Java SE, EE, ME
JRE(Java Runtime Environment)
JVM및 Java 내에서 작성된 응용 프로그램을 실행하기 위한 기타 부분도 포함하는 라이브러리(jar)를 번들로 제공하는 소프트웨어 패키지
- JVM은 JRE 배포의 일부
JAVA 컴파일러와 JVM
자바 파일이 java컴파일러에 의해 바이트 코드 파일인 class로 바뀌고, JVM을 통해 해당 클래스가 기계어로 번역되어 실제 프로그램이 실행됨
인터프리터가 실질적으로 JVM에 저장된 자바 바이트 코드를 네이티브 코드(기계어)로 번역하여,
자바 소스코드 -> 자바 컴파일러 -> 자바 바이트 코드 -> JVM -> 자바 인터프리터 -> 네이티브 코드(기계어) 순서로 진행된다.
- 자바 컴파일러의 목적은 해당 소스코드들을 JVM이 이해할 수 있는 바이트코드(.class) 로 변환하는 것
- 자바가 강조하는 Write Once, Run Anywhere(한번 작성되면 어디서든 실행된다)를 컴파일러와 인터프리티 둘을 다 사용하여 실행
- 플랫폼 종속적인 부분을 JVM을 통해서 해결하고자 한 것인데 자바 코드를 실행하고자 하면 JVM이라는 가상머신 위에서 돌아가서 플랫폼의 영향을 안받게 하고자 한 것
- 기계어 자체는 OS를 배제하고 바로 CPU에서 읽어 쓰는 개념
JVM(Java Virtual Machine)
추상적인 시스템으로, 자바 바이트 코드를 실행 할 수 있는 런타임 환경을 제공함
JDK와 JRE에 상속 혹은 포함(설치 패키지에 내장)되어 있기 때문에 본질적인 파트로 JVM을 개별적으로 설치할 필요가 없다
Class Loader: 자바 컴파일러를 통해 생성된 바이트 코드 파일들을 Runtime Data Area 형태로 메모리에 적재
메모리 영역(Runtime Data Area): Class Loader에서 준비한 데이터들을 보관. 메모리 영역은 크게 모든 쓰레드가 공유하는 영역과 쓰레드별로 하나씩 생성되는 영역으로 나뉜다.
Excution Engine: 메모리에 적재된 클래스들을 기계어로 변경하여 명령어 단위로 실행
Native Method Interface(JNI): Java에서 native영역(C/C++)으로 들어가 호출하거나, native(C/C++)에서 Java로 호출하는 interface.
- Java와 Java 이외의 언어로 만들어진 어플리케이션이나 라이브러리가 상호 작용할 수 있도록 연결시켜주는 인터페이스
- 자바로 동일한 코드를 재작성하기를 원치 않으며, 단지 기존 코드를 재사용하고 싶을 때 사용
<요약>
자바언어의 특징
1. 운영체제에 독립적
2. 객체지향 언어
3. 배우기 쉬움
4. 자동 메모리 관리(Garbage Collection)
5. 네트워크와 분산처리를 지원
6. 멀티 쓰레드 지원
7. 동적 로딩 지원
JDK
자바 애플리케이션을 구축하기 위한 핵심 플랫폼 구성 요소
JRE
JVM및 Java 내에서 작성된 응용 프로그램을 실행하기 위한 기타 부분도 포함하는 라이브러리(jar)를 번들로 제공하는 소프트웨어 패키지
JVM
자바를 실행하기 위한 가상 컴퓨터, 모든 자바 애플리케이션은 JVM에서만 실행된다.
일반 애플리케이션의 코드는 OS만 거치고 하드웨어로 전달되지만 Java 애플리케이션은 JVM을 한번 더 거치기 때문에, 속도가 느리다는 단점이 있다.
하지만, Java 애플리케이션은 JVM하고만 상호작용을 하기 때문에 OS와 하드웨어에 독립적이다.
Reference
자바의 정석 http://www.yes24.com/Product/Goods/24259565
참조1 https://medium.com/maheshjtp/what-is-the-difference-between-jdk-jvm-jre-770f73c27c2f
참조2 https://www.javatpoint.com/jvm-java-virtual-machine
Fundamental of JVM and Class Loader in java - Java JVM과 Class Loader의 동작 과정 이해
https://dailyworker.github.io/fundamental-JVM-classloader/
JNI (Java Native Interface) 란? https://minhyeokism.tistory.com/27
'Language > Java' 카테고리의 다른 글
4.1 객체 지향 프로그래밍 (클래스와 객체) (0) | 2021.07.06 |
---|---|
문자열 함수 종류 (0) | 2021.07.05 |
3. 연산자 (1) | 2021.07.01 |
[JAVA] 2. 변수(Variable) (0) | 2021.06.29 |
[JAVA] 1. 자바 프로그램 작성 (0) | 2021.06.29 |