📗 JAVA의 시작
자바는 1991년, 가전기기 어플리케이션 제작 프로젝트인 그린 프로젝트에 의해
초안이 제안되었다.
자바 이전에 사용하던 언어(예. C, C++)들은 플랫폼간 호환성이 없는 언어였고 복잡하며
실행파일이 메모리에 올려져야 실행되어 메모리 관리가 어려웠다.
하지만 가전제품은 적은 메모리를 사용했고 여러 플랫폼들이 있기 때문에
플랫폼 독립적이며 메모리 사용량이 적고 호환성이 좋은 언어가 필요했다.
✔ 자바는 어떻게 호환성 문제를 해결했을까?
C나 C++는 플랫폼 종속적이었기 때문에 각각의 플랫폼 마다
컴파일을 해줘야 했다. 하지만 자바는 바이트코드와
JVM (Java Virtual Machine)을 이용하여 플랫폼 종속성 문제를 극복했다.
✔ 바이트코드와 JVM (자바 가상 머신) 이란?
자바 응용프로그램을 컴파일 하면 목적 코드인
바이트코드가 만들어진다. 바이트 코드는 CPU에 의해 실행되지 않기 때문에
CPU에 종속적이지 않으며 JVM에 의해 해석되고 실행되는 바이너리 코드이다.
바이트 코드는 클래스 파일 (.class)에 저장된다.
JVM 자체는 플랫폼 종속적이지만 JVM만 있으면 동일한 자바 실행 환경을 제공할 수 있으므로
필요한 모든 플랫폼에 JVM을 설치하여 플랫폼에 관계없이 클래스 파일의 바이트코드를
해석할 수 있게 하였다.
📗 JAVA 개발 및 실행환경
✔ 자바 프로그램의 개발과 실행
자바 응용프로그램은 여러 소스로 나누어 개발된다. (.java)
자바 컴파일러를 거쳐 .java 파일들은 바이트코드를 저장하고 있는
.class 파일로 컴파일 된다.
자바 응용프로그램은 main() 메소드를 가진 클래스에서 부터 실행이 시작되며
메모리가 충분하다면 모든 클래스 파일들을 로딩하지만 메모리가 부족하다면
JVM이 필요할 때 클래스 파일을 로딩하고 필요없는 클래스는 언로드 한다.
이를 동적로딩이라고 부르며 JVM이 클래스 파일들을 동적으로 로딩하기 때문에
자바언어의 탄생 목적인 적은 메모리로도 실행하는 것이 가능한 것이다.
📗 JAVA의 특징
1. 플랫폼 독립적이다.
플랫폼에 상관없이 JVM이 있다면 어디서든 실행 가능
2. 객체 지향적이다.
현실 세계의 모든 것은 객체 간 상호작용에 의해 이루어진다는 개념을 전제로 하여 모든 것을 객체로 정의하였다.
3. 클래스로 캡슐화를 이룬다.
클래스 내에 모든 변수와 함수를 구현해야 한다.
클래스 내에서 새로운 클래스를 작성할 수 있다.
=> 자바 프로그램은 클래스들의 집합
4. 클래스 파일 (.class)
클래스 파일에는 오직 한 개의 클래스 파일만 컴파일 되어 들어있다.
만약 다수의 클래스를 가진 자바 소스를 (.java) 컴파일하면 각 클래스마다
별도의 클래스 파일을 생성한다.
이는 클래스 로딩을 할 때 찾을 파일이 어느 클래스에 있는지 한번에 찾기 위함이다.
5. 패키지
관련된 여러 클래스들을 패키지로 묶어 관리한다.
6. 멀티스레드
자바는 운영체제의 도움 없이 자체적으로 Thread API를 제공한다.
C나 C++ 언어는 멀티스레드 운영체제 API를 호출하는데 반해
자바는 운영체제에 종속적이지 않은 독립적인 설계와 JVM에 의해
스케쥴링 되도록 구현되었다.
7. 가비지 컬렉션
자바는 메모리 할당 기능은 있지만 (new) 메모리 반환 기능은 없다.
JVM이 할당 후 사용되지 않는 메모리인 가비지를 자동으로 회수하여 개발자는 메모리 할당에만 신경쓰면 된다.
하지만 이 때문에 실시간 응용프로그램을 개발하는데 자바 언어가
부적합하다고 할 수 있다.
자바 응용프로그램은 실행 도중 예측할 수 없는 시점에 가비지 컬렉션을
실행하는데 가비지 컬렉션이 실행할 때 자바 응용프로그램은 일시적으로 멈추게 된다.
따라서 실시간으로 작업을 처리해야하는 실시간 프로그램에는 부적합하다고 할 수 있다.
8. JIT 컴파일러
자바의 느린 실행요인은 JVM이 인터프리터 방식으로 바이트 코드를 실행하기 때문이다.
하지만 이 문제는 JIT 컴파일러를 통해 속도를 개선했다.
JIT 컴파일러는 인터프리트와 컴파일 방식을 혼합한 방식인데, 실행 시점에서 인터프리트 방식으로
기계어 코드를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를
생성하는 것을 방지한다.
'Java' 카테고리의 다른 글
자바 : 클래스와 객체 (0) | 2024.02.06 |
---|---|
자바 : 배열과 예외 처리 (0) | 2024.02.05 |
자바 : 자바의 데이터 타입 (0) | 2024.02.05 |
[JAVA] List.remove(Int) VS remove(Integer) (0) | 2024.01.22 |
[JAVA] length, length(), size() 의 차이 (0) | 2024.01.18 |