“오리처럼 걷고 꽥꽥대면, 그것은 오리다”


객체의 실제 타입보다는 그 객체가 가진 속성과 동작(메서드)을 기준으로 타입을 결정하는 방식

자바스크립트는 동적 타입 언어라서, 변수의 타입을 명시적으로 선언할 필요가 없습니다. 변수의 구조가 문제되지 않으면(호환이 된다면) 다른 타입으로 간주될 수 있습니다.

말이 어려운데, 예제를 보여드리겠습니다.

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를 넣어주려고 하는 시점에 에러 문구를 띄우겠죠?


참고 자료

https://velog.io/@thumb_hyeok/덕-타이핑과-구조-기반-타입