1 왜 동적 타이핑을 배워야 할까?
→ 파이썬은 변수를 만들 때 타입을 미리 선언할 필요가 없음
→ 그래서 처음엔 쉽고 편하지만, 실제 코드를 작성하다 보면 타입 변화 때문에 예측 못 한 오류가 자주 발생함
→ 즉, 동적 타이핑을 배우는 목적은 개념 암기가 아니라 내부 동작 방식을 이해해 예측 가능한 코드를 작성하기 위함
2 정적 타이핑 vs 동적 타이핑
| 구분 | 정적 타이핑 | 동적 타이핑 |
| 타입 확정 시점 | 실행 전 | 실행 중 |
| 타입이 붙는 대상 | 변수 | 값(객체) |
| 변수 재사용 | 타입이 고정됨 | 어떤 타입이든 재할당 가능 |
3 동적 타이핑의 핵심 원리
→ 파이썬에서 타입은 변수에 붙지 않고 값(객체)에 붙음
1-1 코드
x = 10
x = '10'
x = 3.14
→ 위의 코드는 x가 바뀐 것이 아니라, x가 가리키는 객체가 바뀌면서 타입이 함께 바뀌는 것
4 변수는 객체를 참조한다 (메모리 모델 핵심)
→ x=10은 'x안에 10이 저장된 것'이 아니라 10 객체가 생성되고, x가 그 객체를 가리키는 것
2-1 코드
a = 100
b = a
→ 위의 코드는 100이라는 객체는 하나이고, a와 b가 같은 객체를 가리킴
→ 재할당은 '값 수정'이 아니라 변수가 가리키는 대상이 변경되는 것
2-2 코드
x = 10
x = 20 # 10 객체가 수정된 것이 아니라 x가 20 객체를 새로 가리킴
5 불변(Immutable) vs 가변(Mutable)
| 종류 | 값 변경 방식 | 예시 |
| 불변 | 값이 바뀌면 새 객체를 생성함 | int, float, str, bool |
| 가변 | 같은 객체 안에서 데이터를 수정함 | list, dict, set |
6 얕은 복사 vs 깊은 복사
| 복사 방식 | 특징 | 결과 |
| 얕은 복사 | 겉 객체만 새로 만들고 내부는 공유함 | 한쪽을 수정할 시 다른 쪽도 영향을 줌 |
| 깊은 복사 | 내부 객체까지 전부 새로 복사함 | 서로 완전히 독립적임 |
7 장단점
1) 장점
→ 타입 선언 없이 빠르게 개발하여, 코드가 간결하고 읽기 쉬우며, 다양한 데이터 타입을 유연하게 처리함
→ 같은 코드가 값의 타입에 따라 자동으로 적절히 동작하며, 빠르게 만들고 빠르게 수정하는 개발 방식과 잘 맞음
2) 단점
→ 변수 타입이 바뀌어도 바로 에러가 나지 않으며, 변수 이름만 보고 타입을 오해하기 쉬움
→ 타입을 확인하지 않은 채 연산/비교/조건식을 작성하며, 입력/조건/반환 흐름에 따라 타입이 달라지는 것을 추적 못함
→ 출력만 보고 정상이라고 착각하지만 오류가 늦게 터져 디버깅이 어려움
8 가장 자주 발생하는 실전 오류 3가지
3-1 코드 : 문자열 + 숫자 연산
age = '20'
print(age + 5) # 문자열 + 숫자 → 오류
3-1 결과

3-2 코드 : 리스트를 정수로 바꾼 후 반복문 사용
items = [1, 2, 3]
items = 0
for x in items: # int는 반복 불가
print(x)
3-2 결과

3-3 코드 : 리스트를 복사하여 값을 바꿨더니 같이 바뀜
a = [1, 2, 3]
b = a
b.append(4)
print(a) # 같이 바뀜
3-3 결과

9 동적 타이핑을 안전하게 쓰는 습관
→ 변수 이름만 보고 타입을 유추할 수 있게 만들기
→ 한 변수에 여러 타입을 섞지 않기
→ 입력값은 반드시 변환 후 사용하기
→ 함수의 반환 타입은 상황과 상관없이 항상 동일하게 유지하기
→ 가변 객체는 공유하지 말고 copy()해서 사용하기
→ 디버깅 시 값 + type() 함께 출력하기
10 타입 힌트(Type Hint)로 단점 보완하기
→ 실행 방식은 그대로지만, 코드 가독성, 오류 예방, 협업에 큰 도움이 됨
4-1 코드 : 기본 예시
age: int = 20
name: str = 'Alice'
def add(a: int, b: int) -> int:
return a + b
4-2 코드 : 컬렉션 내부 타입 포함
scores: list[int] = [10, 20, 30]
students: dict[str, float] = {'철수': 95.5, '영희': 88.0}
4-3 코드 : 복잡한 타입은 별칭으로 사용함
User = dict[str, str]
def get_user() -> User:
return {'name': 'Alice', 'email': 'alice@example.com'}
Python 동적 타이핑에 대해 더 상세한 설명을 원하는 분들은 아래 사이트에 접속하기
Python 동적 타이핑뿐만 아니라 다른 프로그래밍 언어에 대해 알고 싶은 분들은 아래 사이트에 접속하여 원하는 링크에 접속하기
'파이썬 > 변수와 데이터 타입' 카테고리의 다른 글
| 파이썬 타입 힌트(Type Hint) 완벽 정리 - 초보자가 꼭 알아야 할 핵심 개념부터 실전 사용 기준까지 (0) | 2026.01.13 |
|---|---|
| 파이썬 None 완벽 정리 - None vs 빈 값 차이, is 비교, 함수 반환까지 한 번에 끝내기 (0) | 2025.12.04 |
| 파이썬 Boolean, 조건문 완전 정리 - True/False, 비교/논리 연산, in, None, 단축 평가까지 한 번에 이해하기 (0) | 2025.11.30 |
| 파이썬 문자열 완전정복 : split, join, replace, 정규표현식, 한글 깨짐, 디버깅까지 이것만 보면 끝! (0) | 2025.11.27 |
| 파이썬 형변환 완벽 가이드 : 타입 확인, 숫자 변환, 예외 처리, 자주 하는 실수까지 한 번에 정리 (0) | 2025.11.19 |