인터페이스는 우리가 그것을 사용하는 객체가 어떻게 보여야 하는지를 설명하는 객체의 구조이다.
또한 클래스 등이 특정 계약(contract)을 충족시키도록 명시적으로 강제하는 방법이다.
인터페이스 정의
interface 인터페이스의 이름
interface는 계약이며 이를 사용하는 클래스(또는 객체, 함수)는 이를 따라야 한다.
인터페이스 역시, 클래스와 마찬가지로 extends로 상속이 가능하다.
인터페이스 Person을 객체 p1와 p2의 타입으로 설정하였다.
인터페이스에서 설정한 계약은 name의 값은 문자열로, age의 값은 숫자로 타입을 지정한 것이다.
객체 p2의 경우, age의 값을 문자열로 할당하였는데 이 경우에 인터페이스에서 정한 계약을 위반하여 오류가 발생한 것이다.
선택 속성은 객체에서 없어도 되는 속성을 말한다.
선택 속성은 물음표 기호를 사용한다.
인터페이스에서 number의 값을 선택 속성으로 정의하였다.
이는 값이 없어도 된다는 뜻이므로 객체 p1에선 age를 할당하지 않아도 오류가 일어나지 않는다. 이와는 달리 객체 p2에선 age에 문자열을 할당하니 오류가 발생하였다. 선택속성을 사용하는 것은 값이 없어도 된다는 뜻이지만 달라도 된다는 것은 아니다.
인터페이스에서 정의되지 않은 값을 객체에서 새로 할당하는 것 역시 인터페이스의 계약 위반이다.
인터페이스에선 해당하는 값이 없기 때문이다.
class 클래스이름 implements 인터페이스 이름
클래스 User를 인터페이스 Greetable과 함께 정의하였다.
인터페이스 Greetable은 인터페이스 Named 를 상속한 하위 인터페이스이며 name이라는 값의 타입을 문자열로 지정한 설정을 가지고 있다. 즉, name의 값은 문자열이 와야 한다는 '특정 계약'을 가진 인터페이스이며 이를 클래스와 사용했다면 name의 값은 반드시 문자열이 와야 한다.
위의 코드는 Greetable 인터페이스를 가지고 왔으나 해당 클래스에서 name의 타입으로 숫자를 지정하려 하였고 인터페이스의 계약 때문에 오류가 발생하였다.
위의 코드는 클래스 User에 선언한 메서드 greet에 오류가 발생하였다. 이것 역시 인터페이스에서 정한 계약을 위반하여 발생한 오류이다. 인터페이스 Greetable에서 greet 메서드는 문자열을 인자로 받아 문자열을 반환하는 메서드로 정의하였는데 클래스 User에선 greet 메서드를 문자열이 아닌 void 형식을 반환하여 오류가 발생하였다.
이 역시, 문자열을 인자로 받아야 하는 계약에서 문자열이 아닌 숫자를 받아 오류가 발생하였다.
하나의 클래스에서 여러개의 인터페이스를 쓰기 위한 방법은 다음과 같다.
class 클래스 이름 implements 인터페이스1, 인터페이스2,..
위의 코드는 GetInfoText라는 인터페이스를 정의하였다. 이 인터페이스는 인자로 문자열 하나와 숫자를 하나 가지며 문자열을 반환하는 함수의 형태이다. 이후 getInfoText 라는 함수를 정의하며 GetInfoText의 인터페이스를 설정하였다.
함수와 인터페이스를 사용할 때 역시, 인터페이스에서 지정한 계약을 위반할 경우 오류가 발생한다. 예를 들어, 인터페이스에서 정한 반환값이 숫자일 때 getInfoText의 반환값은 문자열이기 때문에 오류가 발생한다.
타입스크립트 핸드북
https://typescript-kr.github.io/pages/interfaces.html
실전리액트프로그래밍(개정판) - 이재승지음
http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788966262670
Understanding TypeScript - 2021 Edition(Udemy강의)
https://www.udemy.com/course/understanding-typescript/