Skip to content

2-3. 정적 타입과 동적 타입

This content is not available in your language yet.

LIQUID Philosophy EvaluationTotal Score: 8.1 / 10
L: Linked Knowledge (7.5)I: Intuitive Flow (9)Q: Qualitative Learning (8)U: Understandable (8.8)I: Intrinsic Essence (8)D: Deep Dive (7.5)

AI Critical Synthesis

The manuscript excels in providing a structured, highly intuitive breakdown of type systems, clearly disentangling orthogonal concepts like static/dynamic checking and strong/weak typing through concise code examples and a quadrant matrix. While it effectively illuminates practical domain applications and core runtime/compile-time tradeoffs, deeper theoretical exploration into compiler mechanics or low-level memory representations would elevate its academic depth. Overall, it serves as an exceptionally clear and pedagogical introduction to programming language type paradigms.

프로그래밍 언어가 변수의 타입을 결정하고 다루는 방식을 설명한다.

  1. 타입 결정 및 검사 시점: 정적 타입 VS 동적 타입
  2. 타입 변환의 엄격성: 강타입 VS 약타입

컴파일 시점에 모든 변수의 타입이 결정 및 검증되는 방식.

  • 프로그래머가 변수를 선언할 때 자료형을 명시하거나, 컴파일러가 초기값을 분석해 타입을 확정한다.
  • 한 번 타입이 지정된 변수는 메모리 할당 크기와 비트 해석 방식이 고정되어 프로그램 실행 중에 다른 타입의 데이터를 저장할 수 없다.
  • 장점
    • 타입 안정성: 타입 불일치로 인한 오류를 컴파일 과정에서 미리 검증하여 차단한다.
    • 실행 속도 최적화:프로그램 실행 중에 타입을 매번 확인할 필요가 없어 실행 속도가 매우 빠르다.
    • 코드 가독성 향상: 변수나 함수의 입출력 규격이 명확히 드러나 있어 협업과 유지보수 효율이 높다.
  • 단점
    • 작성량 증가: 모든 변수, 매개변수, 반환값에 타입을 정의해야 하므로 초기 코드 작성량이 증가한다.
    • 유연성 부족: 데이터 구조를 유동적으로 바꾸기 어려워 프로토타입을 빠르게 개발하거나 가벼운 단발성 스크립트를 작성할 때 번거롭다.
  • C / C++: 시스템 프로그래밍과 고성능 연산에 사용되는 정적 타입 언어.
  • Java: 안정적인 대규모 엔터프라이즈 서버 애플리케이션 구축에 주로 사용되는 정적 타입 언어.
  • Rust: 컴파일 시점에 메모리 안전성과 타입 안전성을 엄격하게 강제하는 정적 타입 언어.
  • Go, Swift, Kotlin, C# 등

런타임 시점에 변수에 들어가는 실제 값에 따라 타입이 결정되는 방식.

  • 코드를 작성할 때 변수의 타입을 명시하지 않는다.
  • 프로그램 실행 도중 하나의 변수에 서로 다른 타입의 데이터를 자유롭게 재할당할 수 있다.
  • 장점
    • 높은 생산성과 유연성: 타입 선언에 얽매이지 않고 비즈니스 로직을 빠르게 구현할 수 있다.
    • 가변 데이터 처리에 유리: 구조가 수시로 바뀌는 외부 API 응답 데이터나 JSON 형태의 데이터를 다루기 쉽다.
  • 단점
    • 런타임 에러 위험: 잘못된 타입 연산이나 null 참조 오류가 컴파일 단계에서 걸러지지 않아, 프로그램 실행 시 비정상 종료될 수 있다.
    • 실행 속도 저하: 모든 연산마다 객체의 실제 타입을 확인하고 변환하는 작업이 반복 수행된다.
  • Python: 간결한 문법으로 데이터 분석, 인공지능 등에 널리 쓰이는 동적 타입 언어.
  • JavaScript: 웹 브라우저 및 Node.js 환경에서 폭넓게 사용되는 동적 타입 언어.
  • Ruby, PHP 등

정적 타입 언어에서 개발자가 자료형을 명시하지 않아도, 컴파일러가 대입되는 초기값의 형태를 분석해 자동으로 타입을 결정하는 기능.

  • 긴 타입명을 항상 수동으로 작성해야 하는 번거로움을 해소한다.
  • 컴파일러가 우변의 표현식을 평가하여 좌변 변수의 타입을 대신 선언한다.
