프로그래밍언어

Part 5. 타입 시스템의 분류와 특징

a-bell2 2025. 6. 7. 19:50

✅ 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 지원이 뛰어나며, 동적 타입은 빠르고 유연합니다.
  • 덕 타이핑은 “타입보다는 행동”을 기준으로 한 판단 방식이며 동적 언어에서 자주 사용됩니다.
  • 최신 언어는 정적 타입 기반에 타입 추론 기능을 결합해 생산성과 안전성의 균형을 추구합니다.