IT/JAVA
[JAVA] 다형성(polymorphism) 개념 및 이해하기
윤재웅
2018. 6. 25. 12:14
[JAVA] 다형성(polymorphism) 개념
- 다형성이란?
다형성은 상속과 깊은 관계가 있다. 객체지향개념에서 다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미하며 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록함으로써 다형성을 프로그램적으로 구현하였다.
인터페이스와 상속은 둘 다 다형성이라는 객체지향 프로그래밍의 특징을 구현하는 방식이다.
다형성: 하나의 객체를 여러 개의 타입으로, 하나의 타입으로 여러 종류의 객체를 여러 가지 모습으로 해석될 수 있는 성격이라고 생각하면 된다.
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 가 될수있습니다. 이러한 코드가 모두 다형성입니다.