JAVA란?
- 1991년에 썬의 엔지니어들에 의해 고안되어 C++에 장점을 도입하고 단점을 보완해 1996년 1월에 공식적으로 발표된 객체지향 프로그래밍 언어이다.
- Write once, Run Anywhere - 한번 작성하면 어디서든 실행된다.
- 현재 오라클에 인수 합병 되어있다.
JAVA의 특징
운영체제에 독립적이다.
- 자바로 작성된 프로그램은 운영체제의 종류에 관계없이 실행이 가능하다.
- 운영체제나 하드웨어가 아닌 JVM(자바 가상 머신)하고만 통신하고 JVM이 자바 응용프로그램으로부터 전달받은 명령을 해당 운영체제가 이해할 수 있도록 변환하여 전달하기 때문이다.
- 자바는 운영체제에 독립적이지만 JVM은 운영체제에 종속적이어서 오라클에서는 서로 다른버전의 JVM을 제공하고 있다.
객체 지향 언어이다.
- 객체 지향 언어의 특징인 캡슐화, 상속, 다형성, 추상화를 통해 재사용성이 높고 개발의 생산성을 향상시키는 장점이 있다.
- 단점으로는 개발 속도가 느리거나 실행속도가 느리다는 것이다.
자동 메모리 관리(Garbage Collection)를 해준다.
- C언어를 사용하다 보면 free()함수로 직접 메모리를 해제 해주어야 한다.
- JAVA는 JVM의 Garbage Collector가 불필요한 메모리를 알아서 정리해주기 때문에 c언어의 free()와 같이 해제해줄 필요가 없다.
네트워크와 분산처리를 지원한다.
- 기본 내장 라이브러리인 JAVA API에서 TCP/IP 라이브러리가 기본적으로 포함되어 있고, HTTP 프로토콜을 지원한다.
- ex) java.net.Socket의 Socket을 이용한 통신
멀티 쓰레드를 지원한다.
- JAVA는 기본 내장 라이브러리를 통해 멀티 쓰레드 프로그래밍에 대해 지원한다.
- 멀티 쓰레드란
- 일반적으로 하나의 프로세스는 하나의 스레드를 가지고 작업을 수행한다.
- 멀티 쓰레드는 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 말한다.
- ex) 메신저의 경우 채팅하면서 파일을 다운로드 받거나 음성 대화를 나눌 수 있는 것이 가능한 이유가 멀티쓰레드로 작성되어 있기 때문이다. 싱글 쓰레드로 작성된다면 파일을 다운로드 받는동안 다른 일을 전혀 할 수 없다.
동적 로딩을 지원한다.
- 자바로 작성된 어플리케이션은 여러개의 클래스로 구성되어 있어, 모든 클래스를 로딩하게 되면 많은 시간이 걸린다.
- 하지만 동적 로딩을 지원하기 때문에 클래스가 필요한 시점에 로딩하여 클래스를 사용할 수 있다. → 변경
- 로딩: 클래스 파일을 바이트 코드로 읽어 메모리로 가져오는 과정
- java의 단점인 속도 문제가 있는데 현재는 바이트코드를 하드웨어의 기계어로 바로 변환해 주는 JIT컴파일러라는 신기술의 도입으로 JVM의 기능이 향상되어 속도 문제가 상당히 개선되었다.
JAVA의 실행 방법 및 실행 환경
JVM(Java Virtual Machine)
- java를 실행하기 위한 가상 기계
- 자바로 작성된 모든 애플리케이션은 JVM에서만 실행되기 때문에 자바를 실행하기 위해선 반드시 JVM이 필요하다.
JVM 구조
1. Class Loader
- 자바에서 소스를 작성하면 .java파일이 생성되고 .java소스를 컴파일하면 .class파일(바이트 코드)이 생성된다.
- 이런 클래스 파일들을 찾고 엮어서 JVM이 운영체제로부터 할당받는 메모리 영역인 Runtime Data Area로 적재하는 역할을 Class Loader가 한다. → 메모리에 로딩
2. Execution Engine
- Class Loader에 의해 메모리에 Load된 클래스(바이트 코드)들을 기계어로 변경해 명령어 단위로 실행하는 역할을 한다.
- 인터프리터 방식 : 명령어를 하나하나 실행하는 방식
- 초기 방식으로 속도가 느리다는 단점이 있다.
- JIT 컴파일러: 프로그램을 실제 실행하는 시점에 전체 바이트 코드를 각 OS에 맞는 네이티브 코드로 변경해서 Execution Engine이 네이티브로 컴파일된 코드를 실행하는 것.
- JIT컴파일러는 같은 코드를 매번 해석하지 않고, 실행할 때 컴파일을 하면서 해당 코드를 캐싱한다. 그래서 이후 바뀐 부분만 컴파일하고 나머지는 캐싱된 코드를 사용한다.
- Native Code로 변환하는 데에는 비용이 소모된다.
- 인터프리터 방식을 사용하다 일정 기준이 넘어가면 JIT 컴파일 방식으로 명령어를 실행함
3. Garbage Collector
- Garbage Collector(GC)는 Heap 메모리 영역에 생성된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다.
- GC가 수행되는 동안 GC를 수행하는 쓰레드가 아닌 모든 쓰레드는 일시정지된다.
- 메모리를 제거하고 옮길 때 다른 쓰레드가 메모리를 사용하면 안되기 때문이다.
4. Runtime Data Area
JAVA실행 방식
참고
- 자바의 정석 책
- 멀티 쓰레드 관련
- JVM 관련
- Execution Engine 관련