- JAVA - 다형성 (polymorphism) 목차
다형성 ( 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의 데이터 타입을 가지고 있기 때문임.
즉 ,어떠한 클래스를 인스턴스화 시킬때 그 인스턴스를 담는 변수의 데이터 타입은
그 클래스가 될수가있고, 그클래스의 부모클래스가 될수도있다.
해결방법 : 재정의를 통하여 해결하면 됨
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 |