다형성이란?
다형성이란 하나의 객체가 여러가지 타입을 가질 수 있는 것을 의미한다. 즉, 부모 클래스 타입의 참조 변수로 자식 클래스의 객체를 참조할 수 있도록 허용하여 부모 클래스의 동일한 메시지로 자식 클래스들이 서로 다른 동작을 할 수 있도록 한다.
다형성의 장점
- 재사용성 (Reusability)
상속관계에 있는 클래스들은 공통된 부분을 부모 클래스에 정의하고, 자식 클래스에서는 부모 클래스를 확장하여 필요한 추가 기능 구현이 가능하다. 따라서 불필요한 코드를 줄이고 재사용성을 높일 수 있다. - 유연성 및 확장성 (Flexibility & Scalability)
프로그램 내에서 객체의 타입을 쉽게 변경할 수 있기 때문에, 코드를 수정하지 않고도 새로운 클래스 타입의 객체를 쉽게 추가하거나 변경할 수 있다. 따라서, 시스템의 확장성이 향상되며, 새로운 기능 추가나 요구 사항의 변화에 더 빠르고 유연한 대처가 가능해진다. - 유지보수성 (Maintainability)
기존 코드의 변경 없이 새로운 클래스를 시스템에 추가할 수 있다. 새로운 클래스가 기존 시스템에 통합될 때, 이 클래스는 이미 정의된 공통 인터페이스를 사용하므로, 기존 코드를 변경할 필요가 없다.
다형성의 조건
- 상위 클래스와 하위 클래스는 상속 관계이어야 한다.
- 다형성이 보장되기 위해 오버라이딩이 반드시 필요하다.
- 참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버개수보다 같거나 적어야 한다.
예시코드
class Tv {
boolean power; int channel;
void power() {power = !power;}
void channelUp() {channel++;}
void channelDown() {channel--;}
}
class SmartTv extends Tv {
boolean wifi; int ottChannel;
void wifi() {wifi = !wifi;}
void ottChannelUp() {ottChannel++;}
void ottChannelDown() {ottChannel--;}
}
Tv 클래스와 SmartTv 클래스가 이와 같이 정의 되었을 때, 두 클래스간의 관계를 그림으로 나타내면 아래와 같다 !
클래스 Tv 와 SmartTv 는 서로 상속관계에 있으며, 이 두 클래스의 인스턴스를 생성하고 사용하기 위해서 인스턴스의 타입과 일치하는 타입의 참조변수만을 사용하였다. 즉, Tv 인스턴스를 다루기 위하여 Tv 타입의 참조변수를 사용하고, SmartTv 인스턴스를 다루기 위해서는 SmartTv 타입의 참조변수만을 사용하였다. 하지만 두 클래스가 서로 상속관계에 있을 경우, 부모 클래스 타입의 참조변수로 자식 클래스의 인스턴스를 참조하는 것이 가능해진다.
public class Polymorphism {
public static void main(String[] args) {
// ex1> 객체 타입과 참조변수 타입이 일치
Tv tv = new Tv();
SmartTv smartTv = new SmartTv();
// ex2> 객체 타입과 참조변수 타입이 불일치 (다형성)
Tv tv = new SmartTv();
// ex3> 자식 클래스의 타입으로 부모 클래스를 참조하는 것은 불가능
// SmartTv smartTv = new Tv();
tv.power(); tv.channelUp(); tv.channelDown();
smartTv.power(); smartTv.channelUp(); smartTv.channelDown();
smartTv.wifi(); smartTv.ottChannelUp(); smartTv.ottChannelDown();
}
}
ex1 의 경우 지금까지 생성된 인스턴스를 다루기 위해서 객체 타입과 참조변수의 타입이 일치하게끔 사용하였다.
ex2 는 객체 타입과 참조 변수의 타입이 불일치 하지만 Tv 클래스가 부모 클래스 이기 때문에 자식 클래스의 SmartTv의 인스턴스를 참조하였다. 이것을 다형성이라고 한다 !
ex3 의 경우 실제 인스턴스인 Tv의 멤버 개수보다 참조변수 SmartTv가 사용할 수 있는 멤버 개수가 더 많이 때문에 불가능하다. 즉, 참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 한다.
'Java' 카테고리의 다른 글
[Java] 인터페이스(Interface) (0) | 2024.04.29 |
---|---|
[Java] 추상화(Abstract) (2) | 2024.04.28 |
[Java] 오버로딩 & 오버라이딩(Overloading & Overriding) (0) | 2024.04.09 |
[Java] 생성자(Constructor) (0) | 2024.03.31 |
[Java] Getter&Setter (0) | 2024.03.31 |