python에 이어 두번째 프로그래밍 언어..!!
한국어와 함께 3개 국어 학생이 되어보쟈..ㅋ (영어도 제발)

들어가기 앞서서,
python 로고가 뱀인 것처럼.. java 로고가 커피인 이유가 궁금했는데
원래 이름은 'Oak'였는데, 상표권 이슈로 개발자들이 자주 마시던 자바 커피에서 이름을 따온 거라고 한다.
역시.. 개발자들은 커피를 달고 사는 운명인가부다..


1. 컴퓨터 프로그래밍 언어

1.1 프로그래밍 언어


  1. 기계어 (Low-level Language)
    • 0,1 이진수로 된 언어
    • cpu는 기계어만 이해함
  2. 어셈블리어 (Low-level Language)
    • 기계어 명령을 단어/기호로 매핑시킨 것
    • ex) ADD, SUB, MOVE
  3. 고급 언어 (High-level Language)
    • 사람이 인지할 수 있는 언어
    • ex) java, C++, python
    • 절차 지향 언어 / 객체 지향 언어

1.2 컴파일 (Compile)


고급 언어로 작성된 소스 파일은 컴퓨터가 이해할 수 없으므로 번역 과정이 필요

전통적인 컴파일 (C, C++, Rust 등)

  • "소스파일을 컴퓨터가 이해할 수 있는 기계어로 만드는 과정"
  • 과정: 소스 코드(.c) → (컴파일러) → 기계어(.exe, .obj)
  • 특징: 중간 단계 없이 바로 CPU가 이해할 수 있는 0과 1로 번역

가상 머신 기반 컴파일 (Java, C# 등)

  • Java나 C# 같은 언어들은 '플랫폼 독립성'을 위해 한 단계를 더 둠. (따라서 정의가 살짝 다름)
  • "JVM이 이해할 수 있는 기계어(바이트코드)로 만드는 과정"
  • 과정: 소스 파일(.java) → (컴파일러)타겟 파일(.class) → (JVM 실행 시, → 기계어)
    • 소스 파일 : 프로그래밍 언어로 작성된 텍스트 파일 .java
    • 컴파일(Compile) : 소스파일을 컴퓨터가 이해할 수 있는 기계어로 만드는 과정
    • 타겟 파일 : 바이트(Byte)화 된 코드로 이루어져 있음 .class
  • 특징: Java에서는 컴파일 결과물을 실행해도 CPU가 바로 알아듣지 못하고 JVM이 한 번 더 통역해줘야 함

cf) 컴파일 vs 인터프리트

  • ‘컴파일’ : 코드를 미리 번역해두는 언어
  • ‘인터프리트’ : 실시간으로 해석하는 언어

⇒ 자바는 '컴파일' 언어의 특성과 인터프리트' 언어의 특성을 모두 가지고 있음.


2. 자바 프로그래밍


  • 과정: 소스 파일(.java) → (컴파일러javac)타겟 파일(.class) → (JVM 실행 시, → 기계어)
  • 자바의 컴파일러 : javac
  • 소스 파일 확장자 & 컴파일 된 파일 확장자
    • 자바 : .java.class
  • 소스 파일 이름 & 컴파일 된 파일 이름
    - 소스 파일의 ‘클래스 이름’과 동일

2.2 자바의 플랫폼 독립성 🌟


한 번 작성하면 어디서든 실행된다(Write Once, Run Anywhere)”

  • 일반적인 C++ 등의 프로그램은 하드웨어에서 직접 실행해서 각기 다른 운영체제에 맞춰서 컴파일해야 하는 반면,
  • Java는 JVM을 사용하여 가상으로 실행 가능하기 때문에, 운영체제에 관계없이 독립적으로 실행 가능

Java 실행 과정

JB = Java Bytecode(자바 바이트코드) = 컴파일된 .class 파일
출처 : https://youtu.be/OxvtGYvVkRU?si=M2vodliACaAZfkpu

  • Platform (=Hardware + OS) 위에 → JVM만 있으면 .class 파일(=바이트 코드, 타겟 파일)이 실행됨
  • Hardware 위에 → OS 위에 → JVM을 설치하면 그 위에서 Java .class파일이 실행됨
  • JVM 실행 = ".class 파일이 실행된다" JVM이라는 통역사가 .class라는 공통 설계도를 보고, 당신의 컴퓨터(Windows, Mac 등)에 딱 맞는 기계어로 실시간 통역하여 CPU에게 일을 시킨다

2.3 JVM (Java Virtual Machine)


  • OS에 맞는 JVM이 설치되어 있다면, 동일한 .class 파일을 어디서든 그대로 실행할 수 있음
  • 동적 로딩(Dynamic Loading): 실행 중 필요한 시점에 클래스를 로드하여 메모리 효율적임

JVM 실행 과정

