C언어와 Java 언어 동작 방식
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) | 실행 시에 라이브러리를 외부에서 로드. (파일 크기 작음, 실행 속도 약간 느림) |
📌 예제
- main.o, util.o 파일과 표준 수학 라이브러리를 링크하여 myprogram 실행 파일을 생성.
3. 빌드(Build)
빌드는 소스 코드 → 실행 파일을 만드는 전체 과정을 의미해.
즉, 프리프로세싱 + 컴파일 + 어셈블 + 링킹 과정이 포함됨.
📌 빌드 명령어 예제
이 과정에서 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 컴파일 예제
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, 오버라이딩) |
📌 예제
- 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이 이를 실행해! 🚀