본문 바로가기

TypeScript

[TypeScript] 상속

상속(inheritance)

 

출처: https://intellipaat.com/blog/tutorial/python-tutorial/python-classes-and-objects/?US

 

- 상속은 객체 지향 프로그래밍에서 클래스 간의 관계를 정의하는 중요한 개념

- 상속을 통해 기존 클래스의 속성과 메서드를 물려받아 새로운 클래스를 정의할 수 있음

- 상속이 있어서 똑같은 코드를 계속 반복적으로 작성할 필요가 없음. 

- 위의 예제에서 Car 라는 클래스를 생성했으면 무스탕, 골프와 같은 차량들은 Car 라는 클래스를 상속받고 자체적으로 필요한 속성 및 메소드를 추가하면 끝

- 상속을 구현하려면 extends 키워드를 사용하면 됨.

 

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(); // 출력: 동물 소리~

여기서 Animal 은 부모클래스, Dog는 자식클래스라고 한다. super 키워드는 자식클래스가 부모 클래스를 참조하는데 사용하는 키워드.

super 키워드는 자식 클래스가 부모클래스를 참조하는데 사용하는 키워드이며, 자식 클래스에서 생성자를 정의할 때 부모 클래스의 생성자를 호출해야 하는데 사용

자식 클래스가 부모 클래스의 생성자나 메서드를 그대로 사용하고 싶다면 자식클래스에선 다시 작성하지 않아도 됨 -> Cat 클래스

Dog 클래스는 부모의 makeSound 함수의 동작을 새롭게 정의하는데, 이를 오버라이딩 이라고 한다. 

 


 

서브타입, 슈퍼타입

 

서브타입 : 두 개의 타입 A와 B가 있고, B가 A의 서브타입이면 A가 필요한 곳에는 어디든 B를 안전하게 사용할 수 있다.

슈퍼타입 : 두 개의 타입 A와 B가 있고, B가 A의 슈퍼타입이면 B가 필요한 곳에는 어디는 A를 안전하게 사용할 수 있다.

 

- any 는 모든 것의 슈퍼타입

- Animal은 Dog, Cat의 슈퍼타입이고 Dog, Cat은 Animal 의 서브타입

 

출처: https://www.zhenghao.io/posts/type-hierarchy-tree

 


upcasting-downcasting

 

upcasting 과 downcasting 은 슈퍼타입, 서브타입으로 변환할 수 있는 타입변환 기술

 

 

upcasting

서브타입 -> 슈퍼타입으로 변환하는 것으로 타입 변환은 암시적으로 이루어져 별도의 타입 변환 구문이 필요없음.

즉, TypeScript 가 자동으로 타입변환을 해준다.

 

let dog: Dog = new Dog('또순이');
let animal: Animal = dog; // upcasting 발동! 
animal.eat(); // 에러. 슈퍼타입(Animal)으로 변환이 되어 eat 메서드를 호출할 수 없어요!

 

upcasting이 필요한 이유는 서브타입 객체를 슈퍼타입 객체로 다루면 유연하게 활용할 수 있기 때문임.

예를 들어, Dog, Cat, Lion 그리고 기타 등등 다양한 동물을 인자로 받을 수 있는 함수를 만들고 싶다면?

- 올바른 선택: 아! Animal 타입의 객체를 받으면 모두 다 받을 수 있겠구나

- 잘못된 선택: 아! union으로 새로운 타입을 만들어서 해당 타입의 객체를 받게해야겠구나

 

 

 

downcasting

슈퍼타입  -> 서브타입으로 변환하는 것으로 as 키워드로 명시적으로 타입 변환을 해주어야 함.

 

let animal: Animal;
animal = new Dog('또순이');

let realDog: Dog = animal as Dog;
realDog.eat(); // 서브타입(Dog)로 변환이 되었기 때문에 eat 메서드를 호출할 수 있죠!

 

'TypeScript' 카테고리의 다른 글

[TypeScript] 인터페이스  (0) 2023.07.26
[TypeScript] 추상 클래스  (0) 2023.07.26
[TypeScript] 클래스  (0) 2023.07.26
[TypeScript] 프로젝트 세팅  (0) 2023.07.26
[TypeScript] 유틸리티 타입  (2) 2023.07.26