본문 바로가기

TYPESCRIPT

[타입스크립트] 인터페이스

static members 

클래스에 static 멤버가 존재할 수 있고, 클래스 생성자 자체를 통해 엑세스 가능함 

클래스의 특정 인스턴스와 연결되지 않음

readonly 읽기 전용 속성 

데이터를 덮어쓰는 것을 방지하기 위해서 protect, private를 사용하는데 타입스크립트에서는 readonly를 사용함 


인터페이스 interface

상호 간에 정의한 약속 or 규칙

타입스크립트에서 인터페이스는 객체의 스펙, 함수 파라미터, 함수의 스펙, 배열과 객체 접근방식, 클래스 들을 말한다. 

let person  = { name: 'Capt', age:39};
function logAge(obj : {age:number}) {
	console.log(obj.age); //39
    // logAge함수에서 받는 인자의 형태는 age를 속성으로 가지는 객체 
    // 인자를 받을 때 단순한 타입뿐만이 아니라 객체 속성타입까지 정의
    }
logAge(person); // 39


// 코드에 인터페이스 적용
interface personAge {
	age : number;
    }
function logAge(obj : personAge) {
	console.log(obj.age);
    }
 let person = {name : 'Capt', age :39};
 logAge(person);

인터페이스 interface VS 타입 type

타입 체크를 위해서 사용되며, 변수 / 함수 / 클래스에 사용가능 

인터페이스에 선언된 프로퍼티 or 메소드의 구현을 강제해서 일관성을 유지할 수 있도록 함 (js에서 컴파일할 경우 사라짐)

인터페이스를 사용하면 속성을 선택적으로 적용가능하고, 적용되어있지 않은 속성에 대해 인지시켜줄 수 있음 

프로퍼티와 메소드를 가질 수 있다는 점에서 클래스와 비슷한 점이 존재하지만, 직접 인스턴스를 생성할 수 없고 모든 메소드는 추상 메소드가 됨  

 

타입과 비슷하지만 차이점이 존재함 

1) 타입은 배열로도 설정가능, 배열의 alias도 설정, object모양 특정하는데도 사용가능하지만 (활용성 높음),

    인터페이스는 object의 모양만 특정해주는데 사용함

2) 타입스크립트에게 오브젝트의 모양을 알려줄 때는 인터페이스를 사용하는 것을 더 선호함 (객체지향과 유사한 구조)

→ 결론 : 객체지향 프로그래밍을 위한 타이핑은 클래스 확장을 위해 인터페이스를 써야 하는데 강점! 

               자바스크립트의 유동적인 ducktype을 고정타입으로 선언하기 위해서는 ts의 타입을 쓰는게 장점 !

3) 타입이나 인터페이스의 상속 방법이 조금씩 다름 

 - 인터페이스의 거의 모든 기능은 타입에서 사용할 수 있지만, 주로 차이점은 type을 다시 열어서 새 속성을 추가할 수 x

type Colors = "read" | "blue" | "yellow" // 타입 alias, 특정 타입을 가지도록 하는 기능 
type number = 1 | 5 | 10

interface Player = {  // type으로 작성한 것을 interface로 바꿈 
	nickname :string,
    color : Colors,
    health: number
    }
    
   const woodi: Player = {
		nickname : "woooodi",
        color : "yellow",
        health : 5 
        }

※ 인터페이스 사용방식

interface User{ 
	name :string 
    } 

interface User {
	lastName :string
    }
    
interface User {
	health:number
    }
    // 별도 표기 없이 인터페이스를 각각 만들면 타입스크립트가 합쳐줌
    // 같은 인터페이스에 다른 이름을 가진 프로퍼티를 만들어줌 

const nico : User = { d
	name :"nico",
    lastname: "p",
    health :10 
    }

※ 추상 클래스 abstract

상속받는 다른 클래스가 가질 프로퍼티와 메소드를 지정하도록 함

protected는 추상 클래스로부터 상속받은 클래스들이 프로퍼티에 접근할 수 있도록 함  (→ private를 쓰면 접근 불가능)

추상클래스는 js에서 일반적인 클래스로 바뀜 > 파일의 크기가 커지고 추가 클래스 생성

 

추상클래스는 인스턴스를 만드는 것을 허용하지 않음 (new 사용x)
상속받는 클래스의 동작법을 알려주기 위해서 추상클래스를 사용함 

클래스에 무엇을 구현해야 할 지에대해서는 알려줌 (어떻게 구현해야 할 지에 대해서는 알려주지 않음)

 

추상 클래스르 만들면 자바스크립트는 일반 클래스로 만들어버림 

클래스들이 표준화된 모양, 프로퍼티, 메소드를 만들기 위해사 용함 

인터페이스는 자바스크립트로 컴파일 해도 사라지지 않음

 

클래스가 일정 조건을 만족하도록 타입 규칙 정의 (implements)

extends 를 쓰면 자바스크립트로 변함 → implements

1) 클래스가 특정 인터페이스를 충족하는지 확인 (클래스를 올바르게 구현하지 못하면 오류 발생)

2) implements 절은 클래스가 인터페이스 유형으로 처리될 수 있는지 확인 (유형이나 메서드 변경x)

3) 인터페이스를 상속할 때에는 프로퍼티를 prviate로 만들지 못함 (public으로!)

4) 인터페이스를 타입으로 지정 가능 

 

자바스크립트 코드를 보게 되면 더 이상 추상 코드로 사용하지 않음 

인터페이스와 클래스의 가장 큰 차이이며, 인터페이스는 고유한 사용처가 있고, 클래스의 모양을 알려준다는점은 유용


덕 타이핑 Duck typing

다형성 측면에서 바라볼 수 있는 동적 타이핑의 한 종류,

인터페이스를 변수에 사용한 경우에도 덕 타이핑이 적용됨

객체의 변수 및 메소드의 집합이 객체의 타입을 정하는 것을 말함

→ 해당 인터페이스에서 정의한 프로퍼티나 메소드를 가지고 있으면 그 인터페이스를 구현한 것으로 인정함

 

* 타입스크립트는 자바스크립트의 동적 타이핑을 보완하기 위해서 정적 타입으로 나온 것인데, 왜 덕타이핑이 가능한가?

→ 타입의 형태를 컴파일 단계에서 결정하면 정적 타이핑이라 하고, 런타임단계에서 결정하면 동적 타이핑이 된다. 

→ 타입스크립트는 런타임 단계에서 객체(메소드)가 어떤 형태를 지니고 판단하는 동적 다형성 or 덕타이핑 특성을 지님 

→ 컴파일단계에서 타입판단을 하지 않고, 런타입 단계에서 지정된 Type이 가지고 있는 변수와 method가 있는지 판단하고, 없다면 에러가 발생된다.

 

* 다형성

하나의 메소드나 클래스가 있을 때, 다양한 방법으로 동작 → 하나의 객체가 여러 개의 자료형 타입을 가질 수 있음

 - 정적 다형성 : 컴파일 타임 바인딩을 의마하고, 동적 다형성은 런타임 바인딩을 의미한다.

 - 객체지향언어에서 정적다형성을 오버로딩이라 하고, 동적 다형성을 오버라이딩이라 한다.

 - 정적 다형성 동일한 함수 이름을 가지더라도 해당 함수가 가지는 파라미터들의 개수/타입/순서가 다를 경우 다른 함수로서 인식하는 것을 의미함 

 - 동적 다형성은 동일한 함수 이름과 파라미터 특성을 지닌, 상속 관계에 있는 클래스들의 멤버 함수에 대해 외형적으로 호출되는 타입에 상관없이 실제로 생성된 객체

 

 

 

 

 

728x90