// C++의 auto 키워드를 이용한 정적 타입 추론
auto count = 10; // 컴파일러가 초기값을 분석해 int로 확정
auto pi = 3.14; // 컴파일러가 초기값을 분석해 double로 확정
// Java의 var 키워드를 이용한 로컬 변수 타입 추론
var title = "Data Types"; // 컴파일러가 초기값을 분석해 String으로 확정

타입을 명시하지 않는 점에서 동적 타입과 혼동할 수 있지만, 동작 시점에서 근본적인 차이가 있다.

  • 동적 타입: 런타임에 변수가 가리키는 값의 타입이 유동적으로 바뀔 수 있다.
  • 타입 추론: 컴파일 시점에 타입이 고정되어, 실행 중에 변경할 수 없다.
auto score = 100; // 컴파일러에 의해 int 타입으로 확정
score = "합격"; // [컴파일 에러] 이미 int형으로 고정되었으므로 문자열 대입 불가

서로 다른 타입 간의 연산이나 대입이 발생할 때 언어가 타입 변환을 얼마나 엄격하게 차단하는지에 따른 기준.

정적 타입 및 동적 타입과의 차이

섹션 제목: “정적 타입 및 동적 타입과의 차이”
  • 정적/동적: 타입 검사를 언제(컴파일 타임, 런타임) 하는가.
  • 강타입/약타입: 연산 과정에서 타입을 얼마나 엄격하게 강제하는가.
  • 동적 타입 언어라도 무조건 자동 타입 변환이 일어나는 것은 아니며, 정적 타입 언어라도 타입 변환이 일어날 수 있다.
  • 서로 다른 타입 간 연산 시 자동 타입 변환을 엄격하게 금지한다.
  • 타입이 호환되지 않는 상황에서 연산을 수행하려면 개발자가 직접 타입 변환을 명시하는 코드를 작성해야 한다.
# 동적 타입 언어인 Python은 강타입 언어이다.
age = 20
message = "나이: " + age
# [TypeError]
# 숫자를 문자로 자동으로 바꿔주지 않으므로 str(age)로 타입 변환을 명시해야 한다.
  • 서로 다른 타입 간 연산 시 언어가 자체적인 변환 규칙에 따라 자동으로 타입을 바꾸어 연산을 강행한다.
  • 코드를 유연하게 작성할 수 있지만, 개발자가 의도하지 않은 논리적 버그를 유발할 수 있다.
// 정적 타입 언어인 C++은 약타입 언어이다.
int a = -1;
unsigned int b = 1;
if (a < b) {
// 실행되지 않음
} else {
// a가 unsigned로 자동 변환되어 최댓값(약 42억)으로 취급됨
std::cout << "-1이 1보다 크다\n"; // 실제 출력
}

프로그래밍 언어 분류 매트릭스

섹션 제목: “프로그래밍 언어 분류 매트릭스”
구분정적 타입동적 타입
강타입Java, Rust, Go, Swift, C# 등Python, Ruby, Elixir 등
약타입C, C++ 등JavaScript, PHP, Perl 등
  • 정적 강타입 언어
    • 안전성 최우선
    • 단 하나의 타입 버그나 메모리 오차도 치명적인 서비스에 사용된다.
    • 금융 시스템, 항공, 방위, 대규모 엔터프라이즈 백엔드 등
  • 동적 강타입 언어
    • 생산성과 안전성의 균형.
    • 생산성이 극도로 중요하면서도 사소한 연산 버그를 차단하고자 할 때 사용된다.
    • 데이터 분석, 인공지능 연구 등
  • 정적 약타입 언어
    • 하드웨어 제어와 극도의 성능.
    • 메모리 주소를 직접 다루고 하드웨어 리소스를 사용해야 하는 시스템 프로그래밍에 사용된다.
    • 운영체제 커널, 임베디드 펌웨어, 게임 엔진 등
  • 동적 약타입 언어
    • 극도의 유연성.
    • 빠르고 유연하게 코드를 작성해야 하는 환경에 사용된다.
    • 웹 프론트엔드, 간단한 자동화 스크립트 등