정의:
변수의 타입이 컴파일 시점(실행 전)에 결정되는 방식입니다.
특징:
변수에 자료형을 명시적으로 선언하거나, 컴파일러가 자동으로 추론하는 방식.
자료형이 일단 정해지면 변경이 불가능합니다.
장점:
컴파일 단계에서 타입 오류를 미리 잡아낼 수 있습니다.
코드의 안정성과 신뢰성이 높아집니다.
성능적으로 유리할 수 있습니다.
단점:
때로는 유연성이 떨어질 수 있습니다.
대표 언어:
Java, C, C++, C#, Kotlin, Go, Rust, Scala 등
예시) Java
int number = 10; // number는 int로 고정
number = "hello"; // 컴파일 에러 발생!
정의:
변수의 타입이 실행 시점(Runtime)에 결정되는 방식입니다.
특징:
변수가 값을 저장할 때, 그 시점의 데이터 유형에 따라 타입이 결정됩니다.
변수의 타입은 실행 중에도 얼마든지 변경될 수 있습니다.
장점:
코드가 간결하고 유연해짐.
개발 속도가 빠름.
단점:
타입 오류를 실행 전(컴파일 단계)에 찾기 어렵습니다.
실행 속도가 비교적 느릴 수 있습니다.
예시) python
number = 10 # 정수형
number = "hello" # 문자열형 (동적 변경 가능, 문제 없음!)
특징:
실행 전에 반드시 컴파일 과정이 필요합니다.
컴파일 시점에서 문법이나 타입 오류를 발견할 수 있습니다.
한번 컴파일하면 여러 번 빠르게 실행할 수 있어 실행 성능이 좋습니다.
대표 언어:
C, C++, Rust, Go, Kotlin(네이티브), Swift 등
정의:
코드를 실행 시점에서 즉석으로 한 줄씩 해석하며 실행합니다.
특징:
컴파일 과정 없이 즉시 실행 가능(별도 컴파일 필요 없음).
코드의 수정 즉시 실행할 수 있어 개발 속도가 빠릅니다.
실행 성능은 비교적 낮을 수 있습니다.
대표 언어:
Python, JavaScript, Ruby, PHP 등

자료형의 정적/동적 타입 구분은 변수 타입의 결정 시점(컴파일 or 실행)과 관련되며,
컴파일/인터프리터 언어 구분은 소스코드를 실행 코드로 변환하는 방식과 관련됩니다.
둘은 서로 밀접한 관계가 있지만, 반드시 같은 개념은 아닙니다.