본문 바로가기

심층 자바스크립트(7)메서드 오버라이딩

by Recstasy 2019. 6. 13.

'오버라이딩'은 '덮어쓰기'다. 프로그램을 제작하면서, 상위 클래스의 메서드를 하위 클래스에서 값만 바꿔서 그대로 사용하기를 원한다면 '오버라이딩'을 실행하면 된다. 만일 클래스를 상속했는데 메서드 덮어쓰기가 안 된다면, 프로그램 효율성이 떨어질 것이다. 


반대로 오버라이딩을 못하게 함으로써 '뒤로 가기' 버튼을 통해 몇번까지 되돌릴 수 있는 식의 효율성을 높일 수도 있다. 디테일한 코드를 작성하려면 '오버라이딩'을 금지하거나 사용하는 식의 개념을 확실하게 알아둘 필요가 있다. 

1 『클래스 생성』

일단 Genesis라는 클래스를 임의로 만들어보자. Genesis클래스는 향후 생산될 세부모델들의 전체 프레임(뼈대)이 되는 기본 모형이라고 가정한다.


 class Genesis{

    constructor(){

       this.name = "제네시스 승용차 프레임";

       this.structure = 'A34FD-5C';

       this.strength = "10.3";

       this.engine = null;

   }

    getName(){

      return this.name;

   }

   setName(name){

      this.name = name;

  }

  setEngine(engine){                

       this.engine = engine;

   }

  toString(){

     let setEngine = this.engine;

     return setEngine;

  }

}


Genesis 클래스에는 하위 G70, G80, G90에 공용으로 사용될 속성값이 정해져 있고, toString()메서드에는 바뀐 엔진 이름을 외부로 보낼 수 있는 return값이 있다. 가령, g70이라는 차를 만든다고 한다면,  Genesis클래스를 활용하거나 혹은 G70이라는 클래스를 만들고, Genesis클래스를 상속받아서 사용할 수도 있다. 


Genesis기본 클래스에서 g70, g80이라는 차량을 생산한다고 가정해보자. g70과 g80의 엔진이 같다면 g70을 클래스로 만들고, 이를 g80이 상속받을 수 있다. 하지만 g70과 g80이 서로 다른 엔진을 사용한다면, 각각 Genesis클래스에서 엔진값을 정해야 한다. 


아래 상황에서 g70은 그대로 Genesis클래스를 사용한다.


   let g70 = new Genesis();

       g70.setName('Genesis G70');    //Genesis클래스에 이름을 지정  


       console.log(g70.name);     // >> Genesis G70

       console.log(g70.engine);   // >> null

       g70.setEngine('MPI 3.7람다엔진');   // MPI 3.7람다엔진 지정

       console.log(g70.toString());  // 현재 setEngine값 도출



2  『클래스 메서드 오버라이딩』

Genesis클래스에서 toString()메서드의 내용을 변경하려면 어떻게 해야할까? 방법은 간단하다. 상속받은 클래스에서 해당 메서드의 내용을 바꿔주면 그대로 오버라이딩(덮어쓰기)이 된다.


class G80 extends Genesis{       //G80클래스가 Genesis클래스를 상속받음

    constructor(){

        super();

    }

    upgradeBrake(){            //G80의 새로운 기능(메서드)탑재

        let brakeModel = "브람보1.74"

         return brakeModel;

    }

    toString(){

         return this.upgradeBrake();

   }

}

    let g80 = new G80();    //G80클래스 인스턴스 생성

 

    g80.setName('제네시스G80');  //g80 이름을 지정

    console.log(g80.name);         //>>제네시스 g80

    console.log(g80.toString());    //>>브람보1.74



오버라이딩은 간단하다. 상위 클래스의 메서드의 값에 새로운 내용을 삽입하고, return값으로 반환하면 된다. 만일 상위 클래스의 메서드를 변경하지 못하게 하려면 캡슐화를 진행하자. (캡슐화 참고 https://webdoli.tistory.com/115)  

댓글

최신글 전체

이미지
제목
글쓴이
등록일