본문 바로가기

Programming/JAVA

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

java logo image

 

 

 

 

지금부터는 JAVA와 OOP 언어에서 핵심적이면서도 복잡한 내용을 가진 다형성에 대한 내용을 다루겠습니다. 우선, 다형성의 개념을 한 번 간단히 정의해 보자면 "같은 타입을 사용하지만, 다양한 결과가 나올 수 있는 성질"을 의미합니다. 언뜻 한 번에 쉽게 다가오는 개념은 아닙니다. 좀 더 객체(클래스)의 관점에서 설명하면 "하나의 타입에, 여러 타입의 객체를 대입하여 다양한 기능을 구연한다."고도 설명할 수 있습니다. 

 

통상적인 개념에서는 잘 와닿지 않습니다. 하지만, 지금 우리가 이 다형성의 특징을 공부하는 파트는 '상속' 파트입니다. 결국 [하나의 타입 - 여러 다른 성질 대입]이란 특성은 상속으로부터 비롯되는 성질이라는 점을 먼저 눈치챌 수 있어야 합니다. 그러나 애초에 다형성이라는 특징은 일상적인 개념이 아니기 때문에 직관적으로 이해하기 힘든 것도 사실입니다. 무작정 코드를 작성하는 것보다는 차근차근 이 개념을 짚어가 보도록 하겠습니다. 

 

 


 

 

자, 우리가 스마트폰을 새로 하나 구입했다고 가정합시다. 그럼 곧바로 스마트폰 케이스를 구매하게 됩니다. 그런데 스마트폰 케이스는 정말 수백, 수천 개의 회사에서 만들고 있습니다. 예를 들어 갤럭시S99라는 스마트폰이 있고 우리는 삼성 공식 케이스 외에도 A회사의 케이스, B회사의 케이스를 선택할 수 있다고 봅시다. 

 

그럼 임의로 스마트폰 '케이스'라는 클래스가 있다고 가정해 볼까요? 물론 이 단락의 설명은 이해를 돕기위한 간단한 개념 예시이므로 코드 구현 등에 대해서는 빡빡하게 고민하지 맙시다! 클래스 Case에는 갤럭시S99에 장착할 수 있는 케이스의 스펙이 정의되어 있습니다. 가로 세로 길이, 깊이, 카메라 위치, 버튼의 위치, 가리면 안 되는 여러 기본 금형과 관련된 (일종의) 필드 값이 정의되어 있을 것입니다. - '규격'인 셈이죠.

 

그럼 A사와 B사에서는, 이 클래스 Case를 상속받아 자신들의 스마트폰 케이스를 만들게 됩니다. 상속을 받았으니 Case 클래스의 필드 값과 메서드, 생성자를 사용할 수 있게 되겠죠? 이렇게 Case라는 클래스를 상속받는 새로운 클래스 AcompanyCase와 BcompanyCase를 만들게 됩니다. 우리는 여기서 A사 혹은 B사의 케이스를 갤럭시S99에 사용하게 되는 것이지요. 

 

A사의 케이스와 B사의 케이스는 당연히 컬러, 모양이 다를 것입니다. 그리고 A사의 케이스는 카드와 지폐 수납기능이 있습니다. 그리고 B사의 케이스는 거치대가 내장되어 있다는 특징을 가지고 있습니다. 같은 Case 클래스를 상속받은 객체들이지만, 각각을 끼웠을 때 스마트폰의 편의성과 디자인은 확 달라지게 되죠.

 

여기서 갤럭시S99는 '우리 스마트폰에서 쓸 수 있는 케이스는, Case 클래스 타입의 객체여야 한다'라고 정의를 해두었다고 봅시다. 그럼 여기서 [Case 클래스를 상속받는 AcompanyCase와 BcompanyCase를 장착할 수 있다]는 의미가 됩니다. 일단은 어떤 변환이 일어나고, 어떤 원리로 장착하게 되는지는 뒤에 자세히 설명하도록 하겠습니다. 아무튼, Case 클래스가 필요한 곳에 Case 클래스의 자식 클래스 객체가 올 수 있다- 정도로 이해해 둡시다.

 

 


 

 

우리는 상속의 기본 성질에서 자식 클래스는 본인이 상속받은 부모 클래스의 성질을 모두 갖고 있으며, 자식 클래스만의 성질을 추가로 갖는다는 것을 학습해 두었습니다. 즉, 자식 클래스는 이미 '기본적으로' Case의 성질을 모두 갖고 있기 때문에 Case 클래스를 필요로 하는 곳에 들어갈 수 있는 개념이 됩니다.