StudyForYou / ouahhan-typescript-with-react

우아한 타입스크립트 with 리액트 스터디 레포 🧵
4 stars 0 forks source link

#2 [2장_2] 덕 타이핑, 구조적 타이핑, 명목적 타이핑에 대해 설명해주세요! JS의 덕타이핑과 TS 의 구조적타이핑의 공통점과 차이점에 대해서도 알려주세요~! #12

Closed hyeyoonS closed 3 months ago

hyeyoonS commented 3 months ago

❓문제

(1) 덕 타이핑, 구조적 타이핑, 명목적 타이핑에 대해 설명해주세요! (2) JS의 덕타이핑과 TS 의 구조적타이핑의 공통점과 차이점에 대해서도 알려주세요~!

🎯 답변 요약

(1)

(2) 덕타이핑과 구조적타이핑은 타입 시스템을 구현하는 방식입니다. 타입의 구조에 대해 A interface와 B interface가 있다고 가정해보자. B interface가 A interface의 타입에 대해 유효한지 확인하기 위해 B interface안의 타입들이 A interface에 있는지 만 확인한다라고 볼 수 있습니다. 쉽게 말해서 타입을 받는 입장에서 해당 타입들만 구조적으로 보고 판단한다라고 말할 수 있을 것 같습니다.

차이점은 덕타이핑의 경우 런타임에 타입을 검사할 수 있고 구조적타이핑의 경우 컴파일 타임(즉, 타입 체커)에 타입을 확인 할 수 있습니다.

🎯답변

(1) 덕 타이핑, 구조적 타이핑, 명목적 타이핑

덕타이핑

"만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라고 부를 것이다”

function printPoint(point) {
    console.log(point.x + ", " + point.y);
}

let point = { x: 10, y: 20 };
let anotherPoint = { x: 10, y: 20, z: 30 };

printPoint(point);        // OK, point 객체는 x와 y를 가지고 있음
printPoint(anotherPoint); // OK, anotherPoint 객체도 x와 y를 가지고 있음

구조적 타이핑과 명목적 타이핑

구조적 타이핑

interface Point {
    x: number;
    y: number;
}

interface AnotherPoint {
    x: number;
    y: number;
    z: string;
}

let point: Point = { x: 10, y: 20 };
let anotherPoint: AnotherPoint = { x: 10, y: 20, z: "abc" };

point = anotherPoint; // OK, AnotherPoint는 Point의 모든 속성을 가지고 있음
anotherPoint = point; // 오류, Point는 AnotherPoint의 모든 속성을 가지고 있지 않음

구조적 타이핑 = 명목적으로 구체화한 타입 시스템

타입을 사용하는 여러 프로그래밍 언어에서 값이나 객체는 하나의 구체적인 타입을 가지고 있다. 타입은 이름으로 구분되며 컴파일타임 이후에도 남아있는데, 이것을 명목적으로 구체화한 타입 시스템이라고 부르기도 한다.

명목적 타이핑

명목적 타이핑

class Point {
    int x;
    int y;
}

class AnotherPoint {
    int x;
    int y;
}

Point point = new Point();
AnotherPoint anotherPoint = new AnotherPoint();

// point = anotherPoint; // 컴파일 오류: AnotherPoint는 Point 타입이 아님

(2) 자바스크립트의 덕타이핑과 타입스크립트의 구조적타이핑 비교

공통점:

  1. 속성 기반:
    • 덕 타이핑: 객체가 특정 메서드나 속성을 가지면 해당 타입으로 간주합니다.
    • 구조적 타이핑: 타입이 특정 속성들을 가지고 있으면 그 타입으로 간주합니다.
  2. 유연성:
    • 객체가 필요한 속성을 가지고 있기만 하면 타입이 올바르다고 간주하므로, 추가적인 속성이 있어도 문제가 되지 않습니다.

차이점:

⇒ 타입스크립트의 구조적 타이핑 시스템으로 컴파일 시점에 타입 오류를 확인할 수 있어 타입 안정성을 보장해준다 ~!

qooktree1 commented 3 months ago

(1)

(2) 덕타이핑과 구조적타이핑은 타입 시스템을 구현하는 방식입니다. 타입의 구조에 대해 A interface와 B interface가 있다고 가정해보자. B interface가 A interface의 타입에 대해 유효한지 확인하기 위해 B interface안의 타입들이 A interface에 있는지 만 확인한다라고 볼 수 있습니다. 쉽게 말해서 타입을 받는 입장에서 해당 타입들만 구조적으로 보고 판단한다라고 말할 수 있을 것 같습니다.

차이점은 덕타이핑의 경우 런타임에 타입을 검사할 수 있고 구조적타이핑의 경우 컴파일 타임(즉, 타입 체커)에 타입을 확인 할 수 있습니다.