자바스크립트의 덕 타이핑(Duck Typing) 개념
덕 타이핑(Duck Typing)은 객체의 실제 타입이 아니라, "어떤 속성과 메서드를 가지고 있는지"에 따라 타입을 결정하는 개념입니다.
📌 철학:
"오리처럼 걷고, 오리처럼 꽥꽥거린다면, 그것은 오리다." 🦆
즉, 객체의 타입을 확인할 때 클래스나 명시적인 타입 정보가 아니라, 객체가 특정 속성이나 메서드를 가지고 있는지를 기준으로 판단합니다.
자바와 자바스크립트의 차이
- 자바 (명시적 타입 시스템)
- 객체가 특정 클래스에서 상속받거나 인터페이스를 구현해야 해당 타입으로 간주됨
- 클래스 이름이 다르면, 같은 속성을 가지고 있어도 다른 타입으로 인식됨
- 자바스크립트 (덕 타이핑 기반의 동적 타입 시스템)
- 특정 클래스에서 파생되지 않아도 속성과 메서드만 맞으면 해당 타입처럼 사용 가능
- 객체의 구조가 타입을 결정함
예제 코드 (덕 타이핑 적용 예시)
function quack(duck) {
if (typeof duck.quack === "function") {
duck.quack();
} else {
console.log("이 객체는 오리가 아닙니다.");
}
}
const realDuck = {
quack: () => console.log("꽥꽥!"),
};
const toyDuck = {
quack: () => console.log("장난감 오리 소리!"),
};
const cat = {
meow: () => console.log("야옹!"),
};
quack(realDuck); // 출력: 꽥꽥!
quack(toyDuck); // 출력: 장난감 오리 소리!
quack(cat); // 출력: 이 객체는 오리가 아닙니다.
✅ realDuck
과 toyDuck
은 클래스가 다르지만 quack
메서드를 가지고 있으므로 quack
함수에서 오리처럼 인식됨.
❌ cat
은 quack
메서드가 없으므로 오리로 인식되지 않음.
TypeScript에서의 덕 타이핑 (구조적 타이핑)
TypeScript에서는 "구조적 타이핑(Structural Typing)" 을 기반으로 덕 타이핑을 지원합니다.
interface Duck {
quack: () => void;
}
function makeDuckNoise(duck: Duck) {
duck.quack();
}
const toyDuck = { quack: () => console.log("장난감 오리 소리!") };
const cat = { meow: () => console.log("야옹!") };
makeDuckNoise(toyDuck); // 정상 작동
// makeDuckNoise(cat); // 오류: 'meow' 속성만 있고 'quack'이 없음
✅ toyDuck
은 Duck
타입이 아니지만, quack 메서드를 가지고 있기 때문에 makeDuckNoise
함수에 전달 가능
❌ cat
은 quack
메서드가 없어서 타입 오류 발생
덕 타이핑의 장점과 단점
✅ 장점
- 유연한 코드 작성 가능 (클래스 기반 상속 없이도 특정 기능을 수행하는 객체를 사용할 수 있음)
- JavaScript의 동적 특성과 잘 맞음 (유형 제한이 적어 코드 확장이 쉬움)
- TypeScript에서 인터페이스를 강제하지 않고도 객체의 구조만 맞으면 사용 가능
❌ 단점
- 타입 안정성이 낮아 런타임 오류 발생 가능 (타입스크립트를 사용하면 해결 가능)
- 객체가 특정 속성과 메서드를 가졌다고 해서, 기대하는 동작을 한다는 보장이 없음
- 코드 가독성이 낮아질 수 있음 (클래스 기반 OOP에 익숙한 개발자들에게 직관적이지 않을 수 있음)
'TIL' 카테고리의 다른 글
[250216 TIL] XSS, SQL injection (0) | 2025.02.16 |
---|---|
[250215 TIL] XSS, CSRF 대응 (0) | 2025.02.15 |
[250214 TIL] HTTP, OSI7계층(개념정리) (0) | 2025.02.14 |
[250213 TIL] 추상화, 캡슐화(개념정리) (0) | 2025.02.13 |
[250213 TIL] TBD vs Github Flow(개념정리) (0) | 2025.02.13 |