저장을 습관화

객체 지향 프로그래밍 - 상속 본문

공부/TypeScript

객체 지향 프로그래밍 - 상속

ctrs 2023. 8. 1. 21:59

1. 상속

 

객체 지향 프로그래밍에서 클래스(붕어빵 틀)들 간의 관계를 정의한다.

상속을 통해 기존 클래스(베이스 클래스 or 부모 클래스)의 속성과 메서드(속이 팥인지 슈크림인지)를 물려받아

새로운 클래스를 정의할 수 있다.

상속이 있기에 똑같은 코드를 반복적으로 작성할 필요가 없다.

 

상속을 구현하려면 extends 키워드를 사용한다

 

사용 예시)

class Animal {
  name: string;

  constructor(name: string) {
    this.name = name;
  }

  makeSound() {
    console.log('동물 소리~');
  }
}

class Dog extends Animal { // Animal 클래스와 객체, 메소드가 동일
  age: number;

  constructor(name: string) {
    super(name); // super는 베이스 클래스(부모 클래스의 생성자를 호출하는 키워드
    this.age = 5;
  }

  makeSound() {
    console.log('멍멍!'); // 부모(Animal)의 makeSound 동작과 다르다
  }

  eat() { // Dog 클래스만의 새로운 함수 정의
    console.log('강아지가 사료를 먹습니다.');
  }
}

class Cat extends Animal { // Animal 클래스와 객체, 메소드가 동일
}

const dog = new Dog('누렁이');
dog.makeSound(); // 출력: 멍멍!

const cat = new Cat('야옹이');
cat.makeSound(); // 출력: 동물 소리~

보통 상속을 사용할때 cat 클래스처럼 모든 내용을 전부 가져와서 사용하지는 않는다.

상속을 사용하는 이유는 부모 클래스의 내용+a를 사용하기 위해서이기 때문이다.

 

 

 

2. 서브타입과 슈퍼타입

 

1) 서브타입

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

 

 

2) 슈퍼타입

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

 

위 상속의 예시 코드에서 클래스 Animal은 클래스 Dog, Cat의 슈퍼타입이고,

클래스 Dog, Cat은 클래스 Animal의 서브타입이다.

 

 

 

3. upcasting과 downcasting

 

1) upcasting

서브타입에서 슈퍼타입으로 변환한다.

이 경우 타입 변환은 암시적으로 이루어지기 때문에 별도의 타입 변환 구문은 필요하지 않다.

 

예시)

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

 

- upcasting을 사용하는, 필요로 하는 이유

서브타입 객체를 슈퍼타입 객체로써 다룰 때, 유연하게 활용할 수 있는 여지가 많아진다.

 

예를 들어 Dog, Cat, Lion... 다양한 동물을 인자로 받을 수 있는 함수를 만들고 싶다면

Animal 타입의 객체를 받음으로써 위 동물들의 인자를 다 받아올 수 있다.

 

 

2) downcasting

슈퍼타입에서 서브타입으로 변환한다.

이 경우 as 키워드를 사용하여 타입의 변환을 명시적으로 표현한다.

 

예시)

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

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