티스토리 뷰

Design Pattern

객체의 다형성(polymorphism)

siyoon210 2018. 10. 30. 10:03
반응형

개요

다형성의 사전적 의미는 '여러 개의 형태를 갖는다'라는 뜻이다. 여러 형태를 갖으므로써 사용자는 사용편의성을 취할 수 있다.

다형성이라는 것은 객체에게만 국한된 개념은 아니다. 버로딩오버라이딩은 메소드의 다형성을 쉽게 설명할 수 있는 개념이다. 반면에, 객체의 다형성은 쉽지 않아 개념을 정리해보았다. 


설명을 위한 예제 클래스는 아래와 같이 구현되어 있다.

class 자동차{
    void run() {
        System.out.println("달린다.");
    }
}

class 슈퍼카 extends 자동차{
    @Override
    void run() {
        System.out.println("빨리 달린다.");
    }

    void turbo() {
        System.out.println("순간 가속도를 최대로 올린다.");
    }
}

슈퍼카는 자동차를 상속받은 자식클래스로 run메소드를 오버라이딩 하였고, 추가적으로 turbo라는 메소드도 정의되었다.



자바의 객체 선언 문법

다형성을 설명하기에 앞서서 자바의 객체선언 문법을 정확하게 이해 한다면, 다형성에 대한 이해를 좀 더 쉽게 할 수있다. 아래의 예제로 간단히 살펴보자.


참조타입 참조변수 = new 생성자();

이 문법을 풀어서 말해보면,

→ "새로운 객체를 생성 할 것인데, 객체의 이름은 참조변수이고,  참조타입의 역할을 수행하기 위해 만들어진 만들어진 객체이다."

(참고: 정확하게는 객체의 이름이 아니라, 객체를 참조하고 있는 것의 이름이라고 표현해야 합니다.)


예제로 치환해보면,

ex) 자동차 붕붕이 = new 슈퍼카();

→ "새로운 객체를 생성 할 것인데, 객체의 이름은 붕붕이이고,  자동차의 역할을 수행하기 위해 만들어진 슈퍼카이다."

자세한 설명은 아래 이어서 하겠다. 


객체의 여러가지의 형태 (다형성)

자동차와 관련된 객체 3가지를 선언했다.

자동차 차차 = new 자동차();
슈퍼카 붕붕이 = new 슈퍼카();
자동차 타요 = new 슈퍼카();

첫번째 객체 차차의 경우는 run메소드를 호출하게 되면, "달린다"를 출력한다.

두번째 객체 붕붕이의 경우는 run메소드를 호출하게 되면, 오버라이딩 된 메소드를 호출 할테니, "빨리 달린다"를 출력한다.

세번째 객체 타요의 경우는 run메소드를 호출하게 되면, 참조변수가 자동차 일지라도, 오버라이딩된 "빨리 달린다"를 출력한다. (이건 오버라이딩의 중요한 특성이다.)


그럼 붕붕이와 타요의 차이는 뭘까? 바로 추가된 turbo메소드의 호출 가능 여부다.

붕붕이슈퍼카의 역할을 수행하기 위해 만들어진 슈퍼카이다.

타요자동차의 역할을 수행하기 위해 만들어진 슈퍼카이다.


붕붕이슈퍼카 역할을 수행하기에, turbo메소드 호출이 필요할 것이고, 호출 할 수 있다.

반면, 타요자동차 역할을 수행하기에, 슈퍼카의 turbo메소드는 호출할 필요도 없고 호출할 수도 없다.


이제 자연스럽게 생기는 궁금증이 나올 수 있다.

그럼 굳이 자동차로써 동작하는 슈퍼카 객체는 왜 쓰는가?


내가 공부한 바로는 크게 2가지 경우가 있었다.


  1.  객체를 사용하는 사용자에게 참조타입으로써의 동작만 강요하고 싶은 경우
    ex) 슈퍼카를 발렛파킹하는 직원(사용자)이 굳이 turbo메소드를 호출할 필요는 없다. 그럼 자동차로써의 동작만을 강제시킨다.
  2. 부모(조상)클래스에게 상속받은 메소드만을 (오버라이딩된 메소드도 포함) 사용 하는 객체일 경우 
    ex) 만약 슈퍼카가 아닌, 자동차 클래스 상속받은 다른 클래스로 변경해야 할 때, 객체 선언문만 변경한다면 나머지 코드는 검토하지 않아도 된다. 유지보수의 이점이 있는 것이다. (이는 스프링의 의존성 주입을 알고 있다면 더 직관적으로 받아들일 수 있다.)   

결론적으로 메소드의 다형성(오버로딩, 오버라이딩)과 클래스의 다형성 모두 사용자에게 편의성을 제공해준다는 점을 기억하자

부모(조상)클래스의 대표성

위에서 설명한 객체 차차,붕붕이,타요는 모두 자동차로 대표될 수 있다. 

ex) 주차장에 들어 올 수 있는 객체의 조건은 '자동차'로 충분하다. '자동차'라고 명시해주는 것만으로도 자동차를 상속받고 있는 자손클래스들의 객체는 주차장에 입장이 가능하다.  Java의 문법으로 설명하자면, 매개변수의 타입으로 자동차를 명시해주는 것은, 자동차 뿐만 아니라 자동차를 상속받고 구현한 객체들을 받을 수 있다. 


ex) 모호할 수 있으니 예를 한가지 더 들어보겠다. '사람'이라는 부모(조상)클래스를 상속받아 구현한 객체 '학생', '개발자', '정치인' 등등은 모두 '사람'으로 대표될 수 있을 것이다.


반응형

'Design Pattern' 카테고리의 다른 글

전략 패턴 (strategy pattern)  (0) 2019.01.23
객체 설계의 응집도란?  (2) 2019.01.15
객체지향의 4대 특성  (2) 2018.12.31
객체의 추상화 (Abstraction)  (0) 2018.12.04
객체의 캡슐화(Encapsulation), 접근제어자  (0) 2018.11.21
댓글