ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2023 - 08 - 02 타입스크립트 클래스 class, 서브타입, 슈퍼타입, upcasting, downcasting, 추상클래스, abstract, 인터페이스, interface
    Today 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 함수를 구현해야 한다.

     


    인터페이스 : 타입스크립트에서 객체의 타입을 정의하는데 사용된다.

    인터페이스는 객체가 가져야 하는 속성과 메서드를 정의한다. 또한, 인터페이스를 구현한 객체는 인터페이스를 반드시 준수해야 하는데, 이는 규약과 같아서 어길 수가 없다.

     

    추상 클래스와 인터페이스의 차이점:

     

    추상클래스: (구현부 제공여부)클래스의 기본 구현을 제공한다. (상속 메커니즘)단일 상속만 지원한다. (구현 메커니즘) 추상클래스를 상속받은 자식 클래스는 반드시 추상함수를 구현해야 한다

     

    인터페이스: (구현부 제공여부)객체의 구조만을 정의하고 기본 구현을 제공하지 않는다. (상속 매커니즘) 다중 상속을 지원해서, 하나의 클래스는 여러 인터페이스를 구현할 수 있다. (구현 메커니즘) 인터페이스를 구현하는 클래스는 인터페이스에 정의된 모든 메서드를 구현해야 한다,

    댓글

Designed by Tistory.