다형성은 부모 클래스가 자식 클래스를 참조할 수 있는 것을 말한다.
Fruit 클래스를 peach와 banana가 상속받고 있다고 했을 때사용자에게 1이나 2 중 하나를 입력받는다고 할 때
Fruit fruit;
if(input == 1) {
fruit = new Banana();
} else (input == 2){
fruit = new Peach();
}
fruit.show();
이렇게 fruit이라는 참조변수 하나에 자식 클래스들의 타입을 담아서 출력하는 게 가능하다.
class A{ public String x() return "a.x";}
class B extends A{
public String x() return "b.x";
public String y() return "b.y";
}
class B2 extends A{
public String x() return "b2.x";
public String y() return "b.y";
}
public static void main(String[]){
A obj = new B();
A obj2 = new B2();
System.out.println(obj.x()); ---- 1)
System.out.println(obj.y()); ---- 2)
System.out.println(obj2.x()); ---- 3)
}
1)은 b.x 가 나온다. obj가 비록 A행세를 하고 있지만 B 객체를 가리키고 있기 때문에 오버라이딩 된 x 함수를 호출하기 때문이다.
2)은 에러이다. obj는 지금 A행세를 하고 있기 때문에 y함수를 호출할 수 없다. 클래스 A에 있는 메소드만 호출할 수 있다.
3)은 b2.x 를 출력한다. 이것이 다형성의 장점이다. A를 상속한 서로 다른 클래스들이 A클래스변수에 담겨서 참조될 수 있는 것이다.
이 성질은 인터페이스를 구현할 때에도 동일하게 적용된다.
interface A1 {
public String A();
}
interface A2 {
public String B();
}
class D implements A1, A2 {
public String A(){
//A 함수 내용
}
public String B(){
//B 함수 내용
}
}
main 함수{
D obj = new D();
A1 obj2 = new D();
A2 obj3 = new D();
}
이렇게 하면 obj2는 A1인척하고 있으므로 B함수를 호출하지 못하고 obj3는 A2인척 하는 중이므로 B함수를 호출할 수 없다.
이런식으로 했을 때의 장점은 D가 아무리 많은 기능을 가지고 있다고 하더라도 많약 누군가가 A1의 기능만 사용할 것이라고 했을때 A1 obj = new D(); 라고 해놓으면 A1인터페이스 내의 기능만 사용할 수 있기 때문에 나머지 기능은 신경 쓸 필요가 없게 된다.
같은 인터페이스를 구현하더라도 어떤 클래스에서 구현했냐에 따라서 인터페이스의 함수를 다양한 기능으로 사용할 수 있다.
I1 i = new A();
I1 i2 = new B();
I1 i3 = new C();
'백엔드 > 자바' 카테고리의 다른 글
자바 set, list, map 사용법 기초 (0) | 2021.01.28 |
---|---|
자바 inner 클래스 사용법 (0) | 2021.01.28 |
자바 추상클래스와 인터페이스 (0) | 2021.01.28 |
java.lang 패키지 정리 (0) | 2021.01.27 |
자바 JAVA int & string 형변환 (0) | 2020.12.31 |