
컴퓨터는 0과 1 밖에 모른다
- 컴퓨터는 사실 0과 1밖에 알아듣지 못 합니다. 0과1로만 코딩하는걸 기본 명령이라고 하는데 이는 어셈블리 언어에서 사용됩니다.
- 이 0과1은 CPU가 이해하는 기계어이며, 운영체제는 그 위에서 동작합니다
- 그런데 운영체제마다 명령어가 다르다면 자바 코드는 어떻게 운영체제에서 작동될 수 있을까요?
- 이는 플랫폼 독립성으로 해결 가능합니다
플랫폼 독립성이란
- 특정 하드웨어나 운영체제 등 플랫폼에 제약받지 않고 소프트웨어가 실행될 수 있는 특성
- 즉, 자바 코드를 짜게 되면, 다양한 운영체제에서 작동되는 것입니다.
- 이 과정은 아래 글에서 자세히 설명드리겠습니다
바이트 코드
- 자바 소스 코드를 자바 가상 머신(JVM)이 이해할 수 있도록 변환한 중간 코드
- 바이트 코드는 운영체제와 관계없이 공통적인 포맷을 취합니다
- 하지만, 운영체제들은 기초적인 명령들만 알아듣기에 이해할 수 없습니다
- 이 문제를 해결하기 위해 등장한 것이 JVM (자바 가상 머신) 입니다.
통역사 같은 역할 JVM
- 바이트코드를 각 운영체제를 위한 명령으로 바꿔주는 역할을 합니다
- 여기서 명심해야할 사실은 JVM은 운영체제마다 다르다는 것입니다.
- 덕분에 윈도우에서 작성한 자바 코드가 리눅스 나 유닉스에서도 작동될 수 있죠
- 다시 말하자면 JVM이 바이트 코드를 기반으로 코드를 실행하는데 그걸 위해서 JVM이 바이트코드를 기계 명령으로 바꾸는 것
- ⇒ 운영체제가 이해하기 쉽게
실행 과정
- 소스 코드 작성 → 컴파일 -> 바이트코드로 변환 -> 실행 중 JVM이 바이트코드 읽어 특정 운영체제 명령어로 바꿈 -> 운영체제에 프로그램을 실행
JVM이 실제 실행을 담당한다면, 자바 프로그램이 실행되기까지는 다른 도구들도 필요합니다. 바로 JRE(Java Runtime Environment) 와 JDK(Java Development Kit)입니다. 다음은 이들이 어떤 역할을 하는전 이해하기 쉽도록 자바 프로그램이 어떤 구조(클래스와 메서드)로 구성되는지를 알아보겠습니다.
자바 클래스
- 자바는 객체지향언어로써 ‘클래스’로 이루어져 있습니다.
- JVM, JRE, JDK 를 이해하기 전 클래스가 어떻게 구성되었는지 반드시 알아야 합니다.
클래스란
- 클래스는 ‘템플렛’ 이라고 말할 수 있습니다.
- 즉 같은 걸 여러 개 만들 수 있는거죠
클래스 생성하기
class Country {
//methods
}
- 이와 같이 클래스를 정의할 수 있습니다.
- class 는 Country 라는 유형을 정의한 것입니다.
- int num = 1 과 같이 말이죠
오브젝트
- Country라는 클래스가 있을 때 India, USA, Korea 등 과 같은 나라들을 만들 수 있겠죠
- 여기서 Country는 클래스, India, USA, Korea 는 오브젝트들이 됩니다.
오브젝트 생성하기
Country India = new Country();
Country USA = new Country();
Country Korea = new Country();
- India, USA, Korea는 Country 형의 오브젝트입니다
- 즉, 형이든 클래스든 둘 다 Country를 뜻함
- 보통 클래스에서는 데이터, 메서드가 있으며 메서드로 클래스의 데이터에 작업을 할 수 있습니다.
메서드
- 클래스들에 행해질 수 있는 행동 (전글 참조)
class Country {
void sayHello(){
System.out.println("Hello!!!")
}
}
Country India = new Country();
Country USA = new Country();
Country Korea = new Country();
Korea.sayHello();
- 이렇게 하면 오브젝트도 클래스에 정의된 메서드를 사용할 수 있습니다
⚠️ 주의
클래스이름.메소드 는 에러를 일으킵니다
컴파일 과정
자바 코드 → 파일로 만듦 → 컴파일 → 바이트코드
(터미널이 불가하여 글로 대체하겠습니다… 양해부탁드려요)
class Country {
void sayHello(){
System.out.println("Hello!!!")
}
}
- 이 파일을 가지고 컴파일한다고 가정해보겠습니다
- 컴파일 명령어는 javac 파일명
- *.java 파일을 컴파일하면 *.class 로 컴파일되어 새로운 파일이 생깁니다.
- 이 클래스 파일이 바이트코드를 담고 있습니다
- 실행하고 싶다면
- java 클래스의 이름
- *.class 의 파일을 사용한다
- java 클래스의 이름
- 다시 정리하자면
*.java -> 컴파일 -> *.class 생성 -> java *이 *.class를 실행하려고 할 것이다
- 그러나 이렇게 실행 시 오류가 발생할텐데 컴파일하고 실행해야하는데 실행하려면 공용 정적 보이드 메인이 필요하다 (JShell 외에서)
- 공허는 메서드가 아무것도 반환하지 않았고 메인은 메서드의 이름이고 String[] args 인수들 입니다
- 문자열,대괄호는 인수의 배열이라는 걸 뜻 합니다
- public static void main(String[] args) {}
package project;
class Country{
void sayHello() {
System.out.println("Hello");
}
public static void main(String[] args) {
Country Korea = new Korea();
Korea.sayHello();
}
}
- 최종적으로 이렇게 바꿨음에도 아직 오류가 뜰 겁니다.
- 이는, *.class 파일이 실행되고 있기 때문인데 *.java를 컴파일하고 다시 *.class 파일을 실행하면 해결 가능합니다
⚠️주의사항
- 자바 파일은 메인 메서드가 있어야 실행되는데 어떤 것을 추가하거나 어떤 변화라도 준다면 다시 꼭 컴파일해야만 변화가 적용됩니다
- javac(자바 컴파일)를 실행하려면 *.java 가 있는 폴더와 똑같은 곳에 있어야 합니다
JVM, JRE, JDK 함께 보기

