만들어가는 세상

[JAVA] 다형성(polymorphism) 개념 및 이해하기 본문

IT/JAVA

[JAVA] 다형성(polymorphism) 개념 및 이해하기

윤재웅 2018. 6. 25. 12:14

[JAVA] 다형성(polymorphism) 개념

  1. 다형성이란?
    다형성은 상속과 깊은 관계가 있다. 객체지향개념에서 다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미하며 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록함으로써 다형성을 프로그램적으로 구현하였다.
    인터페이스와 상속은 둘 다 다형성이라는 객체지향 프로그래밍의 특징을 구현하는 방식이다.
  • 다형성: 하나의 객체를 여러 개의 타입으로, 하나의 타입으로 여러 종류의 객체를 여러 가지 모습으로 해석될 수 있는 성격이라고 생각하면 된다.

  • Java에서 다형성은 상속과 인터페이스를 통해 이루어진다. 다형성의 의미는 하나의 객체를 다양한 시선(타입)으로 바라볼 수 있게 한다는 의미이다. 중요한 것은 다양한 타입으로 본다는 사실 자체가 아니라 다양한 타입으로 객체를 바라보게 되면 호출할 수 있는 메소드 역시 타입에 따라 달라진다는 것이다. 상속의 오버라이딩을 설명하면서 오버라이딩을 하게 되면 컴파일러는 실제 객체의 메소드를 바라보는 것이 아니라. 변수 선언 타입의 메소드를 본다.

Mouse m = new WheelMouse( );
실제 객체가 WheelMouse이지만 컴파일러는 Mouse 타입의 메소드가 정상적으로 호출되고 있는지에만 관심을 두게 된다.
  • 인터페이스가 상속보다 다형성에 더욱 유연함을 제공한다.
    인터페이스는 클래스의 선언 뒤에서 여러 개의 인터페이스를 구현할 수 있게 할 수 있다. 이런 이유 때문에 하나의 객체를 여러 개의 타입으로 바라보는 다형성에는 상속보다 인터페이스가 더 큰 유연함을 제공한다고 할 수 있다.

예제

class Casting {
    public static void main(String args[]) {
        Car car = null;
        FireEngine fe = new FireEngine();
        FireEngine fe2 = null;
        fe.water();
        car = fe; // car =(Car)fe;에서 형변환이 생략된것이며 다형성입니다.
        fe2 = (FireEngine)car; //자손타입 ← 조상타입
        fe2.water();
    }
}
class Car {
    String color;
    int door;
    void drive() {// 운전
        System.out.println("drive");
    }
    void stop() {// 멈추는 기능    
        System.out.println("stop");    
}
class FireEngine extends Car { // 소방차
    void water() {// 물을 뿌리는 기능
        System.out.println("water");
    }
}

정리

A obj =new B();

b클래스를  인스턴스  하였지만  A  클래스  행세를  한것입니다.
A  클래스의  데이터를  사용합니다.
B  클래스가  A클래스를  상속하여  오버라이딩한  메소드가  있다면 B클래스의  오버라이딩한  메소드를 호출합니다.

이밖에 VO 클래스에서 private String test를 getter setter형태로 처리하는 로직을 많이 볼수있습니다.
private List<String> test 가 될수도 있으며, private String[] test 가 될수있습니다. 이러한 코드가 모두 다형성입니다.
Comments