[NO.0] JAVA란?
자바 가상 기계와 바이트 코드
자바의 플랫폼 독립성을 가능하게 한 것: 자바 가상 기계와 바이트 코드
바이트 코드
자바 가상 기계에서만 실행되는 기계어로서, 어떤 CPU와도 관계없는 바이너리 코드이다. 자바 컴파일러는 자바 소스 프로그램을 컴파일하여 바이트 코드로 된 클래스 파일을 생성한다. 이 클래스 파일은 컴퓨터의 CPU에 의해 직접 실행되지 않고, 자바 가상 기계가 인터프리터 방식으로 실행시킨다. (자바 가상 기계만 있다면 바로 실행 가능)
자바 가상 기계
자바 가상 기계는 소프트 웨어로서, 서로 다른 플랫폼에서 자바 프로그램이 실행되는 동일한 환경을 제공한다. 하지만 자바 가상 기계는 플랫폼마다 서로 다르게 작성되어 배포되며 플랫폼 종속적이다.
JAVA의 특징
플랫폼 독립성
하드웨어, 운영체제 등 플랫폼에 종속지 않는 독립적인 바이트코드로 컴파일 되며, 자바 가상 기계만 있으면 하드웨어/운영체제를 막론하고 자바 프로그램 실행 가능하다
객체지향
자바는 객체지향 언어로서 캡슐화, 상속, 다형성을 지원한다.
클래스로 캡슐화
자바는 객체 지향 언어의 캡슐화 원칙을 철저히 지켜, 변수나 메소든느 반드시 클래스 내에 구현하도록 한다.
+ 클래스 안에 새로운 클래스, 즉 내부 클래스를 만들 수 있다.
소스와 클래스 파일
클래스 파일(.class)에는 반드시 하나의 자바 클래스만 들어있다. 즉 하나의 소스 파일(.java)에 여러개의 클래스를 작성한 경우, 컴파일 시 해당 클래스 개수만큼 클래스 파일이 생성된다. 또한 하나의 소스 파일에 여러 클래스 중 오직 한 클래스만 public으로 선언할 수 있다.
public class A {} // A.class
class B {} // B.class
class C { // C.class
class D {} // C$D.class
}
실행 코드 배포
다수의 클래스 파일을 jar 파일 형태로 압축하여 배포하거나 실행 할 수 있다.
패키지
서로 관련 있는 클래스는 패키지로 묶어 관리한다. 패키지는 파일 시스템의 폴더와 같은 개념이다.
멀티 스레드
하나의 자바 프로그램이 다수으이 작업을 처리할 수 있도록 다수의 스레드가 동시에 실행할 수 있는 환경을 지원한다. 자바는 C/C++ 등 많은 다른 언어와는 다르게 운영체제의 도움 없이 멀티스레드 프로그래밍이 가능하기 때문에 멀티스레드를 지원하지 않는 운영체제에서도 자바를 이용하면 멀티스레드 프로그램을 개발할 수 있다.
가비지 컬렉션
자바 언어는 메모리를 할당 받는 기능은 있지만, 메모리를 반환하는 기능은 없다. 프로그램 내에 사용되지 않는 메모리(가비지)는 자바 가상 기계의 가비지 컬렉션 기능에 의해 자동으로 회수 된다.
(강제 회수 요청 코드: System.gc(); )
실시간 응용 시스템에 부적합
자바는 앞에 말한 가비지 컬렉션이 프로그램 실행 도중 예측할 수 없는 시점에 실행되므로 프로그램이 일시적으로 중단된다. 이런 문제로 인해 일정 시간 내에 반드시 실행 결과를 내야하는 실시간 응용 시스템에 부적합하다.
프로그램 작성이 쉬움
자바는 포인트 개념이 없기 때문에 프로그램 작성에 부담이 적다. 또한 프로그램 개발을 도와주는 다양한 라이브러리와 스윙등 강력한 GUI 라이브러리를 지원하므로 프로그램 작성이 빠르고 쉽다.
실행 속도를 개선하기 위해 JIT 컴파일러 사용
자바는 자바 가상 기계가 인터프리터 방식으로 바이트 코드를 실행하므로 일반적으로 C/C++ 로 작성된 프로그램보다 실행이 느리다고 알려져있다. 하지만 최근에는 자바 프로그램을 JIT(Just in Time) 컴파일링 기법을 이용하여, 실행 성능이 C/C++와 거의 비슷하도록 개선되었다.
JIT 컴파일링 기법:
실행하는 도중 자바 프로그램을 해당 CPU의 기계어 코드로 컴파일하고 CPU가 바로 기계어를 실행 하도록 하는 컴파일링 기법