변수의 타입을 명시하지 않아도 되고, 런타임에 타입이 결정된다.
즉, 변수를 선언할 때 타입을 지정할 필요가 없다.
값(value)에는 타입이 있지만, 변수(variable)에는 타입이 없다.
따라서 아래의 예시처럼 변수 x는 정수 → 문자열 → 리스트로 타입이 계속 바뀌어도 문제가 없다.
x = 10 # int
x = 'hello' # str
x = [1, 2, 3] # list
타입 간의 자동 변환(coercion)을 허용하지 않으며, 명시적인 변환이 필요하다.
타입이 다르면 연산을 강제로 수행하지 않고, 에러가 발생한다.
아래의 예시처럼 문자열 '10'과 숫자 5를 더하려고 하면 TypeError가 발생하게 된다.
x = '10'
y = 5
print(x + y) # TypeError!
타입의 명시적 변환
print(int(x) + y) # 15 (문자열 → 정수로 변환)
하지만 약한 타이핑(Weak Typing) 언어(JavaScript, PHP 등)는 자동으로 변환해 줄 수도 있다.
참고로, Java는 정적 + 비교적 강한 타이핑 언어이기 때문에 문자열과 정수는 자동 변환하지 않으며, 서로 다른 타입을 대입하려고 하면 컴파일 시점에 에러가 발생한다.
// static typing 예시 (Java)
public class HelloTypes {
public static void main(String[] args) {
String thing;
thing = "Hello World";
thing = 42; // 컴파일 에러: int를 String에 대입할 수 없음
System.out.println(thing);
}
}
// $ javac HelloTypes.java
// HelloTypes.java:8: error: incompatible types: int cannot be converted to String
// thing = 42;
// 1 error