✅ Part 5. 타입 시스템의 분류와 특징
프로그래밍 언어에서는 변수나 값의 **타입(자료형)**을 어떻게 다루느냐에 따라 타입 시스템이 달라집니다. 이는 코드 안정성, 실행 속도, 개발 편의성에 큰 영향을 미치는 핵심 요소입니다.
📌 1. 정적 타입(Static Typing) vs 동적 타입(Dynamic Typing)
구분 | 정적 타입 | 동적 타입 |
타입 결정 시점 | 컴파일 타임 | 실행 타임 |
오류 감지 | 컴파일 시 오류 확인 가능 | 실행 중 오류 발생 가능 |
예시 언어 | Java, C, Kotlin, Rust | Python, JavaScript, Ruby |
🔹 정적 타입 언어
- 변수의 타입이 코드 작성 중에 명확히 고정
- 컴파일러가 미리 타입 오류를 잡아주므로 안정성 높음
- 타입 정보를 기반으로 IDE의 자동 완성, 리팩토링 지원 우수
🔸 동적 타입 언어
- 변수의 타입이 실행 중에 결정
- 코드가 간결하고 빠른 프로토타이핑에 유리
- 단, 런타임 오류가 발생하기 쉬움
📌 2. 덕 타이핑(Duck Typing)
"오리처럼 걷고 오리처럼 운다면, 그것은 오리다."
덕 타이핑은 변수의 정확한 타입보다 해당 객체가 어떤 행동(메서드)을 할 수 있는지를 기준으로 판단하는 방식입니다.
예시 (Python)
def fly(animal):
animal.fly() # fly() 메서드만 있으면 어떤 객체든 OK
class Duck:
def fly(self):
print("날아요~")
class Airplane:
def fly(self):
print("엔진 출동!")
fly(Duck())
fly(Airplane())
- Duck도 Airplane도 fly()를 구현했으므로 fly() 함수에서 사용 가능
- 공통 인터페이스를 명시하지 않아도 실행됨
📌 3. 암시적 형 변환과 타입 안정성
동적 타입 언어에서는 **암시적 형 변환(implicit casting)**이 자동으로 일어나기도 합니다.
하지만 이로 인해 예상치 못한 동작이나 버그가 발생할 수 있습니다.
예시 (JavaScript)
'5' + 3 // 결과: '53' (문자열로 변환됨)
'5' - 3 // 결과: 2 (숫자로 변환됨)
➡️ 이런 암시적 변환은 동적 언어의 유연함이기도 하지만, 디버깅을 어렵게 하는 원인이 되기도 합니다.
📌 4. 타입 추론(Type Inference)
정적 타입 언어임에도 타입을 명시하지 않아도 컴파일러가 알아서 판단하는 기능을 타입 추론이라 합니다.
예시 (Kotlin, C#)
val num = 10 // int로 추론
val name = "Tom" // String으로 추론
- 변수의 타입을 작성하지 않아도 컴파일 타임에 자동 추론
- 정적 타입 언어의 안정성과 동적 타입 언어의 편의성을 절충함
📌 5. 강타입(Strong Typing) vs 약타입(Weak Typing)
구분 | 강타입 | 약타입 |
형 변환 | 엄격함 (명시적 필요) | 느슨함 (암시적 변환 잦음) |
안정성 | 높음 | 낮음 |
예시 | Python, Java | JavaScript, C |
- 강타입 언어: 명확한 형 변환 필요, 안정적
- 약타입 언어: 자유롭지만 예기치 않은 오류 위험
🔍 종합 요약
기준 | 정적 타입 | 동적 타입 | 덕 타이핑 | 타입 추론 | 강/약 타입 |
타입 결정 시점 | 컴파일 타임 | 실행 타임 | 실행 시 행동 기반 | 컴파일 시 자동 | 강: 안전 / 약: 유연 |
장점 | 안정성, 성능 | 유연성, 간결함 | 공통 기능 기반 유연성 | 코드 간결함 | 개발자 스타일에 따라 선택 |
대표 언어 | Java, Kotlin | Python, JS | Python, Ruby | Kotlin, Scala | Python(강), JS(약) |
✅ 정리
- 정적 타입은 안전하고 IDE 지원이 뛰어나며, 동적 타입은 빠르고 유연합니다.
- 덕 타이핑은 “타입보다는 행동”을 기준으로 한 판단 방식이며 동적 언어에서 자주 사용됩니다.
- 최신 언어는 정적 타입 기반에 타입 추론 기능을 결합해 생산성과 안전성의 균형을 추구합니다.
'프로그래밍언어' 카테고리의 다른 글
Part 7. 프로그래밍 언어에 대한 오해와 진실 (0) | 2025.06.07 |
---|---|
Part 6. 프로그래밍 언어와 자연어(회화 언어)의 관계 (0) | 2025.06.07 |
Part 4. 프로그래밍 언어의 패러다임 분류 (0) | 2025.06.07 |
Part 3. 프로그래밍 언어의 실행 방식과 분류 기준 (0) | 2025.06.07 |
Part 2. 고급 언어의 등장과 Java의 의미 (0) | 2025.06.07 |