프로그래밍 언어 지도
서론
왜 이렇게 많은 프로그래밍 언어가 있을까요? 어떤 것을 배워야 할까요? 이 장에서는 "언어의 진화"부터 "프로그래밍 패러다임"까지, 그리고 "선택 방법"까지, 프로그래밍 언어에 대한 전체적인 이해를 구축합니다. 결론부터 말하면: 최고의 언어는 없고, 상황에 가장 적합한 언어만 있습니다.
이 글에서 무엇을 배우게 되나요?
이 장을 마치면 다음을 얻게 됩니다:
- 합리적 선택 능력: "어떤 언어를 배울까"에 직면했을 때, 프로젝트 요구에 따라 판단할 수 있고 맹목적으로 유행을 따르지 않습니다
- 패러다임 이해도: "객체지향", "함수형 프로그래밍"이 단순한 문법 차이가 아니라 다른 사고방식임을 이해합니다
- 역사적 진화 관점: 70년 이상의 언어 진화 — 0과 1을 직접 작성하던 것부터 자연어로 코드를 생성하는 것까지
- 후속 학습 기초: 새로운 언어 설계 철학과 기술 선택 의사결정의 기반
| 장 | 내용 | 핵심 개념 |
|---|---|---|
| 제1장 | 언어의 진화 | 기계어부터 고급 언어까지 |
| 제2장 | 프로그래밍 패러다임 | 명령형, 객체지향, 함수형 |
| 제3장 | 언어 선택 | 상황 기반 선택 방법 |
0. 인간은 컴퓨터와 어떻게 "대화"할까?
이진수만 이해하는 로봇과 소통해야 한다고 상상해 보세요:
- 직접 0과 1 입력 — 가장 원시적이고 효율이 극도로 낮음. 0 하나를 1로 잘 쓰면 전부 틀려짐(기계어)
- 니모닉 사용 —
MOV AX, 1이10110000 00000001보다 훨씬 알아보기 쉬움(어셈블리어) - 자연어에 가까운 표현 —
int sum = 1 + 2;인간이 바로 이해 가능(고급 언어)
프로그래밍 언어는 인간과 컴퓨터 간의 소통의 다리이며, 70년 이상 "인간의 사고에 더 가까워지는" 방향으로 진화해 왔습니다.
1. 프로그래밍 언어의 진화
👇 직접 확인해 보기: 1940년대부터 오늘날까지의 프로그래밍 언어 진화 역사 탐색
💡 한 줄 요약
프로그래밍 언어의 진화 추세: 점점 더 인간의 사고에 가까워지고, 점점 더 안전해지며, 점점 더 효율적입니다. 0/1 직접 작성에서, 어셈블리 니모닉, C의 구조적 프로그래밍, Java의 객체지향, 그리고 Rust의 메모리 안전까지 — 세대마다 이전 세대의 문제점을 해결해 왔습니다.
2. 프로그래밍 패러다임: 문제를 생각하는 방식
프로그래밍 패러다임은 언어 기능이 아니라 사고방식입니다 — 글쓰기에 시, 소설, 논문 등 다른 문체가 있듯이.
2.1 명령형 — "컴퓨터에게 어떻게 할지 단계별로 알려주기"
int sum = 0;
for (int i = 0; i < n; i++) {
sum += arr[i];
}2.2 객체지향 — "데이터와 행동을 객체로 캡슐화"
class Dog:
def __init__(self, name):
self.name = name
def bark(self):
print(f"{self.name} says woof!")2.3 함수형 — "순수 함수의 조합, 상태 변경 없이"
sum = foldl (+) 0
-- 같은 입력은 항상 같은 출력 생성2.4 선언형 — "무엇을 할지만 말하고, 어떻게 할지는 신경 쓰지 않기"
SELECT name FROM users WHERE active = true
-- 데이터베이스가 가장 빠르게 조회하는 방법을 스스로 결정💡 실제 개발에서
현대 언어 대부분은 멀티 패러다임입니다. Python은 객체지향도, 함수형도 지원하고, JavaScript도 마찬가지입니다. "어떤 패러다임이 최고인가"를 고민하기보다, 문제에 가장 적합한 방식을 선택하세요.
3. 타입 시스템: 데이터의 교통 규칙
| 강타입 | 약타입 | |
|---|---|---|
| 정적 | Java, Rust, TypeScript — 가장 안전 | C, C++ — 효율적이지만 주의 필요 |
| 동적 | Python, Ruby — 유연하고 안전 | JavaScript, PHP — 유연하지만 오류 발생 쉬움 |
핵심 질문: "1" + 1의 결과는?
- JavaScript(약타입):
"11"— 조용히 변환해 줌 - Python(강타입):
TypeError— 직접 생각해서 처리해야 함
타입 시스템에 대해 더 깊이 알고 싶다면 → 타입 시스템 입문 | 컴파일러 원리 입문
4. 컴파일형 vs 인터프리터형
| 컴파일형 | 인터프리터형 | JIT | |
|---|---|---|---|
| 과정 | 먼저 전부 번역 후 실행 | 읽으면서 실행 | 먼저 해석 후 핫스팿은 컴파일 |
| 속도 | 가장 빠름 | 비교적 느림 | 중간 |
| 디버깅 | 컴파일 대기 필요 | 즉시 피드백 | 즉시 + 최적화 |
| 대표 | C, Rust, Go | Python, Ruby | Java, JavaScript |
5. 프로그래밍 언어를 어떻게 선택할까?
상황별 선택
| 상황 | 추천 언어 | 이유 |
|---|---|---|
| 웹 프론트엔드 | JavaScript, TypeScript | 브라우저는 JS만 인식 |
| 웹 백엔드 | Go, Java, Python, Node.js | 생태계가 성숙함 |
| 모바일 개발 | Swift (iOS), Kotlin (Android) | 공식 추천 |
| AI / 데이터 | Python | PyTorch, Pandas가 모두 Python에 있음 |
| 시스템 프로그래밍 | C, Rust | 하드웨어를 직접 제어 |
| 클라우드 네이티브 | Go, Rust | Docker/K8s가 모두 Go로 작성됨 |
학습 로드맵 추천
- Python — 문법이 가장 간단하고, AI 시대의 진입 언어
- JavaScript — 웹 개발 필수, 프론트/백엔드 모두 가능
- TypeScript — JS에 타입 시스템을 추가하여 정적 타입 체험
- Go 또는 Rust — 컴파일형 언어와 저수준 개념 이해
6. 요약
📚 핵심 요점
- 언어의 진화: 기계어부터 고급 언어까지, 점점 더 인간의 사고에 가까워짐
- 프로그래밍 패러다임: 명령형, 객체지향, 함수형, 선언형 — 각각 적용 시나리오가 다름
- 타입 시스템: 정적/동적, 강/약 — 안전성과 유연성에 영향
- 실행 방식: 컴파일형은 빠르고, 인터프리터형은 유연하며, JIT은 둘의 장점을 겸비
- 은총알은 없다: "최고의 언어"가 아니라 상황에 맞는 언어를 선택
다음 학습:
- 컴파일러 원리 입문 - 컴파일 과정과 코드 최적화에 대한 깊은 이해
- 타입 시스템 입문 - 타입 시스템과 타입 안전성에 대한 깊은 이해
- 데이터 구조 - 데이터의 조직 방식 이해
- 알고리즘 사고 입문 - 문제 해결 방법 학습