.class 파일이 실행되는 순간, JVM은 실행

  1. 클래스 로딩 (Loading): 필요한 .class 파일을 메모리에 올림
  2. 검증 (Verifying): 이 파일이 혹시 해킹된 건 아닌지, 문법에 오류는 없는지 깐깐하게 검사
  3. 실행 (Executing): JVM이 바이트코드를 읽어서 컴퓨터의 CPU가 알아들을 수 있는 기계어로 실시간 번역하며 명령

2.4 (실습). 자바 프로그램 작성 및 실행


우리가 Hello.java를 작성하고
javac로 컴파일하면, 바이트 코드가 담긴 .class 파일이 생성되는데, 이것이 컴파일 과정의 타겟 파일

  1. 자바 파일 생성 (Hello.java를 작성)

    public class Hello {   // ① public '클래스' (파일당 1개만 가능)
    	public static void main(String[] args) {   // ② public '메서드' (여러 개 가능)
    		System.out.println("Hello, World!"); 
    	}
    }
    • 자바 파일 구조 및 규칙
      • Java의 코드는 대부분 클래스로 구성됨
      • public class : 한 파일에 하나 있는 게 좋음
        • class명 : 대문자로 시작, 소스파일명과 동일해야 함.
      • main: 시작하는 위치

  1. 자바 파일 컴파일 (javac)

    javac Hello.java  //컴파일하는 코드 "javac {파일명}.java"
    • 소스코드 → 바이트 코드
    • javac Hello.javaHello.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
  1. JVM실행 (java)

    = .class 파일 실행

    java Hello //JVM 실행 코드 "java {파일명}"
    • 바이트 코드 → 기계어
    • JVM이 바이트코드를 읽어서 컴퓨터의 CPU가 알아들을 수 있는 기계어로 실시간 번역하며 명령을 내림
    10110010 00000000 00000010...

(추가) 디어셈블

javap -c Hello > Helloc.bc 
// javap -c {컴파일된 class파일의 파일명} > {저장할 파일명}.bc
// JDK의 javap.exe 사용
// 디어셈블된 결과 Hello.bc파일 생성
  • 컴파일 된 .class 파일의 내용을 텍스트로 변환
  • 즉, 클래스 파일에 있는 바이트 코드를 → just “텍스트”(소스코드X)로 볼 수 있게 하는 작업
  • 대상: .class 파일 (이진수 바이트코드)
  • 결과: JVM 명령어 (예: aload_0, getstatic, invokevirtual)
  • 사용 도구: JDK에 포함된 javap
  • 목적: JVM이 내부적으로 어떻게 동작하는지 분석할 때, 코드가 어떻게 최적화되었는지 확인하고 싶을 때

(추가) 디컴파일

  • 컴파일된 .class 파일을 다시 .java 소스 코드로 복구
  • 클래스 파일에 있는 바이트 코드를 → 소스코드로 볼 수 있게 하는 작업
  • 대상: .class 파일 (이진수 바이트코드)
  • 결과: .java 소스 코드 (예: public class Hello { ... })
  • 사용 도구: JD-GUI, Jad, 또는 IntelliJ IDEA(자동 지원)
  • 목적: 소스 코드를 분실했을 때 복구하기 위해, 다른 사람이 만든 라이브러리(.jar)가 어떻게 짜였는지 공부할 때

3. 자바 vs C++: 동작 방식 비교

자바 (Java)C++
번역물바이트 코드 (.class)해당 OS 전용 기계어 (.exe, .obj)
실행 방식JVM 위에서 가상으로 실행하드웨어에서 직접 실행 (Native)
로딩 방식동적 로딩(Dynamic Loading): 실행 중 필요한 시점에 클래스를 로드하여 메모리 효율적임정적 로딩(Static Loading): 컴파일/링크 시점에 이미 결정됨
이식성매우 높음 (JVM만 있으면 어디서든 실행)낮음 (플랫폼 변경 시 다시 컴파일/링크 필요)
보안 및 관리JVM이 메모리를 관리하여 상대적으로 안전하드웨어 직접 제어로 성능은 좋으나 보안에 취약할 수 있음

JAVA


  • 컴파일러가 바로 바이트코드한 후 링크 과정없음
  • 바이트코드는JVM에서만실행 가능
  • 자바는 필요한 클래스들을 프로그램 실행 중에 동적으로 로딩
  • 동적로딩은 JVM에 포함된 클래스 로더에 의해 이루어짐
    • 동적 : 실행 시에
    • 정적(static) : 컴파일 시에 메모리에
  • ClassLoader 클래스를 이용하여 개발자가 직접 클래스 로딩 가능

C++


  • 목적 코드 및 실행 파일은 플랫폼에 따라 다름
  • 플랫폼이 바뀌거나 다른플랫폼에서 실행시키려면 다시 컴파일 및 링크
    → 보안에 약함
profile
서비스기획/.AI/데이터분석

0개의 댓글