Java 특징: WORA (Write Once Run Anywhere)
- 컴파일 : 고급 언어를 컴퓨터가 해석할 수 있는 기계어로 바꿔주는 과정
- 컴파일러: 컴파일 해주는 소프트웨어
- C/C++ 등 자바 이전의 프로그래밍 언어들의 컴파일러는 기계어 코드로 변환할 때 프로그램이 실행될 대상의 컴퓨터의 CPU와 운영체제에 종속적인 코드로 변환한다.
- 위의 이유로 같은 코드를 다른 플랫폼(다른 CPU or OS)에서 실행하려면 아래 2가지 중 하나를 해야 함
- 다시 컴파일하기
- 플랫폼에 맞도록 코드를 수정
- 같은 리눅스인데 CPU가 다르면 다시 컴파일 or 코드 수정, 같은 CPU인데 리눅스의 것을 윈도우에서 실행하려고 해도 컴파일 or 코드 수정 필요 => 플랫폼 종속성(platform independence)

플랫폼 = 하드웨어 플랫폼 + 운영체제 플랫폼
1. 기계어가 CPU마다 다름
2. 운영체제마다 API가 다름
3. 운영체제마다 실행파일 형식 다름
- 자바는 개발 단계부터 플랫폼에 독립적으로 설계됨 (이전 포스팅 참고 https://yujinius45.tistory.com/28)
[Java] 자바의 탄생
자바의 탄생 1991년 선마이크로시스템즈(SUN Microsystems)는 제임스 고슬링(James Gosling)이란 엔지니어를 중심으로 그린 프로젝트(green project)라는 이름으로 가전제품에 사용할 소프트웨어 개발 시작
yujinius45.tistory.com
- 운영체제 하드웨어 상관 없이 가상 가상 기계(JVM)가 있으면 어디서나 자바로 작성된 프로그램에 1. 동일한 실행 환경을 제공하며 2. 동일한 실행 결과를 기대할 수 있음
- 자바는 웹 브라우저, 분산 환경의 지원 등으로 네트워크에 연결된 어느 클라이언트에서도 실행 가능
- 어디서든 한 번 작성하면, 다시 컴파일하거나 수정하지 않고, 어떤 하드웨어에서나 운영체제에서도 실행시킬 수 있음 => 이를 WORA(Write Once Run Anywhere) 라고 함

자바 가상 기계와 바이트 코드
- 자바의 플랫폼 독립성을 가능하게 하는 것은 ① 자바 가상 기계(JVM)와 ② 바이트 코드 때문임
바이트 코드
- 바이트 코드는 자바 가상 기계에서만 실행되는 기계어
- 어떤 CPU와도 관계없는 바이너리 코드(binary code)
- 자바 컴파일러는 자바 소스 프로그램을 컴파일하여 바이트 코드로 된 클래스 파일 생성
- 클래스 파일은 컴퓨터의 CPU에 의해 직접 실행 X
- 자바 가상 기계 JVM이 인터프리터 방식으로 바로 실행 가능
- 오라클에서 배포하는 JDK(Java Development Kit)에는 자바 클래스 파일을 디어셈블(disassemble)하여 바이트 코드를 볼 수 있는 도구(javap)를 제공
자바 가상 기계(JVM)
- 소프트웨어
- 서로 다른 플랫폼에서 자바 프로그램이 실행되는 동일한 환경 제공
- BUT 자바 가상 기계는 플랫폼마다 서로 다르게 작성되어 배포되며 플랫폼 종속적
- 자바 가상 기계는 자바 개발사인 오라클 뿐만 아니라 IBM, 마이크로소프트 등 다양한 회사에서 제작 공급 중
C/C++ vs Java 실행 환경
C/C++ 프로그램의 개발 및 실행

- 링크의 과정을 통해 만들어진 .exe 실행 파일에는 실행에 필요한 모든 코드가 다 들어 있음
- .exe 파일만 있으면 실행에 아무 문제 없음
- .exe 파일이 매우 큰 경우 적은 량의 메모리를 가진 컴퓨터는 처음부터 실행조차 할 수 없는 문제점 있음
- 장점: 하나의 실행 파일
- 실행 최적화
- 실행 속도 빠르다
- 유효타임 실시간이 중요할 때는 C가 좋다(자바 적합 X)
- 단점: 실행 파일이 크고 메모리 많이 잡아 먹는다
- ① C 컴파일러 + ② 링커 = 빌드
- 빌드를 통해 실행 파일을 만든다
- 실행 파일은 컴퓨터 CPU가 바로 실행한다
자바 프로그램의 개발 및 실행

- 자바에는 하나의 실행 파일(.exe)로 뭉치는 링크의 과정이 없음
- 여러 클래스 파일 중 하나를 실행 => 실행 도중 다른 클래스 파일이나 자바 API의 클래스 파일 필요시 => 자바 가상 기계는 그 때 그 클래스 파일을 로딩하고 실행
- 당장 실행할 클래스 파일만 로딩하여 사용 => 적은 량의 메모리를 가진 컴퓨터에서 얼마든지 큰 자바 응용프로그램을 실행할 수 있음
- 플랫폼 독립성과 함께 달성하고자 하는 자바 언어의 본질
- 메모리가 충분한 PC에서는 실행 중에 클래스 로딩으로 인한 시간을 줄이기 위해 사용자 클래스 파일과 필요한 자바 클래스 파일을 미리 로딩해둠
자바 특징
① 플랫폼 독립성
② 하나의 실행 파일(.exe)로 만드는 링크 과정이 없고, 필요할 때 클래스 파일을 로딩하여 실행하기 때문에 적은 메모리로 실행 가능
자바와 C/C++의 실행 비교
| 자바 | 자바 소스 파일 TEST.java |
자바 컴파일러 | 바이트 코드 TEST.class |
자바 프로그램 TEST.class 자바 가상기계 위에서 실행 [JVM - OS - H/W] |
| C/C++ (C++일 때) |
소스 파일 TEST.cpp |
C++ 컴파일러/링커 | 바이너리 실행 파일 TEST.exe |
C++ 프로그램 TEST.exe CPU가 바로 실행 [OS-HW] |
자바와 C/C++의 비교
자바
- 자바는 컴파일러가 바로 바이트 코드(.class)를 생성하며, 링크 과정이 없다.
- 바이트 코드는 자바 가상 기계(JVM)에서만 실행 가능
- 자바는 실행시간에, 필요한 클래스들이 자바 가상 기계에 의해 링크되며 클래스 로더가 필요한 클래스를 동적으로 로딩한다.
- ClassLoader 객체를 이용하여 개발자가 직접 클래스를 로딩할 수도 있다.
C/C++
- C/C++에서는 컴파일러가 중간 단계인 목적 코드를 새성한 후 링커가 필요한 라이브러리들을 링크하여 최종 실행 가능한 .exe 파일을 만든다.
- 정적 라이브러리의 경우 실행 파일에 포함시키므로 실행 파일 크기가 커진다.
- 동적 라이브러리의 경우 실행 시간에 링크가 일어난다.
- 목적 코드 및 실행 파일은 플랫폼에 따라 다르므로, 플랫폼이 바뀌면 소스 코드를 수정하거나 컴파일과 링크를(컴파일+링크=빌드)를 새로 해야 한다.
'Java' 카테고리의 다른 글
| [Java] 자바 서블릿(servlet)과 응용 프로그램 예시 (1) | 2024.04.04 |
|---|---|
| [Java] 자바, JDK, JRE, JVM, 모듈화, 자바 API, IDE (0) | 2024.04.04 |
| [Java] 자바의 탄생 (3) | 2024.04.03 |
| [Java] 프로그래밍 언어의 진화 그리고 컴파일과 실행 (1) | 2024.04.03 |
| [Java] 자바(Java), 자바스크립트(Javascript), JSP(Java Server Page) 차이점과 서블릿(Servlet) (1) | 2024.04.03 |