동적 타이핑
"Dynamically typed languages perform type checking at runtime, rather than compile-time."
— 타입 시스템 교과서와 프로그래밍 언어 학술 이론에 기재된 기초적인 정의.
초반 빌드 속도와 코딩 속도를 위해 영혼을 팔고, 서비스 규모가 커지면 'Cannot read properties of undefined' 에러로 대가를 지불하게 만드는 시한폭탄 계약. 이 지옥에서 탈출하기 위해 타입스크립트를 발명한 마이크로소프트 방향으로 매일 아침 세 번씩 감사의 큰절을 올리고 있다(...)
1. 개요
동적 타이핑(Dynamic Typing)은 프로그래밍 언어에서 변수의 타입을 컴파일 타임이 아닌, 프로그램이 실행되는 런타임에 결정하는 타입 시스템이다. 대표적인 동적 타입 언어로는 자바스크립트, 파이썬, PHP 등이 있다.
개발자가 변수를 선언할 때 일일이 int, String 같은 타입을 지정해 주지 않아도 되기 때문에 코드가 무척 간결해지고 프로토타입을 빠르게 만드는 속도전에서 무시무시한 생산성을 뿜어낸다. 그러나 이 엄청난 자유의 대가는 런타임 안정성의 완벽한 상실이다. 실행해 보기 전에는 코드가 올바르게 도는지 아무도 장담할 수 없는 살얼음판을 걷는 코딩 패러다임이기도 하다.(...)
2. 동적 타이핑의 빛과 그림자
2.1. 미친 생산성의 축복: 코드의 극단적 다이어트
정적 타입 언어인 Java나 C++로 코딩할 때는 제네릭(Generic)이나 장황한 캐스팅(Casting) 때문에 본 비즈니스 로직보다 타입을 맞추는 보일러플레이트 코드를 짜는 데 엄청난 시간을 낭비해야 한다. 반면 동적 타입 언어에서는 들어오는 입력값이 무엇이든 그냥 변수에 담아 실행해 버리면 그만이다.
이러한 유연성은 API 데이터를 임시 조작하거나 파일에서 설정을 읽어와 바로 활용하는 고속 스크립팅에서 압도적인 장점으로 작동한다. 신속한 비즈니스 검증이 필요한 스타트업들이 파이썬이나 자바스크립트로 서비스를 첫 삽 뜨는 주된 이유다.1
2.2. 엔터프라이즈 환경에서의 저주: '이게 왜 돌아가지?가 이게 왜 안 돌아가지?로'
비즈니스가 성공하여 스타트업이 대기업이 되고 코드가 수만 줄을 넘어가면, 동적 타이핑은 끔찍한 저주로 변한다.
- 자동 타입 변환의 대환장 파티: 자바스크립트 등에서는 숫자
1과 문자열'1'을 더하면'11'이라는 기괴한 문자열로 알아서 변환하여 연산한다. 컴파일 에러도 안 나기 때문에, 이 사소한 값이 수십 개의 함수를 타고 흐르며 계산 결과를 엉망으로 찔러 넣는 참사를 일으킨다. - 리팩토링의 부재: 변수명이나 함수 인자 이름을 바꾸려고 해도, 해당 변수에 어떤 타입이 들어오는지 정적으로 분석이 안 되기 때문에 자동 변경 도구를 쓸 수 없다. 결국 수많은 소스코드를 수동으로 눈알 디버깅해가며 고쳐야 하는 아날로그 노동이 시작된다.1
이 한계를 이기지 못하고 결국 수많은 자바스크립트 프로젝트들은 TypeScript라는 엄격한 족쇄를 스스로 채우는 형태로 발전했고, 파이썬 역시 최신 버전에서 Type Hint를 도입하는 등 정적 타이핑의 요소를 구걸해(?) 채워 넣고 있는 형국이다.
3. 동적 타이핑 관련 드립 및 밈
3.1. 오리 타이핑 (Duck Typing)
동적 타입 언어들의 핵심 철학을 대변하는 밈적인 용어다. "오리처럼 걷고 오리처럼 꽥꽥 소리를 낸다면, 그것은 오리다."라는 철학이다. 객체가 어떤 명시적인 인터페이스나 클래스를 상속받지 않았더라도, 단지 해당 함수나 프로퍼티(quack())를 가지고만 있다면 아무런 검증 없이 그냥 실행해 버린다. 이로 인해 코드 상호 운용성이 극대화되지만, 실수로 꽥꽥 소리를 내지 못하는 가짜 오리를 집어넣었다간 런타임에 프로그램이 사정없이 공중분해(Crash)된다.(...)
3.2. JavaScript의 1 + '1' = '11'
동적 타이핑과 유연한 암묵적 형 변환(Coercion)이 만들어내는 대표적인 조롱거리 밈이다. 자바스크립트 개발자 도구 콘솔에 1 - '1'을 치면 숫자 0이 나오지만, 1 + '1'을 치면 문자열 '11'이 나오는 기괴함은 이미 전 세계 프로그래머들의 유명한 안줏거리다. 이 말도 안 되는 설계적 틈새 때문에 수많은 동적 언어 유저들은 수학 계산이나 조건문 분기를 탈 때마다 식은땀을 흘리곤 한다.
4. 여담
- 정적 타입의 회귀: 오늘날 현업에서 순수 자바스크립트나 파이썬으로 대형 백엔드 서버를 구축하는 사례는 현저히 줄어들었다. 대부분 타입스크립트를 올리거나 정적 정밀 컴파일러를 갖춘 Rust나 Go 언어로 핵심 서버를 재작성하는 마이그레이션 바람이 불고 있다.
- 런타임 속도의 한계: 동적 타입 언어는 실행할 때마다 변수의 타입을 확인하고 이에 대응하는 연산 방법을 메모리에서 탐색(Dynamic Dispatch)해야 하므로, 정적 타입 언어보다 실행 속도가 근본적으로 느리다. 이를 조금이라도 개선하기 위해 구글 등은 V8 엔진 내부에서 미친 듯이 정적 타입을 예측하여 최적화하는 JIT(Just-In-Time) 컴파일러 마법을 부리고 있다.
- 인공지능의 구세주 파이썬: 속도가 느리고 타입 정합성이 흔들린다는 단점에도 불구하고, 파이썬의 동적인 성격과 유연한 데이터 처리는 오늘날 인공지능(AI)과 빅데이터 연구의 표준으로 우뚝 서게 만들었다. 복잡한 다차원 텐서(Tensor)의 형태를 실시간으로 조작하는 데이터 과학에서는 정적 타입의 족쇄가 오히려 독이 되기 때문이다.2