-
서브 타입 슈퍼 타입카테고리 없음 2023. 12. 20. 16:15
A와 B 가 있고 B 가 A의 서브타입이면 A가 필요한 곳에 어디든 B를 안전하게 사용가능하고
A와 B가 있고 B가 A의 슈퍼타입이면 B가 필요한 곳에는 어디든 A를 안전하게 사용할 수 있다.
슈퍼 타입에서 서브로 가는걸 DOWNCASTING
서브에서 슈퍼로 가는걸 UPCASTING
UPCASTING
서브타입->슈퍼타입으로 변화
let dog: Dog = new Dog('또순이');
let animal: Animal = dog; // upcasting 발동!
animal.eat(); // 에러. 슈퍼타입(Animal)으로 변환이 되어 eat 메서드를 호출할 수 없어요! ---EAT는 서브타입에서만 사용가능도그가 서브 타입 애니멀이 슈퍼타입이면
슈퍼타입에 도그를 넣으면 슈퍼타입이 된다.
- upcasting이 필요한 이유는 서브타입 객체를 슈퍼타입 객체로 다루면 유연하게 활용할 수 있기 때문이에요!
- 예를 들어, Dog, Cat, Lion 그리고 기타 등등 다양한 동물을 인자로 받을 수 있는 함수를 만들고 싶다면?
- 올바른 선택: 아! Animal 타입의 객체를 받으면 모두 다 받을 수 있겠구나!
- 잘못된 선택: 아! union으로 새로운 타입을 만들어서 해당 타입의 객체를 받게해야겠구나!
- 예를 들어, Dog, Cat, Lion 그리고 기타 등등 다양한 동물을 인자로 받을 수 있는 함수를 만들고 싶다면?
DOWNCASTING
슈퍼를 서브로 변환한 것
let animal: Animal;
animal = new Dog('또순이');
let realDog: Dog = animal as Dog;
realDog.eat(); // 서브타입(Dog)로 변환이 되었기 때문에 eat 메서드를 호출할 수 있죠!필요한 경우는 도그 같은 서브타입 속성을 써야할 때 사용한다.
- upcasting이 필요한 이유는 서브타입 객체를 슈퍼타입 객체로 다루면 유연하게 활용할 수 있기 때문이에요!