ProgrammingLang/typescript

[typescript] 9. class 상속과 포함 관계

jinkwon.kim 2019. 5. 1. 20:00
728x90
반응형

[typescript] 9. class 상속과 포함 관계

 

1. 상속(IS-A)

  1) 개념

      상속은 class간의 계층을 만들어서 코드 중복을 줄이는 객체지향 프로그래밍 방법 입니다. 

    상속관계에는 부모 class 와 자식 class라는 개념이 존재하며, class를 상속을 받는 다는 것은 자식 class가

    부모 class의 공개된 속성과 method를 사용 할 수 있다는 것을 의미 합니다.

    typescript에서 자식 class는  1개의 부모 class만 상속 받을 수 있습니다.

 

  2) 상속 관려 용어 동의어 정리

    * 부모 class = base class = super class

    * 자식 class = derived classs = sub class

 

  3) 상속(IS-A) 관계를 만드는 방법

    상속(IS-A) 관계를 만들려면 다음 문장을 만들 었을 때 말이 되어야 합니다.

      "자식 Class is a 부모 Class 이다."

    Ex) 고양이 is a 동물이다.

         강아지 is a 동물이다.

    즉, 상속(IS-A) 관계를 만들기 위해서는 부모 Class는 자식 Class의 공통점을 가지고 있어야 한다.

    위 예시에서 고양이와 강지의 공통점은 모두 4발로 걷는다 이다. 그러므로 부모 Class(동물)에는 발이라는 속성을

    만들어 4개로 하면 됩니다.

    또한 고양이 , 강아지 모두 짖습니다.  그래서 "짖다" 라는 method를 부모 Class(동물)에 만들어 주면 됩니다.

 

  4) 구현 방법

    상기 3)의 내용을 가지고 부모, 자식 class를 만들어 보겠습니다.

    (1) 개념적 구현

      A. 부모 Class

        - 속성 : 발 4 개

        - 속성 : 종(동물)

        - method : 짖다.

      B. 강아지 자식 Class

        - 속성 : 종(고양이)

        - method : 강아지 짖기

      B. 강아지 자식 Class

        - 속성 : 종(강아지)

        - method : 고양이 짖기

 

    (2) Code 구현

      - 상속을 구현하기 위해선 extends를 가지고 구현 합니다.

      - 부모 Class의 생성자를 호출 하기 위해서 super() method를 자식 class의 생성자에서 호출 합니다.

      A. 부모 Class Code 구현

/**
 * 부모 Class
 */
class Animal {
    // 발 속성
    foots: number;
    // 종 속성
    ancestorSpcies: string;
    constructor() {
        this.ancestorSpcies = "동물";
        this.foots = 4;
    }
    
    // 짖는 method
    bark(): string {
        return "짖는다 크릉!!!";
    }
}

      B. 강아지 자식 Class 구현

/**
 * 강아지 자식 class
 */
class Dog extends Animal {
    species: string;
    constructor() {
        super();
        this.species = "강아지";
    }

    work() {
        // 부모 class의 속성을 사용 ancestorSpcies , foots
        console.log(this.ancestorSpcies + "인 " + this.species + this.foots + "발로 걷는다.");
    }

    dogbark() {
        // 부모 class의 method를 사용
        console.log(this.species + "는 " + this.bark() + "왈왈");
    }
}

      C. 고양이 자식 Class 구현    

/**
 * 고양이 자식 class
 */
class Cat extends Animal {
    species: string;
    constructor() {
        super();
        this.species = "고양이";
    }

    work() {
        // 부모 class의 속성을 사용 ancestorSpcies , foots
        console.log(this.ancestorSpcies + "인 " + this.species + this.foots + "발로 걷는다.");
    }

    catbark() {
        // 부모 class의 method를 사용
        console.log(this.species + "는 " + this.bark() + "야옹!!");
    }
}

      A. 실행 코드 

let dog1: Dog = new Dog();
dog1.work();
dog1.dogbark();

let cat1: Cat = new Cat();
cat1.work();
cat1.catbark();

2. 포함(HAS-A)

  1) 개념

      class가 다른 class를 포함한는 관계 입니다. 풀어서 말하면 포함하는게 갖는 것이기 때문에 HAS-A 관계 입니다. 

    포함(HAS-A) 관계는 크게 2개로 나눠 집니다.

 

    (1) 합성(composition) 관계 (강한 관계)

      - A Class가 B Class를 생성자함수에서 생성하여 속성으로 포함 하는 것입니다.

      - A Class를 instance생성 후 제거 될시 B Class instance 역시 제거 됩니다.

        (instance 생명 주기를 함께 합니다)

 

    (2) 집합(aggregation) 관계 (약한 관계)

      - A Class가 B Class를 생성자함수의 매개변수로 받아서 속성으로 포함하는 것입니다.

      - A Class를 instance생성 후 제거 될시 B Class instance는 따로 제거해 줘야 합니다.

        (instance 생명 주기가 개별 적입니다.)

 

  2) 구현 방법

    (1) 합성(composition) 관계 (강한 관계)

/**
 * engine
 */
class Engine {
    make: string;
    constructor() {
        this.make = "korea";
    }
}

// 포함관계 Class
class KoreaCar {
    engine: Engine;
    constructor() {
        this.engine = new Engine();
    }
}
let mycar = new KoreaCar();

    (2) 집합(aggregation) 관계 (약한 관계)

/**
 * engine
 */
class Engine {
    make: string;
    constructor() {
        this.make = "korea";
    }
}

// 집합 관계 Class
class AmericaCar {
    engine: Engine;
    constructor(engine: Engine) {
        this.engine = engine;
    }
}

let engine = new Engine();
let supercar = new AmericaCar(engine);
728x90
반응형