Devlog.
게시일

구조적 타이핑과 덕 타이핑

cover
date
Nov 16, 2023
slug
구조적-타이핑과-덕-타이핑
status
Published
tags
Type systems
TypeScript
JavaScript
summary
덕 타이핑과 구조적 타이핑에 대해 알아보기
type
Post

덕 타이핑 (Duck Typing)

덕 타이핑은 명시적인 타입이나 클래스가 아닌 객체의 동작이나 객체가 가진 메서드 및 프로퍼티를 기반으로 객체의 타입을 결정하는 방법이다.
덕 타이핑은 덕 테스트(Duck Test)로 부터 유래되었다. 덕 테스트는 귀추법의 한 형태로 “오리처럼 보이고, 오리처럼 수영하고, 오리처럼 꽥꽥거리면 그것은 오리일 것이다.”라고 표현한다. 프로그래밍에서 객체가 특정 타입처럼 동작하면 실제 클래스나 타입에 관계없이 해당 유형으로 취급할 수 있다는 뜻이다.
다음은 JavaScript에서 덕 타이핑이 어떻게 사용되는지 보여준다.
function printItems(items) { if (items[Symbol.iterator]) { for (const item of items) { console.log(item); } } else { console.log('Provided object is not iterable'); } } const myObject = { from: 1, to: 5, [Symbol.iterator]() { return { current: this.from, last: this.to, next() { if (this.current <= this.last) return { value: this.current++, done: false }; else return { done: true }; }, }; }, }; const array = ['a', 'b', 1, 2]; const string = 'hello'; printItems(array); // 'a', 'b', 1, 2 printItems(string); // 'h', 'e', 'l', 'l', 'o' printItems(myObject); // 1, 2, 3, 4, 5
이 예시에서 printItems 함수는 전달된 객체가 이터러블인지 확인하는 덕 타이핑의 원리를 사용한다. 객체가 Symbol.iterator 속성을 가지고 있다면, 이터러블로 간주하고 for…of 루프를 사용해 모든 요소를 순회한다. 이 방식으로 printItems 함수는 배열, 문자열 등 다양한 타입의 이터러블 객체를 유연하게 처리할 수 있다.

구조적 타이핑 (Structural Typing)

구조적 타이핑은 실제 구조와 정의에 의해 결정되는 타입 시스템의 한 종류로, 구조적 타입 시스템(Structural Type System)이라고도 불린다. 클래스 명, 인터페이스 명과 같이 어떤 타입의 이름이나 그것의 위치에 상관 없이 내부적으로 같은 구조를 가지고 있으면 같은 타입으로 보는 것이다.
TypeScript는 구조적 타이핑 방식을 사용하며, 타입의 할당 가능성(Assignability)을 판단하기 위해 컴파일 타입에 덕 타이핑 방식을 사용한다.
다음은 TypeScript에서 구조적 타이핑의 예시이다.
interface Point { x: number; y: number; } function printPoint(p: Point) { console.log(`${p.x}, ${p.y}`); } // 객체 `point`는 `Point` 인터페이스의 구조를 따른다. const point = { x: 12, y: 26 }; printPoint(point); // "12, 26" // 추가 속성 `z`를 가진 객체도 `Point` 인터페이스의 요구사항을 충족한다. const point3D = { x: 12, y: 26, z: 89 }; printPoint(point3D); // "12, 26"
이 예시에서 TypeScript는 printPoint 함수에 전달된 객체가 Point 인터페이스와 구조적으로 호환되는지를 검사한다. pointpoint3D 객체는 모두 Point 인터페이스의 구조적 요구사항을 만족하므로, 둘 다 printPoint 함수에 안전하게 전달될 수 있다. 이는 구조적 타이핑이 실제 객체의 타입보다는 객체의 구조에 기반하여 타입 호환성을 판단한다는 것을 보여준다.

결론

덕 타이핑은 객체의 동작이나 객체가 가진 메서드 및 프로퍼티를 기반으로 타입을 결정한다. 즉, 객체의 실제 타입이 아니라 객체의 “행동”에 기반하여 타입을 결정한다.
구조적 타이핑은 객체의 필드와 메서드의 존재 및 타입과 같은 “구조”에 기반하여 타입 호환성을 판단한다.