“오리처럼 걷고 꽥꽥대면, 그것은 오리다”
객체의 실제 타입보다는 그 객체가 가진 속성과 동작(메서드)을 기준으로 타입을 결정하는 방식
자바스크립트는 동적 타입 언어라서, 변수의 타입을 명시적으로 선언할 필요가 없습니다. 변수의 구조가 문제되지 않으면(호환이 된다면) 다른 타입으로 간주될 수 있습니다.
말이 어려운데, 예제를 보여드리겠습니다.
function makeSound(animal) {
if (typeof animal.quack === "function") {
console.log("꽥꽥!");
} else {
console.log("이건 오리가 아니야!");
}
}
const duck = {
quack: function () {
console.log("꽥꽥!");
},
};
const dog = {
bark: function () {
console.log("멍멍!");
},
};
makeSound(duck); // ✅ 꽥꽥!
makeSound(dog); // ❌ 이건 오리가 아니야!
정적 타입 언어의 경우라면, 동일 메서드를 구현하려면 상속과 같은 방법을 이용해 동일 타입임을 정의해야 사용 가능해집니다. 그러나 윗 예제와 같이 자바스크립트는 굳이 명시적으로 메서드나 프로퍼티가 동일하다는 것을 명시적으로 나타내지 않더라도 타입을 확인하지 않습니다.
makeSound 함수는 quack() 메서드가 있는지 확인할 뿐이지, 객체의 타입을 검사하지는 않음을 알 수 있습니다. 만약 정적 타입 언어였다면, 매개변수 animal에 dog를 넣어주려고 하는 시점에 에러 문구를 띄우겠죠?
참고 자료