JVM (Java Virtual Machine)
- 바이트코드를 운영체제의 특정한 명령으로 바꿔주는 소프트웨어
- 그러니 윈도우 JVM, 유닉스 JVM, 리눅스 JVM 모두 제각각 다릅니다
- 이것들이 할 수 있는 건 바이트코드를 가져다가 특정한 운영 체제가 명령을 실행할 수 있도록 바꾸는 것
- 다시 말하자면 JVM이 바이트 코드를 기반으로 코드를 실행하는데 그걸 위해서 JVM이 바이트코드를 기계 명령으로 바꾸는 것
- ⇒ 운영체제가 이해하기 쉽게
JRE(Java Runtime Environment, 자바 실행 환경)
- JVM + Libraries + Other Components
- 어떤 자바 프로그램을 예로 들어도 기본적으로 내재되어 있는 자바 클래스가 몇 개는 필요
- System.out.println 은 자바 라이브러리 안에 있음
- 어떤 자바 라이브러리든 어떤 자바 클래스가 필요하든 여기에 포함되어 있을 것
- JRE, 자바 실행 환경은 JVM과 내재된 모든 자바 클래스를 합친 것
JDK(Java Development Kit)
- JRE + Compilers + Debuggers
- JRE, JVM 하고 자바 라이브러리가 더해진 거고 모든 컴파일러와 디버거가 합쳐진 것
- 전체가 자바 프로그램을 개발하고, 컴파일하고 실행시킬 때까지 필요한 것들이라는 것
- JDK는 자바 프로그램을 개발하고 실행할 때 필요하고 JRE는 자바 프로그램을 실행할 때 필요하고 그리고 모든 자바 프로그램은 JVM을 이용해서 실행
참고
https://velog.io/@hyhy9501/섹션5-자바-플랫폼-소개
https://www.geeksforgeeks.org/java/jdk-in-java/
https://www.geeksforgeeks.org/java/java-platform-independent/
https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EB%B0%94%EC%9D%B4%ED%8A%B8%EC%BD%94%EB%93%9C
'Programming Language > Java' 카테고리의 다른 글
| [WIL] 자바 주간 회고 (0) | 2025.10.13 |
|---|---|
| [TIL] 자바 개발자를 위한 IDE 비교표 (Eclipse, VS Code, JShell, Web IDE) (0) | 2025.10.09 |
| [TIL] 자바 메서드 (0) | 2025.10.07 |
| [TIL] 자바 IF 조건문 그리고 For 반복문 (0) | 2025.10.06 |
| [TIL] 자바 변수 이해하기 (0) | 2025.10.05 |