[TIL] 자바 플랫폼 독립 (+ 클래스)

2025. 10. 8. 16:38·Programming Language/Java

GeeksforGeeks

컴퓨터는 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 -> 컴파일 -> *.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 함께 보기 

GeeksforGeeks

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
'Programming Language/Java' 카테고리의 다른 글
  • [WIL] 자바 주간 회고
  • [TIL] 자바 개발자를 위한 IDE 비교표 (Eclipse, VS Code, JShell, Web IDE)
  • [TIL] 자바 메서드
  • [TIL] 자바 IF 조건문 그리고 For 반복문
dev_Hyeonjoon
dev_Hyeonjoon
문제를 풀며 사람들에게 감동✨을 전하고 가치를 만드는 개발자가 되고 싶습니다 💻
  • dev_Hyeonjoon
    Hyeonjoon's code
    dev_Hyeonjoon
  • 전체
    오늘
    어제
    • 분류 전체보기 (50)
      • Programming Language (29)
        • JavaScript (0)
        • Java (27)
      • Front-end (10)
        • React-project (5)
        • Vanilla[JS]-project (5)
        • study (0)
      • AI Tools (1)
      • Back-end (0)
      • 독서록 (0)
      • 기타 (5)
      • Trouble Shooting (2)
        • Python (1)
      • 자격증 (1)
      • 알고리즘 (1)
        • 백준 (1)
      • FrameWork (0)
        • Node.js (Express.js) (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    객체지향
    자바기초
    파이썬
    군자기계발
    바닐라js
    자바공부
    조건문
    토이프로젝트
    사지방코딩
    자바
    군대에서코딩
    Java
    형변환
    코딩
    구름IDE
    사지방
    리액트
    OOP
    Til
    vanillajs
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
dev_Hyeonjoon
[TIL] 자바 플랫폼 독립 (+ 클래스)
상단으로

티스토리툴바