본문 바로가기

백엔드/자바

자바 다형성 정리

다형성은 부모 클래스가 자식 클래스를 참조할 수 있는 것을 말한다.

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