[TypeScript] 인터페이스와 덕 타이핑(Interface & Duck Typing)

kihongsi·2022년 1월 2일
0

typescript

목록 보기
1/1

인터페이스 Interface

타입스크립트를 포함해서 정적 타입 언어에는 인터페이스라는 개념이 존재한다.
어떤 객체의 프로퍼티 혹은 메소드를 가진다고 선언하면, 실질적인 구현은 클래스에게 맡긴다.
즉, 클래스에서 구현부가 빠진 개념이다.

interface Animal {
  sound(): void;
}

class Cat implements Animal {
  height: number;
  weight: number;
  ...
  sound(){
    console.log("meow");
  } // 해당 함수가 없으면 error
}

옵션 속성

옵션 속성을 지정하면 해당 속성을 사용하지 않아도 된다.

interface name{
  property?: type;
}

이렇게 속성 뒤에 물음표를 붙일 경우 해당 속성을 사용하지 않는 것이 가능함

읽기 전용 속성

interface Drink {
  readonly kind: string;
}

처음 생성시에만 값을 할당하고 그 이후로 변경할 수 없음 (constant)
수정 시도 시 오류 발생

읽기 전용 배열

let arr: ReadonlyArray<number> = [1,2,3];

arr.splice(0,1); // error
arr.push(4); // error

정의되지 않은 속성 사용하기

interface Animal {
  name?: string;
  [propName: string]: any;
}

위와 같이 사용하면 정의되지 않은 속성을 추가하여 사용 가능


함수 타입 정의하기

함수의 조건을 지정할 수 있음

interface login {
  (username: string, password: string): boolean;
}

const userLogin: login = function(id: string, pw: string) {
  return true;
}

login interface는 string type의 매개 변수를 받고 boolean type을 반환하는 함수만 정의 가능


클래스 타입 정의하기 (implements)

클래스가 일정 조건을 만족하도록 규칙을 정할 수 있음

interface user{
  username: string;
  print(): void;
}

class Login implements user{
  username: string = 'nancy';
  print(){
    console.log(this.username);
  }
  constructor(){}
}

인터페이스의 장점

속성을 선택적으로 적용할 수 있으며, 인터페이스에 정의되어 있지 않은 속성에 대해 인지할 수 있음


덕 타이핑 Duck Typing

덕 타이핑은 실제 타입(클래스)은 상관하지 않고, 구현된 메소드로만 판단하는 방식

Typing이란 메모리 안의 값들에 데이터 타입을 할당함으로써 의미를 부여하는 것

Structural Typing 🆚 Nominal Typing

Structural Typing: 구조가 같으면 같은 타입으로 간주하는 방식 ex) typescript
Nominal Typing: 이름을 기준으로 타입을 나누는 방식 ex) Java/C# 등

typescript에서는 구조가 같으면 할당 가능하다

클래스 덕 타이핑

interface Duck {
  quack(): void;
}

class RedDuck implements Duck {
  quack(){
    console.log("Red Quack!");
  }
}

class BlueDuck {
  quack(){
    console.log("Blue Quack!");
  }
}

function quacking(duck: Duck): void {
  duck.quack();
}

quacking(new RedDuck()); // ok
quacking(new BlueDuck()); // ok

Duck interface를 인자로 받는 함수에 BlueDuck 인스턴스를 인자로 전달하여도 에러 없이 처리됨
조건을 만족하는 'quack'이라는 이름의 메소드가 있기만 하면 해당 클래스라고 보는 것!

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

변수 덕 타이핑

interface Animal {
  cry: string;
}

function crying(animal: Animal){
  console.log(animal.cry);
}

let dog = {name: "dog", cry: "bark bark"}

crying(dog); // "bark bark"

변수 dog은 인터페이스 Animal과 일치하지는 않지만, cry라는 프로퍼티를 가지고 있으므로 해당 인터페이스에 부합하는 것으로 인정됨.
타입스크립트의 타입 체킹은 프로퍼티의 순서가 아닌 인터페이스에서 요구하는 프로퍼티 존재 여부만 확인함

0개의 댓글