자바의 특징
플랫폼 독립성
- 자바는 H/W, OS 등 플랫폼에 종속되지 않는 독립적인 바이트 코드로 컴파일 됨
- JVM만 있으면 하드웨어/운영체제 상관 없이 자바 프로그램 실행 가능
객체 지향
- 자바는 객체 지향 언어로서 ① 캡슐화 ② 상속 ③ 다형성 지원
- 객체 간의 상호 관계로 모델링 되어 인간 사고에 가깝게 표현됨
클래스로 캡슐화
- 자바는 객체 지향 언어의 캡슐화(encapsulation) 원칙을 철저히 지켜, 변수나 메소드는 반드시 클래스 내에 구현하도록 함
- 클래스에 속하지 않은 변수나 메소드는 있을 수 없음
- 자바는 클래스 안에 새로운 클래스 = 내부 클래스를 만들 수 있음
-
소스와 클래스 파일
- 클래스 파일(.class)에는 반드시 하나의 클래스만 들어 있음
- 즉, 하나의 자바 소스 파일에 여러 개의 클래스를 작성한 경우, 컴파일 하면 클래스마다 별도의 클래스 파일이 생성됨
- 하나의 자바 소스 파일에 작성된 클래스 중 오직 한 클래스만 public으로 선언할 수 있음
- 소스 파일 내에 public으로 선언된 클래스의 이름으로 자바 소스 파일을 저장해야 함
- public class의 이름이 파일 이름이어야 하기 때문에 public은 하나만 쓰자
소스 파일과 클래스, 클래스 파일의 관계
실행 코드 배포
- 자바 응용프로그램 = 한 개의 클래스 파일 or 다수의 클래스 파일로 구성
- 다수의 클래스 파일을 jar 파일 형태로 압축하여 배포하거나 실행 가능
- Java 9부터는 자바 응용프로그램을 위한 맞춤형 커스텀 JRE를 만들어 실행 가능
- 자바의 실행은 main() 메소드에서 시작
- 하나의 클래스 파일에 2개 이상의 main() 메소드가 있을 수 없음 => 1 클래스 당 1 main()
- 그러나 각 클래스 파일이 main() 메소드를 가지는 것은 상관 없음
패키지
- 서로 관련 있는 클래스는 패키지로 묶어 관리
- 패키지는 파일 시스템의 폴더와 같은 개념
- java.lang.System 클래스 : java\lang 폴더의 System.class 파일
멀티스레드
- 하나의 자바 프로그램이 다수의 작업을 처리할 수 있도록 다수의 스레드가 동시에 실행할 수 있는 환경 지원
- 보통 멀티스레드 프로그램 작성하기 위해서는 아래 2개 필요
- 운영체제가 멀티스레드 지원
- 멀티스레드와 관련된 API나 라이브러리 제공
- C/C++ 등 많은 언어들은 자체적으로 멀티스레드를 지원하지 않아 운영체제의 도움을 받음
- 자바는 운영체제의 도움 없이 멀티스레드 프로그래밍이 가능
- 멀티스레드를 지원하지 않는 운영체제에서도 자바를 이용하면 멀티스레드 프로그램 개발 가능
가비지 컬렉션
- 자바 언어는 메모리를 할당받는 기능은 있지만, 메모리를 반환하는 기능은 없음
- 프로그램 내에 사용되지 않는 메모리(가비지)는 JVM(자바 가상 기계)의 가비지 컬렉션 기능에 의해 자동으로 회수됨
- 가비지 컬렉션은 언제 실행될지 모름!
실시간 응용 시스템에 부적합
- 자바 응용프로그램은 실행 도중 예측할 수 없는 시점에 가비지 컬렉션이 실행되므로, 프로그램 실행이 일시적으로 중단됨
- 이런 문제로 인해 일정 시간(deadline) 내에 반드시 실행 결과를 내야만 하는 실시간 시스템에는 자바 언어가 적합하지 않음
자바 프로그램은 안전
- 자바 언어는 타입 체크가 매우 엄격
- C/C++과 달리 메모리의 물리적 주소를 사용하는 포인터의 개념이 없음
- 잘못된 자바 프로그래밍으로 시스템이 중단되는 일 없음
프로그래밍 작성 쉬움
- C/C++에 있는 포인터 개념이 없어 프로그램 작성 부담 적음
- 개발 도와주는 다양한 라이브러리, Swing 등 강력한 GUI 라이브러리 지원
실행 속도를 개선하기 위해 JIT 컴파일러가 사용됨
- 자바는 JVM(자바 가상 기계)가 인터프리터 방식으로 바이트 코드를 실행
- C/C++로 작성된 프로그램보다 실행이 느리다고 알려져 있음
- 최근에는 실행하는 도중 자바 프로그램을 해당 CPU의 기계어 코드로 컴파일 하고 CPU가 바로 기계어를 실행하도록 하는 JIT(Just in Time) 컴파일링 기법을 사용
- 실행 성능이 C/C++와 거의 비슷하도록 개선됨