Lsiron

Type Script 의 implements ? 본문

언어/Type Script

Type Script 의 implements ?

Lsiron 2024. 7. 18. 11:57

implements ?

implements 는 class 문법에 사용하는 키워드이다. 이때 함께 동반되는게 바로 interface 키워드 인데,

 

interface 는 Object의 타입을 지정할 때만 사용 할 수 있는게 아니라 class 타입을 체크할 때도 사용 할 수 있다.

 

그러면 implements와 interface 이 두 개로 어떻게 class의 타입을 체크할 때 쓸 수 있을까?

 

먼저, interface는 class가 따라야 하는 속성과 타입을 정의한다.

 

다음으로, implements 는 class가 해당 interface를 잘 따르면 에러가 발생하지 않도록 하고 해당 interface를 따르지 않으면 에러가 발생하도록 한다.

 

위와 같은 원리로 class의 타입을 체크하는 것 이다.

 

즉, class를 만들 때 interface 키워드와 implements 키워드를 사용하여 만들면, 해당 class는 interface에 정의된 모든 프로퍼티와 메서드를 포함해야 한다.

 

포함하지 않으면 에러가 발생한다.

 

사용법을 보면서 한번 자세하게 알아보자.

 

사용법

1. interface 정의

interface로 class가 따라야하는 구조를 만들어보자. ( 구조를 계약이라고도 한다. )

interface Animal {
  name: string;
  age: number;
  makeSound(): void;
}

 

그러면 class는 Animal interface의 구조를 따라야한다.

 

즉, name : string / age: number / makeSound(): void 를 따라야하는 것 이다.

 

2. class 정의

interface에서 정의한 name과 age 프로퍼티를 가지고 makeSound 메서드를 가진 클래스를 하나 만들어준다.

class Dog {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  makeSound(): void {
    console.log("Woof! Woof!");
  }
}

 

만약 이 Dog class가 interface에서 정의한 name과 age 속성 그리고 makeSound 메서드를 확실하게 가지고있는지 확인하고 싶을 경우 implements 키워드로 확인할 수 있다.

 

3. class에 implements 묻히기

implements 키워드를 사용하여 interface를 구현하는 class로 만들어준다. 즉, implements를 사용함으로써 interface를 잘 따른다고 선언 해 주는 것이다.

( 내부 구조를 바꾼건 없다. 그냥 implements 키워드에 interface로 만든 변수명을 써줬다. )

class Dog implements Animal {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  makeSound(): void {
    console.log("Woof! Woof!");
  }
}

 

implements 키워드를 사용했을때, 만약 위 예시의 경우 Dog class가 Animal interface의 구조를 따르지 않는다면 에러가 발생한다.

 

즉, name과 age 속성 또는 makeSound 메서드 이 셋 중 하나라도 빠지거나, 타입이 다르게 작성 될 경우 에러가 발생 한다는 것 이다.

 

implements 키워드를 사용하는 것은 class가 해당 interface에 들어있는 속성과 메서드 그리고 타입을 가지고 있는지 체크만하라는 뜻이다.

 

interface로 class 내부에 있는 속성의 타입을 재할당 하는 용도로 사용하는 것이 아니다.

 

에러만 발생시켜주지 interface에서 지정한 속성의 타입이 class 내부에 반영되지 않는다.

 

implements는 class가 너무 많아지고 복잡하게 얽혀있을 경우, 해당 class에 어떤 속성과 메서드가 있는지 추론하기 힘든경우가 많은데, 이때 class의 구조를 체크하고 싶을 때 implements를 사용한다.

 

 

 

참조: 코딩애플