본문 바로가기

Programming/JAVA

상속(6) - 타입 변환과 다형성 3

 

 

앞서 살펴본 아티클에서 상속과 이와 관련한 중요 특성 중 하나인 다형성에 대해서 기본적인 개념과 특징을 살펴보았습니다. 다시 한번 짚고 넘어가자면, 결국 하나의 타입의 데이터를 이용하지만 다양한 결과를 얻을 수 있는 특징이라는 점이 주요 포인트였죠? 

 

이번에는 추가적으로 알고 있어야 할 상속 관계에 있어서 관련되는 상속 객체의 특징을 살펴보고, 예제를 통해 종합적으로 클래스의 상속과 다형성의 특징을 알아보고자 합니다. 

 

 


 

 

 

우선 지금까지 예제를 통해 설명하면서 Parent - Child 클래스 1개씩을 다루었습니다. 그럼 여기서 하나 더 의문이 생기는 지점이 있습니다. 만일, Parent - Child - Child2 - Child3....와 같이 연속적으로 복수의 상속관계가 성립하는 경우에는 다형성의 특징이 어떻게 작용하게 될까요? 

 

일단, 결론부터 얘기하자면 "바로 윗 계층의 부모 클래스가 아니더라도, 계층 구조 상 부모(상위) 클래스라면 자동 타입 변환이 발생한다."가 정답입니다. 부모이든, 부모의 부모이든, 자식 클래스가 어떤 클래스를 유구한(?)역사와 함께 상속받았다면 동일하게 부모 클래스로 취급한다는 점이죠. 즉, 아버지/어머니에게 상속받은 자식 클래스라고 하더라도, 실제로는 그 위의 할아버지/할머니 클래스를 아버지/어머니가 상속받았다면 계속해서 상속은 이어진다는 것이죠. 

 

 

 

위와 같은 상속 구조를 가진 클래스가 있다고 가정해 보겠습니다. 최상위에 A 클래스가 있고, A 클래스를 상속받는 B와 C 클래스가 각각 존재합니다. 그 하위에는 B 클래스를 상속받는 D 클래스, C 클래스를 상속받는 E 클래스가 있습니다. 이 경우 각각의 자동 변환이 가능한 케이스를 아래 예제 코드를 통해 표현해 보겠습니다. 

 

 

A a1 = new B();
A a2 = new C();
A a3 = new D();
A a4 = new E();

B b1 = new D();
C c1 = new E();

 

 

위와 같은 코드를 보았을 때, 이해가 가시나요? 이 예제 코드에 적인 케이스 이외에는 상속에 기반한 자동 타입 변환은 이루어지지 않습니다. B, C, D, E 클래스 타입은 일단 모두 결과적으로 A 클래스를 상속받고 있기 때문에, A 클래스 타입으로 자동 변환이 모두 가능합니다. 하지만 B, C 타입의 경우 각각 D 와 E 클래스만 변환이 가능하게 됩니다. 예를 들어 C, E 타입과 B, D 클래스는 직접적인 상속 계보에 위치하지 않기 때문에 타입 변환이 불가능합니다. 

 

 

 


 

 

이제 오버라이드가 된 경우까지를 포함하여 부모-자식 간의 상속 관계가 있는 클래스 예제를 작성해 보고, 실제로 동작하는지 여부를 직접 확인해 보도록 하겠습니다. 예제를 실행하기 전에 잊고 있는 부분이 있을지, 앞선 개념 설명 아티클을 다시 한번 체크하고 오시기 바랍니다. 

 

 

 

상속(6) - 타입 변환과 다형성 1(★)

지금부터는 JAVA와 OOP 언어에서 핵심적이면서도 복잡한 내용을 가진 다형성에 대한 내용을 다루겠습니다. 우선, 다형성의 개념을 한 번 간단히 정의해 보자면 "같은 타입을 사용하지만, 다양한

nozeroslope.tistory.com

 

 

 

상속(6) - 타입 변환과 다형성 2

앞서 상속과 관련하여, 다형성이란 성질에 대한 기본 개념을 다루어 보았습니다. 중요한 내용이니 잘 기억이 나지 않으신다면, 다시 한번 상기하고 오시는 것을 추천드립니다.

nozeroslope.tistory.com

 

 

 

public class GalaxySeries {
	public void knoxSetting() {
		System.out.println("KNOX LAUNCHED");
	}
	
	public void androidOS() {
		System.out.println("ANDROID FOR GALAXY SETTING");
	}
}

 

public class Zflip extends GalaxySeries {
	@Override
	public void androidOS() {
		System.out.println("Z-FLIP OS SETTING");
	}
	
	public void folding() {
		System.out.println("FLODING OPTION ACCEPTED");
	}
}

 

public class ExampleMain {	
	public static void main(String[] args) {
		
		GalaxySeries gsFlip = new Zflip();
		
		gsFlip.knoxSetting();
		gsFlip.androidOS();
		// gsFlip.folding();
	}
}

/* 출력
KNOX LAUNCHED
Z-FLIP OS SETTING
*/

 

위 코드에서 부모 클래스인 GalaxySeries와 이를 상속받는 Zflip이라는 자식 클래스가 선언되었습니다. 이 중, Zflip 클래스에서는 부모 클래스의 androidOS라는 메서드를 오버라이드 해서, Z플립이 사용할 별도의 OS를 선언한 모양이네요. 그리고 Z플립의 독자적인 기능인 folding 메서드도 선언되었습니다.

 

그런데 실행 클래스에서는 부모 클래스인 GalaxySeries 타입으로 인스턴스를 생성하며 Zflip 객체를 참조하였습니다. 배웠다시피 여기서는 자동 타입 변환이 이루어졌겠군요. 

 

결과적으로 부모 클래스에 선언된 knoxSetting 메서드는 정상적으로 실행되었고, Zflip 클래스에서 오버라이드로 재정의 된 androidOS는 재정의된 방식으로 호출되었습니다. 하지만, Zflip의 고유 메서드인 folding은 부모 클래스 타입으로 선언된 상태이기 때문에 실행 시 컴파일 에러가 발생하는 것을 확인할 수 있었습니다.