시스템아 미안해

Chapter 6 - Item 57. 구조적 타이핑으로 유연한 인터페이스를 만들어라 본문

책/Effective JavaScript

Chapter 6 - Item 57. 구조적 타이핑으로 유연한 인터페이스를 만들어라

if else 2025. 9. 23. 10:22
  • 구조적 타이핑(Structural Typing)
    • 객체의 *형태(프로퍼티 구조)*로 타입을 판단하는 방식.
    • 자바스크립트에서는 타입 선언이 없지만, “프로퍼티와 메서드의 존재”가 호환성을 결정.
  • 덕 타이핑(Duck Typing)
    • "오리처럼 걷고, 오리처럼 소리 내면 오리다"라는 개념.
    • 구조적 타이핑의 일종으로, 필요한 동작이 구현되어 있으면 해당 타입처럼 취급.

2. 책에서 말한 문제점

  • 자바스크립트는 클래스나 상속 체계 없이도 객체를 만들 수 있으므로,
  • 형식이 아닌 구조에 의존하는 코드가 많다.
  • 특정 클래스 인스턴스만 받도록 제한하면 재사용성이 떨어진다.
function printLabel(obj) {
  console.log(obj.label);
}

const myObj = { size: 10, label: "Size 10 Object" };
printLabel(myObj); // 동작
  • 여기서 printLabel은 label 프로퍼티만 있으면 어떤 객체든 받을 수 있다.

3. 책에서 말한 해결책

  • 형식 대신 구조에 의존하도록 설계.
  • 인터페이스 설계 시 "필요한 속성과 메서드"만 요구.
  • 덕 타이핑을 활용하면 클래스 계층을 맞추지 않아도 협력 가능.
function logName(entity) {
  if ('name' in entity) {
    console.log(entity.name);
  }
}

logName({ name: 'Alice' });
logName({ name: 'Bob', age: 25 }

  • 클래스 상속보다 훨씬 유연하고, 불필요한 의존 관계를 줄일 수 있음.

4. ES6 이후 변화

  • class 문법 도입 이후에도 구조적 타이핑은 여전히 적용됨.
  • Symbol.hasInstance를 이용해 instanceof 동작을 커스터마이징 가능.
  • TypeScript 사용 시 구조적 타이핑이 기본 동작 방식.
interface Named { name: string; }
function greet(n: Named) { console.log(n.name); }

let person = { name: "Charlie", age: 30 };
greet(person); // OK — age는 무시됨

  • ES6 모듈 시스템과 조합하면 의존성을 낮추면서도 확장 가능한 인터페이스 설계 가능.

5. 결론

  • ES6 이전: 자바스크립트는 원래부터 구조적 타이핑 기반 언어였으며, 상속 없이도 유연하게 객체를 사용할 수 있었다.
  • ES6 이후: class 문법과 모듈이 생겼지만, 여전히 객체의 구조에 맞추는 설계가 재사용성과 확장성에서 유리.
  • 핵심:
    1. 필요한 프로퍼티와 메서드만 요구
    2. 클래스보다는 구조에 의존
    3. 상속보다 **조합(Composition)**을 우선 고려