ProgrammingLang/typescript

[typescript] 11. 오버라이딩과 오버로딩 그리고 추상 class

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

[typescript] 11. 오버 라이딩(Overriding)과 오버 로딩(Overloading)

 

1. 오버 라이딩(Overrding)

  1) 개념

    부모 class에 정의된 method를 자식 class에서 재 정의하는 개념입니다.

 

  2) 사용 이유

      상속받은 부모 method를 무시하고 새로운 method를 정의하기 위해서 사용합니다.

    그리고 추상 class를 구현하기 위해서 사용합니다.

 

  3) 형태

    (1) Overriding이 가능한 조건

      A. overriden method의 매개변수 타입은 overriding method의 매개변수 타입과 같거나 상위 타입이어야 한다.

          (단, overrding method의 매개 변수 타입이 Any 타입이면 예외)

      B. overriden method의 매개변수 개수가 overrding method의 매개변수 개수와 같거나 많아야 한다.

          (단, A 조건이 성립된다는 전제가 있어야 한다)

 

  4) 사용법

    다음 코드에서는 Gun Class의 shot 함수는 Overrding에 의하여 RailGun Class에서 재 정의됩니다.

/**
 * 부모 class
 */
class Gun {
    shot(times: number) {
        for ( let i = 0; i < times; i++ ) {
            console.log("빵야!!!");
        }
        // this.magazine = 8;
    }
}

class RailGun extends Gun {
    shot(times2: number) {
        for ( let i = 0; i < times2; i++ ) {
            console.log("삐융~!!!");
        }
        // this.magazine = 8;
    }
}

let railgun = new RailGun();
railgun.shot(3);

2. 오버 로딩(Overloading)

  1) 개념

    - method의 이름은 같지만 매개변수의 개수는 동일하게 type은 다르게 정의하여 사용하는 방법입니다

    - 다른 언어의 Overloading 개념은 method명만 같으면 되지만 typescript는 Overloading을 사용하기 위해서는 

      함수명과 매개변수의 개수가 같아야 합니다.

 

  2) 사용 이유

      매개변수의 type만  다르고 동작은 동일할 때 코드를 줄이고자 사용합니다

 

  3) 형태

    - Overloading을 하기 Overloading으로 사용할 함수를 여러 개 선언해 주고 마지막에 정의를 해주면 됩니다.

 

  4) 사용법

/***************** method Overloading ****************** */
/**
 * 부모 class
 */
class Gun {
    shot(times: number): void {
        for ( let i = 0; i < times; i++ ) {
            console.log("빵야!!!");
        }
        // this.magazine = 8;
    }
}
/**
 * 자식 class
 */
class RailGun {
    shot(times3: number): void;
    shot(times3: any): void {
        console.log(times3 + " 번 맞췄다");
    }
}

let railgun = new RailGun();
railgun.shot(3);

/***************** 함수 Overloading ****************** */

function add(a: string, b: string): string;
function add(a: number, b: number): number;
function add(a: any, b: any): any {
    console.log(a + b);
}

add("Hello ", "Steve"); // returns "Hello Steve"
add(10, 20); // returns 30

 


1. 추상 class

  1) 개념

      추상적으로 구현된 class입니다. 이게말이 참 애매합니다. 추상적이다를 사전에서 찾아보면      " 구체성없이사실이나현실에서멀어져막연하고일반적인.또는그런것." 이라고 나옵니다.

    이를 추상 class로 구현 하게 되면 추상 속성과  method는 구체성이 없습니다 그러나 명확한

    속성과 method는 존재 할 수도 있습니다.

 

      그러므로 구체적으로 정의된 method를 포함하기 때문에 추상 class는 instace로 생성할 수

    없습니다. 그래서 class를 상속받아 구현을 한 class를 instance화 해서 사용 해야 합니다.

 

  2) 사용 이유

      무언가 대충(추상적으로) 구현을 해야 할 때 사용합니다. 협업을 하기 위해서는 구조를 설계

    해야 합니다. 그러려면 대충이라도 뭔가 만들어놔야 합니다. 그래야 협업을 하면서 개발을 할

    수 있습니다. . 그래서 이때 추상 class를 사용하여 자식 class로 만들 class들의 공통 속성과        method를 구현 해 놓고 자식 class에서는 추상 속성과 method를 구현하는 방식으로 class를

    확장해 나갑니다.

 

  3) 형태

    - overrding을 사용해서 추상 method를 구현합니다.

abstract class 추상클래스 {
    abstract 추상method();
    abstract 추상속성:string;
    public 구현method():void {
        공통적으로 사용할 로직을 추가합니다.
        로직에서 필요시 추상 method를 호출합니다.
        this.추상method();
    }
}

class 자식클래스 extends 추상클래스 {
    public 추상속성: sting;
    public 추상method(): void{
      추상method를 실제로 구현 
    }
}

  4) 사용 방법

/**
 * 추상 class
 */
abstract class Gun {
    abstract madedin: string;
    abstract shot(times: number): void;
}
/**
 * 자식 class
 */
class RailGun {
    madedin: string;
    shot(times3: any): void {
        this.madedin = "한국";
        console.log(this.madedin +  times3 + " 번 맞췄다");
    }
}

let railgun = new RailGun();
railgun.shot(3);

 

 

728x90
반응형