Java의 등장 배경
Java는 썬 마이크로시스템즈의 엔지니어들에 의해서 고안된 오크(Oak)라는 언어에서 시작되었다. 가전제품에 탑재할 소프트웨어를 만들기위해 C++의 한계를 보완할 필요성이 있었고, C++의 장점은 도입하고 단점은 보완한 언어가 개발되었다. 시기적 상황으로 여러 종류의 운영체제를 사용하는 컴퓨터들이 통신하는 인터넷이 등장하자 , Oak에 운영체제에 대한 독립성이 추가되어 지금의 Java가 탄생하게 된다.
즉, Java는 운영체제에 독립적인 객체지향 프로그래밍 언어이다.
Java의 특징
1. 운영체제에 독립적
Java는 일종의 에뮬레이터인 JVM과 통신하기 때문에 운영체제에 대해 독립적인 구현이 가능하다. JVM은 Java 응용프로그램으로부터 전달받은 명령을 해당 운영체제에 맞게 변환하여 전달하는 역할을 수행한다.
2. 객체지향언어
객체지향개념의 특징인 상속, 캡슐화, 추상화, 다형성이 잘 적용되었다.
3. 비교적 배우기 쉬움
연산자와 기본구문은 C++에서, 객체지향관련 구문은 small talk이라는 객체지향언어에서 가져왔다. 두 언어 장점을 취하고 복잡하고 불필요한 부분은 제거함으로써 간결하고 이해하기 쉬운 코드 작성이 가능하다. 기본적으로 모든 전달방식이 call by value이다.
4. 자동 메모리 관리(Garbage Collection)
사용하지 않는 메모리를 자동으로 관리해주기 때문에, 개발자가 프로그래밍에 집중할 수 있도록 한다.
5. 네트워크와 분산처리 지원
풍부하고 다양한 네트워크 프로그래밍 라이브러리를 지원한다.
6. 멀티쓰레드 지원
Java는 운영체제에 독립적이기 때문에 Java에서 개발되는 멀티쓰레드 프로그램은 시스템과는 관계없이 구현가능하며, 관련 라이브러리가 지원되어 구현이 쉽다. 쓰레드 스케줄링은 Java 인터프리터가 담당한다.
7. 동적 로딩(Dynamic Loading) 지원
보통 Java로 작성된 애플리케이션은 여러 개의 클래스로 구성된다. 자바는 실행 시 필요한 시점에서 클래스를 로딩하기 때문에 메모리의 효율적인 사용이 가능하다.
JVM (Java Virtual Machine)

Virtual Machine은 소프트웨어로 구현된 하드웨어를 의미한다. 여기선 JVM을 Java를 실행하기 위한 가상 컴퓨터로 정의한다.
위에서 JVM이 해당 운영체제에 맞게 내용을 변환해주기 때문에 Java 프로그램은 운영체제에 독립적이라고 했다. 그렇다면 JVM도 운영체제의 독립적일까? 답은 JVM은 운영체제에 종속적이다. JVM은 해당 운영체제에 맞는 JVM(대표적으로 Window용, Macintosh용, Linux용 등)을 설치해야 한다.

위와 같이 Java 애플리케이션은 JVM을 거치는 과정과 실행 시에 해석되기 때문에 일반 애플리케이션보다 속도가 느리다는 단점이 존재한다. (JVM에 대한 자세한 내용은 따로 정리 예정)
Java 프로그램 실행 과정

- Java 컴파일러를 이용한 변환 : Java 클래스 파일 -> Java 바이트 코드 (.java -> .class)
- 클래스 로더로 .class를 JVM 메모리에 로드
- JVM에서 .class를 바이너리 코드로 변환 및 실행
클래스 로더 (class loader) : .class를 검사 및 JVM 메모리에 로드한다. 이때 .class는 런타임 데이터 영역에 배치된다.
Q&A
Q. Java란 무엇인가?
A. Java는 운영체제에 독립적인 객체지향 프로그래밍언어이다.
Q. Java의 특징은 무엇인가?
A. 운영체제에 독립적이며 캡슐화, 상속, 추상화, 다형성이 잘 적용된 객체지향 언어이다. 가비지 컬렉션과 동적 로딩으로 메모리를 효율적으로 사용할 수 있으며, 네트워크와 분산처리, 멀티쓰레드에 대한 풍부한 Java API를 지원한다.
Q. JVM은 무엇인가?
A. 일종의 가상 컴퓨터로 Java 프로그램의 명령을 해당 운영체제에 맞게 변환하여 전달하는 역할을 수행한다. Java가 운영체제에 독립적일 수 있는 이유며, Java 프로그램의 속도가 상대적으로 느린 원인이기도 하다.
Q. Java 프로그램은 어떻게 동작하는가?
A. Java 컴파일러로 Java 클래스 파일을 Java 바이트 코드로 변환 후, 이를 클래스 로더가 JVM에 로드한다. 이후 Java 인터프리터 또는 JIT 컴파일러 두 가지 방식을 이용해 Java 바이트 코드를 바이너리 코드로 변환 및 실행한다.
참고자료
'개념서 > Java' 카테고리의 다른 글
| [Java] 상속 (0) | 2022.06.10 |
|---|---|
| [Java] 객체지향 프로그래밍 I (0) | 2022.06.06 |
| [Java] 조건문, 반복문, 배열 (0) | 2022.05.28 |
| [Java] 연산자 (0) | 2022.05.27 |
| [Java] 변수 (0) | 2022.05.23 |
댓글