본문 바로가기

자바

클래스와 다형성

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