티스토리 뷰

Java

JAVA - 다형성 (polymorphism)

Xion 2018. 8. 17. 17:48

다형성 ( polymorphism )


-키보드를 예로 들었을 때 , 키보는  " 누른다 " 라는 것은 똑같지만 어떤 키를 누르냐에 따라 다르게 동작한다 . 

 이렇게 자바에서는 하나의 메소드 OR 클래스가 다양한 벙법으로 동작하는것을 의미한다.

 

      메소드의 다형성

같은이름 다른 동작방법(다른 매개변수) = 오버로딩 



부모클래스 행세를 하는 예 )


ex) A obj  = new B () ;

->부모행세(A) 를 하고 있는 obj 는 자식 class B를 인스턴스화 시키고있다

여기서, 중요한것은 부모클래스 (A)와 자식 클래스 (B)에서 동일한 이름의 메소드가 있다고 가정할때,

main클래스에서 호출되는 값은 B에 있는 값(오버라이딩) 한 값이 무조건 호출이 된다.

또한 , A(부모)클래스에서 선언되지 않는 메소드는 호출할 수 없다 (B에서 선언되어 있다 하더라도 부모클래스 행세를 하고 있기 때문)



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package org.opentutorials.javatutorials.polymorphism;
class A{
public String x(){return "A.x";}
}
class B extends A{
public String x(){return "B.x";}
public String y(){return "y";}
}
class B2 extends A{
public String x(){return "B2.x";}
}
public class PolymorphismDemo1 {
public static void main(String[] args) {
A obj = new B();
A obj2 = new B2();
System.out.println(obj.x());
System.out.println(obj2.x());
}
}


->결과는 A.x와 B2.x이다.  부모 A에서 선언된 메소드 x를 자식 class에서 재정의하여 호출했기 때문 여기서 자식클래스의 메소드인 y 를 호출 불가 (이유 : 부모에서 정의되지 않았기 떄문)




왜 다형성을 사용해야하나 ?




ex


- class A와 class B 모두    

A obj= new B(); // 여기서 오류가 발생함  obj는 A의 데이터 타입을 가지고 있기 때문임.

즉 ,어떠한 클래스를 인스턴스화 시킬때 그 인스턴스를 담는 변수의 데이터 타입은

그 클래스가 될수가있고, 그클래스의 부모클래스가 될수도있다.

 obj는 calss A의 x메소드를 호출할 수 있지만  y메소드는 호출불가능함  이유 : A obj로 선언하였기 때문에 데이터타입이 A이기때문이다.

해결방법 : 재정의를 통하여 해결하면 됨 

class B extends A{

public String x() { 

return "B.x";

}    ->이렇게 추가로 더하여 수정하면 B.x가 실행이됨 즉,  class A에 정의되어있는 메소드를 class B에서 오버라이딩 (재정의) 하여 수정하였기때문에 우선순위가 B클래스에있는 오버라이딩한 x메소드가 더 높기때문에  B.x가 실행결과로 출력이 된다.



인터페이스를 구현후 

ex) interface  I2 {

public String A(); 

->이렇게 I2인터페이스를 구현하고 A메소드를 구현하게끔 정의하였다

intterface I3{

public String B();

}

->I3인터페이스를 구현후 B 메소드를 정의하게끔 하였고


class D implement I2,I3{

public String A()

{ return 'A';}

public Sting B() {

return 'B'

}

->이렇게 class D를 통하여 I2,I3의 메소드들의 오버라이딩 하였다.

다음으로 메인 메소드인

public static void main(String[] args) {

D obj =new D() ;  //D라고하는 클래스를 오브젝트라고하는 변수로 인스턴스화 시킨후 데이터 타입은 D.

I2 obj2 =new D(); //D라고하는 클래스를 오브젝트2라고 하는 변수로 인터턴스화 시킨후 데이터타입은 I2

I3 obj3 =new D(); //D라고하는 클래스를 오브젝트2라고 하는 변수로 인터턴스화 시킨후 데이터타입은 I3


이렇게 됐을경우,

obj A();//출력가능  이유:타입이 D기때문에 D는 A,B둘다 메소드를 가지고있음.

obj B();//출력가능

objI2.A();   //출력 가능

objI2.B() ;  //출력 불가능  이유: obj2는 I2인터페이스의 데이터 타입이기때문에 D라고하는 클래스를 인스턴스화시켜도 obj2는

자기자신을 I2로 인식하여 A메소드만 출력가능하다.

마찬가지로, obj3 A(); 명령문 역시 똑같은 이유로 출력이 불가능하다.



즉 같은 결과물로 요청하지만 서로 다른 결과물로 만들어내는 것이 다형성이라고 할수있다.

'Java' 카테고리의 다른 글

Exception을 직접 발생시키는 방법  (0) 2018.08.28
예외처리 finally  (0) 2018.08.21
abstract(추상 클래스)와 interface의 차이점  (0) 2018.08.17
자바 인터페이스(interface)  (0) 2018.08.17
abstract추상화  (1) 2018.08.17