미국유학/CS686 DevOps

C언어와 Java 언어 동작 방식

kwohyuno 2025. 2. 20. 04:15

1. C 언어의 동작 방식

C 언어는 **소스 코드(.c)**를 작성한 후 **컴파일러(gcc, clang 등)**를 사용하여 기계어로 변환한 후 실행 파일(.exe)을 만든다.

🔹 C 프로그램이 실행되기까지

1️⃣ 프리프로세서(전처리, Preprocessing)

  • #include, #define 같은 전처리 지시문을 처리.
  • stdio.h 같은 헤더 파일을 불러와서 실제 코드에 포함시킴.
  • 결과: 임시 확장된 소스 코드(.i) 생성

2️⃣ 컴파일(Compile)

  • .c 파일을 어셈블리 코드(.s)로 변환.
  • C 코드를 CPU가 이해할 수 있는 저수준 언어(어셈블리)로 변환.
  • 결과: 어셈블리 파일(.s) 생성

3️⃣ 어셈블(Assemble)

  • 어셈블리 코드를 바이너리(목적 코드, Object Code, .o)로 변환.
  • CPU가 직접 실행할 수 있는 기계어(Binary)로 변환됨.
  • 결과: 목적 파일(Object File, .o) 생성

4️⃣ 링킹(Linking)

  • 여러 .o 파일과 C 라이브러리를 묶어서 실행 파일 생성.
  • 동적 또는 정적 라이브러리 연결.
  • 결과: 최종 실행 파일(.exe, ELF 등) 생성

2. 링킹 (Linking)

링킹이란 여러 개의 개별적인 목적 파일(.o)과 라이브러리를 결합하여 실행 파일을 만드는 과정이야.
C에서는 크게 두 가지 방식이 있어.

방식설명

정적 링킹 (Static Linking) 실행 파일에 모든 라이브러리를 포함. (파일 크기가 커짐, 실행 속도 빠름)
동적 링킹 (Dynamic Linking) 실행 시에 라이브러리를 외부에서 로드. (파일 크기 작음, 실행 속도 약간 느림)

📌 예제

sh
CopyEdit
gcc -o myprogram main.o util.o -lm # -lm은 수학 라이브러리(math.h)
  • main.o, util.o 파일과 표준 수학 라이브러리를 링크하여 myprogram 실행 파일을 생성.

3. 빌드(Build)

빌드는 소스 코드 → 실행 파일을 만드는 전체 과정을 의미해.
즉, 프리프로세싱 + 컴파일 + 어셈블 + 링킹 과정이 포함됨.

📌 빌드 명령어 예제

sh
CopyEdit
gcc -o myprogram main.c util.c

이 과정에서 main.c, util.c가 컴파일되고, 목적 파일 .o가 생성된 후, 최종적으로 실행 파일 myprogram이 만들어짐.


4. Java의 동작 방식

Java는 C와 다르게 실행 파일(.exe)을 만들지 않고, 바이트코드(.class)를 실행하는 방식이야.

🔹 Java 프로그램이 실행되기까지

1️⃣ Java 컴파일러(javac)로 .java  .class(바이트코드) 변환 2️⃣ JVM(Java Virtual Machine)이 바이트코드를 실행 3️⃣ JIT(Just-In-Time) 컴파일러가 바이트코드를 기계어로 변환하여 실행

📌 Java 컴파일 예제

sh
CopyEdit
javac Main.java # Main.class 생성 (바이트코드) java Main # JVM이 실행

5. 클래스 로더 (ClassLoader, Java 전용 개념)

Java는 실행 시 .class(바이트코드)를 JVM이 로드해야 해.
이때 사용되는 것이 **클래스 로더(ClassLoader)**야.

클래스 로더의 역할

  • Java 실행 시 필요한 클래스(.class)를 로드.
  • Class.forName("java.util.ArrayList") 같은 동적 로딩 지원.
  • Reflection을 사용하면 ClassLoader를 거쳐야 해서 성능 저하 가능.

📌 자주 사용되는 클래스 로더 종류

클래스 로더역할

Bootstrap ClassLoader Java 기본 클래스(java.lang.String) 로드
Extension ClassLoader ext/ 폴더의 추가 라이브러리 로드
Application ClassLoader 클래스패스의 .jar, .class 로드

6. 동적 바인딩 (Dynamic Binding)

바인딩(Binding): 변수나 메서드 호출이 실행될 때 어떤 객체 또는 코드와 연결되는 과정.

유형설명

정적 바인딩(Static Binding) 컴파일 시점에 어떤 메서드가 호출될지 결정 (private, final 메서드)
동적 바인딩(Dynamic Binding) 실행 시점에 어떤 메서드가 호출될지 결정 (virtual method, 오버라이딩)

📌 예제

java
CopyEdit
class Parent { void show() { System.out.println("Parent"); } } class Child extends Parent { void show() { System.out.println("Child"); } } public class Main { public static void main(String[] args) { Parent obj = new Child(); // 동적 바인딩 obj.show(); // 실행 결과: "Child" } }
  • Parent obj = new Child(); → 부모 타입으로 참조하지만 show()는 오버라이딩된 메서드 실행 (동적 바인딩).

7. EXE 파일 vs 바이트코드

개념설명

EXE 파일 (C 언어) 기계어로 변환된 실행 파일. OS & CPU 아키텍처에 종속적.
바이트코드 (Java) JVM이 실행하는 중간 코드(.class). 플랫폼 독립적.

📌 Java는 EXE 대신 바이트코드를 사용하여 "Write Once, Run Anywhere" 가능!


🚀 정리

개념C 언어Java

컴파일 과정 .c  .o  .exe .java  .class (바이트코드)
실행 방식 OS에서 직접 실행 JVM이 실행
링킹 방식 정적/동적 링크 클래스 로더로 동적 로딩
파일 타입 실행 파일(.exe) 바이트코드(.class)
바인딩 대부분 정적 바인딩 동적 바인딩(오버라이딩 지원)

💡 즉, C는 실행 파일(.exe)을 생성하여 직접 실행하는 반면, Java는 바이트코드를 생성하고 JVM이 이를 실행해! 🚀

댓글수0