package org.opentutorials.javatutorials.polymorphism;
public class PolymorphismDemo1 {
public static void main(String[] args) {
A obj = new B();
}
}
class A {
}
class B extends A {
}
예제를보자.
PolymorphismDemo1 클래스이고 이 클래스의 main 메소드에서는 B 클래스를 인스턴스화해서 obj 변수에 담았다. 그런데 한가지 이상한 점이 있다. B 클래스로 객체를 만드는데 이상하게도 그 객체가 담긴 변수의 데이터 타입은 A이다.
B 클래스를 살펴보자. B 클래스는 아주 간단한 형태의 클래스이다. A 클래스를 상속하고 있다. main 메소드에서는 B 클래스로 인스턴스를 만들었지만 해당 인스턴스는 A 클래스의 데이터 타입 행세를 하고 있다.
다음 예제를보자.
오류를 보자
The method y() is undefined for the type A
대충 y는 A 클래스에 정의 되있지 않다는 뜻
결론
1. 어떤 클래스를 인스턴스화할 때 그 인스턴스를 담는 변수의 데이터 타입은 해당 클래스가 될 수도 있다. 즉 A obj = new B(); 대신 B obj = new B();로 쓸 수도 있다는 뜻.
2. 해당클래스의 부모 클래스가 될 수도 있다. 그렇게 할 경우 생성된 인스턴스가 마치 부모 클래스인 A 클래스처럼 동작하게 만들 수 있고 부모 클래스인 A 클래스에는 y()메소드가 존재하지 않기 때문에 y() 메소드를 호출하면 에러.
package org.opentutorials.javatutorials.polymorphism;
public class PolymorphismDemo1 {
public static void main(String[] args) {
A obj = new B();
System.out.println(obj.x());
}
}
class A {
public String x() {
return "A.x";
}
}
class B extends A {
public String x() {
return "B.x";
}
public String y() {
return "y";
}
}
예제 : B 클래스에서 x() 메소드를 오버라이딩
결론 : 위 실행 결과는 B.x
대충 x() 메소드는 B 클래스의 x()라는 뜻
B클래스의 인스턴스가 A클래스 행세를 한다는 것은 A 클래스에 정의된 메소드만을 실행할 수 있고, B클래스에서 추가로 정의한 메소드는 실행할수 없음을 의미. 하지만 B클래스에 있는 어떤 특정 메소드가 상위 클래스의 메소드를 오버라이딩했다면 실제로 실행되는 메소드는 인스턴스화된 클래스의 메소드가 되는 것.
그런데 왜 요따위 문법을 쓸까?
package org.opentutorials.javatutorials.polymorphism;
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());
}
}
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";
}
}
결과
B.x
B2.x
'자바' 카테고리의 다른 글
책 리뷰 : 생활코딩 자바 (0) | 2020.10.14 |
---|---|
인터페이스와 다형성 (0) | 2020.10.14 |
오버로딩 (0) | 2020.10.14 |
Model (0) | 2020.10.13 |
HttpSession (0) | 2020.10.13 |