-
2023 - 08 - 02 타입스크립트 클래스 class, 서브타입, 슈퍼타입, upcasting, downcasting, 추상클래스, abstract, 인터페이스, interfaceToday I Learned/TIL 08 2023. 8. 1. 19:56
오늘 배운 것: 클래스 class, 서브타입, 슈퍼타입, upcasting, downcasting, 추상클래스, 인터페이스
class Animal { name: string; constructor(name: string) { this.name = name; } makeSound() { console.log('동물 소리~'); } } class Dog extends Animal { age: number; constructor(name: string) { super(name); this.age = 5; } makeSound() { console.log('멍멍!'); // 부모의 makeSound 동작과 달라요! } eat() { // Dog 클래스만의 새로운 함수 정의 console.log('강아지가 사료를 먹습니다.'); } } class Cat extends Animal { // Animal과 다를게 하나도 없어요! } const dog = new Dog('누렁이'); dog.makeSound(); // 출력: 멍멍! const cat = new Cat('야옹이'); cat.makeSound(); // 출력: 동물 소리~ 자식클래스 dog, cat중 dog은 새로운 생성자와 super키워드를 사용해 부모의 함수동작을 재정의해서 새로운 소리를 출력했지만, 즉 오버라이딩을 했지만, cat 같은 경우에는 부모의 함수동작을 그대로 물려받아 똑같이 "동물 소리~" 출력을 했다.
서브타입 : 두 개의 타입 A, B가 있고 B가 A의 서브타입이면 A가 필요한 곳에는 어디든 B를 안전하게 사용할 수 있다.
슈퍼타입 : 두 개의 타입 A, B가 있고 B가 A의 슈퍼타입이면 B가 필요한 곳에 는 어디든 A를 안전하게 사용할 수 있다.
any는 모든 것의 슈퍼타입이다.
Animal은 Dog, Cat의 슈퍼타입이고, Dog, Cat은 Animal의 서브타입이다.
upcasting
let dog: Dog = new Dog('또순이'); let animal: Animal = dog; // upcasting 발동! animal.eat(); // 에러. 슈퍼타입(Animal)으로 변환이 되어 eat 메서드를 호출할 수 없어요!
서브타입 → 슈퍼타입으로 변환하는 것을 upcasting이라고 한다.
이 경우 타입 변환은 암시적으로 이루어져, 별도의 타입 변환 구문이 없어도 된다.
ㅇㅖ를들어 Dog, Cat, Lion 등 다양한 동물을 인자로 받을 수 있는 함수를 만들고 싶다면 Animal 타입의 객체를 받으면 모두 다 받을 수 있다.
downcasting
let animal: Animal; animal = new Dog('또순이'); let realDog: Dog = animal as Dog; // as키워드 사용 realDog.eat(); // 서브타입(Dog)로 변환이 되었기 때문에 eat 메서드를 호출할 수 있죠!
슈퍼타입 → 서브타입으로 변환하는 것을 downcasting이라고 한다.
이 경우 as 키워드로 명시적 타입 변환을 해줘야함.
추상 클래스 : 클래스와는 다르게 인스턴스화를 할 수 없는 클래스
추상 클래스의 목적은 상속을 통해 자식 클래스에게 메서드를 구현하도록 하는 용도이다.
추상 클래스 및 추상 함수는 abstract 키워드를 사용하여 정의한다.
abstract class Shape { abstract getArea(): number; // => 이 코드가 바로 추상함수다. printArea() { console.log(`도형 넓이: ${this.getArea()}`); } } class Circle extends Shape { radius: number; constructor(radius: number) { super(); this.radius = radius; } getArea(): number { // 원의 넓이를 구하는 공식은 파이 X 반지름 X 반지름 return Math.PI * this.radius * this.radius; } } class Rectangle extends Shape { width: number; height: number; constructor(width: number, height: number) { super(); this.width = width; this.height = height; } getArea(): number { // 사각형의 넓이를 구하는 공식은 가로 X 세로 return this.width * this.height; } } const circle = new Circle(5); circle.printArea(); const rectangle = new Rectangle(4, 6); rectangle.printArea();
Shape 클래스의 abstract getArea(): number; 코드가 바로 추상 함수다.
이 추상 클래스를 상속받은 자식 클래스들은 반드시 getArea 함수를 구현해야 한다.
인터페이스 : 타입스크립트에서 객체의 타입을 정의하는데 사용된다.
인터페이스는 객체가 가져야 하는 속성과 메서드를 정의한다. 또한, 인터페이스를 구현한 객체는 인터페이스를 반드시 준수해야 하는데, 이는 규약과 같아서 어길 수가 없다.
추상 클래스와 인터페이스의 차이점:
추상클래스: (구현부 제공여부)클래스의 기본 구현을 제공한다. (상속 메커니즘)단일 상속만 지원한다. (구현 메커니즘) 추상클래스를 상속받은 자식 클래스는 반드시 추상함수를 구현해야 한다
인터페이스: (구현부 제공여부)객체의 구조만을 정의하고 기본 구현을 제공하지 않는다. (상속 매커니즘) 다중 상속을 지원해서, 하나의 클래스는 여러 인터페이스를 구현할 수 있다. (구현 메커니즘) 인터페이스를 구현하는 클래스는 인터페이스에 정의된 모든 메서드를 구현해야 한다,
'Today I Learned > TIL 08' 카테고리의 다른 글