스프링 입문을 위한 자바 객체 지향의 원리와 이해 1장 - 사람을 사랑한 기술, Java 역사 이야기
안녕하세요! 오늘은 자바의 탄생 배경과 발전 과정에 대해 이야기해보려고 합니다. 프로그래밍 언어의 역사를 통해 자바가 왜 '사람을 사랑한 기술'이라고 불리는지 함께 알아보겠습니다.
🖥️ 기계어에서 객체 지향 프로그래밍 언어로
기계어 - 0과 1의 행진
프로그래밍의 시작은 기계어였습니다. 인류 최초의 프로그래머들은 꺼진 상태와 켜진 상태를 0과 1로 해석할 수 있는 '백열전구'를 이용해 프로그램을 작성했습니다.
💡 역사적 의미
- 애드삭(EDSAC): 2진법을 적용한 세계 최초의 프로그램 내장 방식 전자 계산기
- 유니박(UNIVAC): 최초의 상업용 컴퓨터
흥미로운 점은 프로그래밍 언어들이 서로를 모방하고 창조하면서 발전했다는 것입니다:
- 애드삭: 기계어
ADD - 유니박: 기계어
PLUS - Java 진영:
System.out.println(),JDBC,ResultSet - Microsoft 진영:
Console.WriteLine(),ODBC,RecordSet
🔍 용어 정리
- JDBC: Java Database Connectivity
- ODBC: Open Database Connectivity
어셈블리어 - 인간 지향으로의 첫 걸음
기계어의 0과 1 행진을 벗어나 어셈블리어가 등장했습니다. 이는 기계어의 니모닉(기억하기 쉬운 기호)으로, 인간이 이해하기 쉬운 형태로 발전했습니다.
어셈블러는 어셈블리어를 기계어로 번역해주는 소프트웨어입니다.
🧠 컴퓨터의 데이터 저장 방식: 엔디안(Endian)
컴퓨터가 메모리에 데이터를 저장하는 방식에는 두 가지가 있습니다:
1. 빅엔디안 (Big-Endian)
- RISC CPU에서 사용
- 낮은 주소에 데이터의 높은 바이트(MSB)부터 저장
- 평소 우리가 숫자를 사용하는 선형 방식과 동일 (이해하기 쉬움)
예시: 0x12345678
→ 0x12 / 0x34 / 0x56 / 0x78 (순서대로 저장)
2. 리틀엔디안 (Little-Endian)
- 인텔 CPU에서 사용
- 낮은 주소에 데이터의 낮은 바이트(LSB)부터 저장
- 평소 우리가 사용하는 방식과 반대로 거꾸로 읽음
💡 실무에서의 중요성
- 인텔 기반 운영체제: 리틀 엔디안 방식 사용
- 네트워크 데이터 전송: 빅 엔디안 방식 사용
C언어 - 강력한 이식성의 시작
C언어는 "One Source Multi Object Use AnyWhere"라는 철학을 가지고 등장했습니다.
하나의 소스 파일을 각 기계에 맞는 컴파일러로 컴파일하여 다양한 플랫폼에서 실행할 수 있게 했습니다. 다만, 운영체제마다 소스 수정 과정이 필요했다는 한계가 있었습니다.
C++언어 - 객체 지향의 도입
C언어에 객체 지향 개념을 도입한 C++언어가 등장했습니다. 이는 인간적인 사고의 프로그래밍 방식으로, 프로그래밍 패러다임의 큰 전환점이 되었습니다.
☕ Java - 진정한 객체 지향 언어
"Write Once One Object Use AnyWhere"
Java는 "사람을 사랑한 방법"으로 프로그래밍을 더욱 인간적이고 안전하게 만들었습니다.
🎯 Java의 혁신적 특징
- 컴파일러를 기종별로 준비할 필요 없음
- 단, JRE(Java Runtime Environment)만 설치하면 됨
- JVM(Java Virtual Machine)
- 플랫폼 독립성 보장
- 포인터 제거
- 메모리 관리의 복잡성과 위험성 제거
📊 C언어 vs Java 비교
| 구분 | C | Java |
|---|---|---|
| 소스 파일 | One Source | One Source |
| 목적 파일 | Multi Object | One Object |
| 실행 | Use AnyWhere | Use AnyWhere |
🏗️ JDK, JRE, JVM의 관계

Java 생태계를 이해하기 위해 핵심 구성 요소들의 관계를 알아보겠습니다:
| 구분 | JDK (Java Development Kit) |
JRE (Java Runtime Environment) |
JVM (Java Virtual Machine) |
|---|---|---|---|
| 목적 | Java 개발 도구 제공 | Java 실행 환경 제공 | Java 바이트 코드 실행 |
| 구성 요소 | JRE + 컴파일러(javac), 디버거 등 | JVM + 라이브러리(API 클래스) | 클래스 로더, 실행 엔진, 메모리 영역 |
| 포함 관계 | JDK ⊃ JRE ⊃ JVM | JRE ⊃ JVM | - |
| 예시 | Java 코드 컴파일 및 실행 | .jar 파일 실행 | 바이트코드를 기계어로 변환하여 실행 |
💡 간단 정리
- JVM: Java 프로그램이 돌아가는 가상 컴퓨터 (핵심 엔진)
- JRE: JVM + 자바 프로그램 실행에 필요한 기본 라이브러리
- JDK: JRE + 개발도구 (개발자용 풀 패키지)
🔄 Java 프로그램 실행 과정
Java 프로그램이 어떻게 실행되는지 단계별로 살펴보겠습니다:
- 소스 코드 작성
Main.java파일 생성
- 컴파일 과정
- 컴파일러가 Java 소스 코드를 클래스 파일로 생성
- 컴파일된 클래스 파일은 JVM이 인식 가능한 바이트 코드
- 실행 과정
- JVM이 클래스 파일의 바이트 코드를 해석
- 바이너리 코드로 변환하여 프로그램 수행
🎯 백문이 불여일타 - 실제 확인해보기
- Java 소스 코드 작성 (Hello 클래스, main 메서드, System.out.println)
- 소스 코드 파일을 컴파일 →
javac명령어 사용- 생성된 클래스 파일을 JVM으로 실행 →
java명령어 사용- 클래스 파일을 바이너리 코드로 변환 → 프로그램 수행

📝 마무리
자바의 역사를 통해 우리는 프로그래밍 언어가 어떻게 '기계 중심'에서 '사람 중심'으로 발전해왔는지 볼 수 있습니다.
기계어의 0과 1에서 시작해 어셈블리어, C언어, C++을 거쳐 Java에 이르기까지, 각 단계마다 프로그래머의 편의성과 안전성을 높이려는 노력이 있었습니다.
특히 Java는 "Write Once, Run Anywhere"라는 철학으로 플랫폼 독립성을 실현했고, 포인터 제거를 통해 메모리 안전성을 확보했습니다. 이러한 특징들이 Java를 '사람을 사랑한 기술'로 만든 핵심 요소라고 할 수 있습니다.
다음 포스트에서는 객체 지향 프로그래밍의 핵심 개념들에 대해 더 자세히 다뤄보겠습니다. 기대해 주세요! 😊
참고 자료: 스프링 입문을 위한 자바 객체 지향의 원리와 이해 (김종민 저)
'CS > Java' 카테고리의 다른 글
| [Java] String은 참조형인데 왜 값이 안 바뀔까? – Pass by Value 와 Immutable (1) | 2026.01.08 |
|---|---|
| [Java] 스프링 입문을 위한 자바 객체 지향의 원리와 이해 2장 - 자바와 절차적/구조적 프로그래밍 - T메모리 (0) | 2025.06.23 |