인터페이스 사용
인터페이스는 속성뿐만 아니라 메서드 선언도 포함할 수 있다.(구현X)
그리고 클래스 선언엔 implements 키워드와 인터페이스 이름을 사용할 수 있다.
즉, 인터페이스는 메서드 시그니처만을 포함하지만, 클래스는 메서드 구현이 포함될 수 있다.
MotorVehicle 인터페이스에 5개의 메서드를 선언했다.(구현X)
위 코드는 컴파일되지 않아 Class 'Car' incorrectly implements interface 'MotorVehicle'. 이라는 에러가 뜬다.
-> 인터페이스로 클래스를 선언할 때 인터페이스 내 각 메서드를 구현해야 함을 뜻한다.
즉, Car 클래스가 MotorVehicle 인터페이스에 선언된 API를 반드시 구현할 것임을 약속함을 의미한다.
위 코드는 car의 타입을 명시적으로 선언하지 않았다.
-> 이렇게 명시적으로 선언할 수 있다.
또, Car 클래스는 커스텀 타입을 구현하기 때문에 MotorVehicle 타입을 선언할 수 있다.
Car, MotorVehicle 타입의 차이점은?
만약 Car 클래스가 8개의 메서드를 구현하고 다섯 개는 MotorVehicle 인터페이스이며 나머지는 임의의 메서드이다.
car의 타입이 Car라면 8개의 메서드 모두 호출할 수 있지만 MotorVehicle이라면 인터페이스 내 선언된 5개의 메서드만 호출이 가능하다.
-> 이를 인터페이스는 특정 규약을 강제한다고 말할 수 있다.
따라서 Car 클래스는 MotorVehicle 인터페이스에 선언된 메서드 5개를 모두 구현해야 한다.
SecretServiceCar 클래스는 일반 자동차에서 비행 및 수영이 가능한 객체이고 Car는 일반 자동차 객체이다.
인터페이스 확장
클래스 구문에 implements Flyable이 포함돼있다면 MotorVehicle 인터페이스에 선언된 5개의 메서드와 Flyable에 선언된 2개의 메서드를 합친 총 7개의 메서드를 구현해야 한다.
인터페이스 프로그래밍
API를 인터페이스로 선언한다는 말은 곧 필요한 기능에 대해 오랫동안 생각한 뒤 자세하게 구현했다는 의미이다.
팩토리 함수
: 비즈니스 로직을 구현하고 객체의 인스턴스를 반환하는 함수
열거타입
: 일정 수의 상수로 구성된 집함을 만듦 상수로는 숫자나 문자열을 사용할 수 있다.
-> 제한된 수의 상수로 구성된 새로운타입을 만들 수 있음
높은 가독성이 필요하고 일정 집합에만 값을 배정하고 싶으며, 데이터 저장을 효율적으로 하고 싶은 상황에선 열거 타입을 사용하는 것이 좋다.
-> enum 키워드 사용
숫자형 열거
-> 열거를 이용해 요일을 표시하는 타입을 선언했다.
각 요일은 점 표기법으로 참조할 수 있다.
dayOff 변수의 값은 2이다.
-> 월요일은 1로 초기화하고 나머지 값은 자동으로 1씩 증가한다.
기본적으로 열거 타입은 0부터 시작한다.
-> Weekdays에서 값이 3인 멤버 이름을 출력 (Wednesday)
마지막 줄에서 FtoC나 CtoF가 아닌 ABCD라는 잘못된 값을 전달했지만 컴파일러는 오류를 감지하지 못한다.
이럴 때 열거타입을 사용해주면?
위 함수의 두 번째 파라미터 타입은 Direction으로 열거 타입 멤버 중 하나를 전달해 함수를 호출한다.
즉 열거타입의 목적은 CtoF나 FtoC와 같은 제한된 값으로 구성된 상수 세트를 만드는 것이다.
문자열 열거
수가 제한된 문자열 상수 집합을 선언할 때 열거 타입을 멤버의 값을 문자열로 초기화할 수 있다.
플레이어가 네 방향으로 움직이는 게임을 프로그래밍한다고 가정해보자.
-> 문자열 값으로 enum 멤버를 초기화함
그냥 문자열 상수를 선언하면 되는데 왜 열거 타입을 사용할까?
move(where:string) 이라는 함수가 있을 때 실수로 move('North')를 호출할 수 있다.
그래서 파라미터 타입을 Direction 타입으로 바꾸는 게 안전하다.
=> move(where:Direction)
enum을 대신하는 방법
1. 유니온
-> North라고 전달하면 오류가 발생
2. 커스텀 타입
-> North라고 전달하면 오류 발생
문자열 열거 타입은 서버나 데이터베이스에서 오는 문자열 값에 쉽게 맵핑되어 타입을 추가하지 않아도 된다.
const enum의 사용
: const enum을 사용하면 자바스크립트가 생성되지 않는다.
enum Direction 부분은 js코드로 생성되지 않는다.
theNextMove의 값은 열거 타입 멤버의 값인 'DOWN'으로 반환된다.
대부분 열거 타입은 코드 가독성 향상을 위해 사용된다.
제네릭
타입도 파라미터가 될 수 있다.
제네릭을 사용하면 다양한 타입을 지원하는 함수를 작성할 수 있다.
-> 제네릭을 사용해함수를 선언하면 함수의 호출자가 나중에 구체적인 타입을 지정할 수 있다.
제네릭 타입은 T in Array<T>와 같이 임의의 문자로 표시한다.
배열 내 요소의 타입을 선언할 때 <> 기호 안에 해당 타입을 작성한다.
예 : let lotteryNumbers:Array<number>;
제네릭
: 코드를 사용할 때 타입을 선언함으로써 여러 종류의 타입 값을 처리할 수 있게 해준다.
-> 배열 내 모든 요소가 동일한 타입이며 선언 방법도 동일하지만 첫번째가 읽기 쉽다.
두번째 구문의 <>는 타입파라미터를 가진다.
number 타입으로 제한하면서 이 배열을 인스턴스화할 수 있다.
-> Person 타입인 객체가 10개인 배열을 생성함. people의 타입은 Person[]임을 유추 가능하다.
ts 배열은 모든 타입의 객체를 가질 수 있지만, 제네릭 타입은 배열에서 허용되는 특정 타입을 지정해야 함
-> 배열 인스턴스에 제약 조건이 적용됨
-> workers는 Person타입인 배열이고 Animal은 Person 타입이 아니기 때문에 컴파일되지 않는다.
-> 자바, C#과 달리 ts는 구조적 타입 시스템을 가지기 때문에 위 코드처럼 Animal이 Person과 똑같은 name 프로퍼티를 가지면 오류가 발생하지 않는다.
새 인스턴스를 생성할 필요 없이 객체 리터럴 구문을 대신 사용할 수 있다.
만약 서로 다른 타입을 저장하는 배열이라면
const values1:Array<string|number> = ["hyerin", 123]; -> 이렇게 사용할 수 있다.
'Language > Type Script' 카테고리의 다른 글
[Type Script] 제네릭 함수 생성, 고차 함수 (0) | 2022.02.02 |
---|---|
[Type Script] 제네릭 타입 생성 (0) | 2022.02.01 |
[Type Script] super 메서드와 키워드, 추상 클래스, 메서드 오버로딩, 오버로딩 생성자 (0) | 2022.01.26 |
[Type Script] OOP, 클래스 상속, 접근 제어자, static 키워드 (0) | 2022.01.25 |
[Type Script] 커스텀 타입의 유니온, any와 unknown 차이, 연습문제 풀어보기 (0) | 2022.01.23 |
댓글