OJINSEOK.dev

// post

타입스크립트의 인터페이스(interface)

2022년 12월 8일

먼저 타입스크립트에 타입과 인터페이스가 어떻게 같고 다른지를 먼저 이해하고 인터페이스를 들어가 보도록 하겠다. type NickName = string type Health = number type Friends = Array<str

typescript

먼저 타입스크립트에 타입과 인터페이스가 어떻게 같고 다른지를 먼저 이해하고 인터페이스를 들어가 보도록 하겠다. 

type NickName = string
type Health = number
type Friends = Array<string>

type Player = {
	nickname:string,
    healthBar: number,
    //nickname:Nickname,
    //healthBar:Health
}

const nico : Player = {
	nickname:"nico",
    healthBar:10
}

type Food = string;

const kimchi : Food = "delicious"

다음 소스코드는 타입에 대해서 다양하게 활용이 가능함을 보여주기위한 소스 코드이다. 

타입은 사용자가 만들고 싶은 무수히 많은 종류의 타입을 정의하고 만들 수 있다. 

심지어 타입은 지정된 옵션(마치 enum 타입처럼)으로만 제한 할 수도 있다. 

type Team = "read" | "blue" | "yellow"

type Health = 1 | 5 | 10

type Player = {
	nickname:string,
    team: Team,
    health: Health
}

const nico : Player = {
	nickname: "nico",
    team : "read" // "pink" 와 같이 타입옵션에 정의되어 있지 않은 string은 사용할 수 없음
}

어떠한 값을 타입에 가질 수 있도록 할 수도 있는데, 특정 값을 주고 해당 타입에 다음 값들만 입력하도록 제한을 걸 수도 있다. 

이처럼 타입은 다양한 방면에서 여러가지 모양으로 활용해서 쓸 수 있는 녀석이다. 

반면에 interface는 오브젝트만을 정의할 수 있는 녀석인데 타입과 쓰는 모양이 조금 다르다

interface Player {
	nickname:string,
    team:Team,
    health: Health
}

다음과 같은 모양을 가지고 있고 오직 오브젝트를 정의하기 위해서만 사용을 한다는 차이점이 있다. 지금까지만 보면 타입을 쓰는게 더 효율적이라고 생각할 수 있을 것인데, 또 다른 차이점을 확인해 보자. 

interface User{
	name:string
}

interface Player extends User {}

const nico : Player = {
	name: "nico"
}

인터페이스는 클래스와 모양이 닯은 것을 볼 수 있다. 또한 인터페이스끼리 상속을 받아서 활용할 수 있는 것을 볼 수 있는데, 그렇다면 타입에서는 상속을 없는걸까? 있다! 

type User = {
	name:string
}

type Player = User & {
}

const nico : Player = {
	name:"nico"
}

이 둘의 소스는 똑같이 동작을 한다. 그런데 모양이 다르게 생겼다. 기존에 객체지향프로그래밍을 어느정도 배운 사람이라면 insterface 모양이 더 친근감이 갈 것이다.  이 글을 작성하는 나도 전자가 더 친숙하다. 

또한 interface는 class와 더욱 친숙하게 사용이 가능한데 만약 오브젝트로 정의를 해야 한다면 type보다는 interface를 쓰는 것이 개인적인 판단으로는 더 좋아 보인다. 

특히 프로그래밍이 객체지향프로그래밍의 컨셉으로 설계되어 프로그래밍을 한다면 더더욱 interface를 활용하는 것이 좋을 것이다. 

그리고 인터페이스는 다음과 같이 사용 할 수 있는데 

interface Firstname{
    firstname: "kim"
}

interface Lastname extends Firstname{
    lastname:"jinseok"
}

다음처럼 어떤 인터페이스를 상속받아 할당된 속성을 하나로 합칠 수 있다. 반면에 타입은 이런 기능은 없다. 

인터페이스는 클래스와 결합하여 사용할 수 있는데 추상 클래스를 대체해서 상속(extends)가 아닌 구현(implaments)하여 다수의 인터페이스를 클래스에서 오버라이딩 하여 사용할 수 있다. 

interface User {
	firstName:string,
    lastName:string,
    sayHi(name:string):string
    fullName():string
}

interface Human {
	health:number,
}

class Player implements User, Human{
	constructor(
    	public firstName:string,
        public lastNmae:string,
        public health:number,
    ){}
    fullName(){
    	return `${this.firstName} ${this.lastName}`
    }
    sayHi(name:string){
    	return `Hello ${name}. My name is ${this.fullName()}`
    }
}

다음과 같이 인터페이스를 클래스와 같이 결합해서 사용하면 자바스크립트로 해석할때는 인터페이스가 자바스크립트에서는 따로 해석되어져서 오는 것 없기 때문에 소스를 줄일 수 있는 장점이 있다. 

보통 많은 객체지향프로그래밍에서 추상클래스보다 인터페이스를 많이 채용해서 사용하는 만큼 클래스의 모양을 특정할 수 있도록 하는 인터페이스를 잘 활용할 수 있도록 하자.

'타입스크립트' 카테고리의 다른 글

| | 타입스크립트 제네릭(1)| 2022.12.06
| | 타입스크립트 다형성(Polymorphism)(0)| 2022.12.06
| | 타입스크립트 오버로딩(Overloading)(0)| 2022.12.06
| | 타입스크립트에서의 함수(Call Signatures)(0)| 2022.12.06
| | 타입 스크립트 기본 문법(0)| 2022.12.05


이 글은 제 Tistory 블로그에 처음 게시(2022-12-08)된 글입니다.