python에 이어 두번째 프로그래밍 언어..!!
한국어와 함께 3개 국어 학생이 되어보쟈..ㅋ (영어도 제발)
들어가기 앞서서,
python 로고가 뱀인 것처럼.. java 로고가 커피인 이유가 궁금했는데
원래 이름은 'Oak'였는데, 상표권 이슈로 개발자들이 자주 마시던 자바 커피에서 이름을 따온 거라고 한다.
역시.. 개발자들은 커피를 달고 사는 운명인가부다..

ADD, SUB, MOVEjava, C++, python고급 언어로 작성된 소스 파일은 컴퓨터가 이해할 수 없으므로 번역 과정이 필요
전통적인 컴파일 (C, C++, Rust 등)
.c) → (컴파일러) → 기계어(.exe, .obj)가상 머신 기반 컴파일 (Java, C# 등)
.java) → (컴파일러) → 타겟 파일(.class) → (JVM 실행 시, → 기계어).java.classcf) 컴파일 vs 인터프리트
- ‘컴파일’ : 코드를 미리 번역해두는 언어
- ‘인터프리트’ : 실시간으로 해석하는 언어
⇒ 자바는 '컴파일' 언어의 특성과 인터프리트' 언어의 특성을 모두 가지고 있음.
.java) → (컴파일러javac) → 타겟 파일(.class) → (JVM 실행 시, → 기계어)javac.java → .class한 번 작성하면 어디서든 실행된다(Write Once, Run Anywhere)”

JB = Java Bytecode(자바 바이트코드) = 컴파일된 .class 파일
출처 : https://youtu.be/OxvtGYvVkRU?si=M2vodliACaAZfkpu
.class 파일(=바이트 코드, 타겟 파일)이 실행됨.class파일이 실행됨.class 파일이 실행된다" JVM이라는 통역사가 .class라는 공통 설계도를 보고, 당신의 컴퓨터(Windows, Mac 등)에 딱 맞는 기계어로 실시간 통역하여 CPU에게 일을 시킨다.class 파일을 어디서든 그대로 실행할 수 있음.class 파일이 실행되는 순간, JVM은 실행
.class 파일을 메모리에 올림우리가 Hello.java를 작성하고
→ javac로 컴파일하면, 바이트 코드가 담긴 .class 파일이 생성되는데, 이것이 컴파일 과정의 타겟 파일
자바 파일 생성 (Hello.java를 작성)
public class Hello { // ① public '클래스' (파일당 1개만 가능)
public static void main(String[] args) { // ② public '메서드' (여러 개 가능)
System.out.println("Hello, World!");
}
}

자바 파일 컴파일 (javac)
javac Hello.java //컴파일하는 코드 "javac {파일명}.java"
javac Hello.java → Hello.class (바이트 코드) 생성public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String Hello
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return

컴파일된 경우의 확장자는 class
JVM실행 (java)
= .class 파일 실행
java Hello //JVM 실행 코드 "java {파일명}"
10110010 00000000 00000010...
javap -c Hello > Helloc.bc
// javap -c {컴파일된 class파일의 파일명} > {저장할 파일명}.bc
// JDK의 javap.exe 사용
// 디어셈블된 결과 Hello.bc파일 생성
.class 파일의 내용을 텍스트로 변환.class 파일 (이진수 바이트코드)aload_0, getstatic, invokevirtual)javap.class 파일을 다시 .java 소스 코드로 복구.class 파일 (이진수 바이트코드).java 소스 코드 (예: public class Hello { ... })| 자바 (Java) | C++ | |
|---|---|---|
| 번역물 | 바이트 코드 (.class) | 해당 OS 전용 기계어 (.exe, .obj) |
| 실행 방식 | JVM 위에서 가상으로 실행 | 하드웨어에서 직접 실행 (Native) |
| 로딩 방식 | 동적 로딩(Dynamic Loading): 실행 중 필요한 시점에 클래스를 로드하여 메모리 효율적임 | 정적 로딩(Static Loading): 컴파일/링크 시점에 이미 결정됨 |
| 이식성 | 매우 높음 (JVM만 있으면 어디서든 실행) | 낮음 (플랫폼 변경 시 다시 컴파일/링크 필요) |
| 보안 및 관리 | JVM이 메모리를 관리하여 상대적으로 안전 | 하드웨어 직접 제어로 성능은 좋으나 보안에 취약할 수 있음 |