사람을 사랑한 기술
- 1.1 기계어에서 객체 지향까지
- 1.2 어셈블리어의 등장
- 1.3 C 언어와 구조적 프로그래밍
- 1.4 C++과 객체 지향의 시작
- 1.5 자바의 등장과 가상 머신
- 1.6 신기술은 언제나 사람을 위한 것
프로그래밍 언어의 역사는 결국 한 문장으로 요약돼 — "기계를 사람에게 맞추는 과정".
처음엔 0과 1뿐인 기계어로 직접 CPU한테 말을 걸어야 했어. 사람이 "화면에 A를 출력해"라고 생각하는데, 기계는 레지스터 주소와 점프 명령을 원하거든. 이 간극이 너무 고통스러우니까 어셈블리어가 나왔지. MOV, ADD 같은 약어를 쓰면 어셈블러가 기계어로 바꿔주는 거야. 그래도 CPU 아키텍처마다 어셈블리가 달라서 기계 종속성 문제는 여전했어.
그 다음 등장한 게 C 언어야. 함수 단위로 코드를 쪼개고, if/else, for 같은 제어 구조로 흐름을 잡는 구조적 프로그래밍을 실현했지. "어셈블리의 힘 + 고수준 언어의 표현력"이라는 조합 덕분에 Unix도 C로 만들어졌고, 지금까지도 시스템 프로그래밍에서 쓰이고 있어. 근데 프로그램이 커지면서 문제가 드러나. 데이터와 함수가 분리되어 있으니까, 전역 변수가 여기저기서 수정되고 사이드 이펙트 추적이 불가능해지는 거야.
그래서 "데이터와 그 데이터를 다루는 함수를 하나로 묶자"는 발상이 나오고, **C++**이 객체 지향 프로그래밍을 들고 등장해. 클래스, 캡슐화, 상속, 다형성 — 현실 세계의 사물을 코드에 반영하려는 시도였어. 근데 C와의 호환성을 유지하면서 포인터, 수동 메모리 관리 같은 복잡함은 그대로 남았지.
최종적으로 1995년에 자바가 나와. JVM으로 플랫폼 종속성을 해결하고, 가비지 컬렉터로 메모리 관리를 자동화하고, 포인터를 아예 빼버렸어. "메모리 걱정하지 마, 플랫폼 걱정하지 마, 비즈니스 로직에만 집중해라" — 이게 자바의 철학이야. 기계어부터 자바까지, 매번 한 단계씩 추상화 수준이 올라간 거거든. 이 흐름을 모르면 캡슐화가 왜 필요한지, 다형성이 뭘 해결하는지 답할 수가 없어. 객체 지향과 스프링은 뜬금없이 나온 게 아니라, 수십 년간 "사람이 더 편하게"라는 방향으로 진화해온 결과물이야.
정리
1장 읽고 기억할 거 세 가지:
- 프로그래밍 언어의 발전 = 추상화 수준의 상승. 기계어 → 어셈블리어 → C → C++ → 자바로 오면서, 사람이 기계의 동작 방식을 신경 쓰지 않아도 되는 방향으로 진화해왔다
- 객체 지향은 "데이터와 함수를 묶자"는 아이디어에서 출발했다. C에서 분리되어 있던 데이터와 함수를 하나의 클래스로 묶으면서 현실 세계를 코드에 반영할 수 있게 됐다
- 자바는 JVM, GC, 포인터 제거로 프로그래머를 기계적 디테일에서 해방시켰다. 이 철학이 스프링까지 이어진다