본문 바로가기

Programming/JAVA

상속(12) - 추상 클래스 1

 

 

추상 클래스는 이름만 보았을 때는 상속과 관계가 없어 보이지만, 사실 추상 클래스는 부모-자식 클래스의 사용의 응용된 버전입니다. 그래서 기본적인 클래스 상속 관계에 대한 이해도 뒷받침되어야 공부하기 편하니, 염두에 두시기 바랍니다. 

 

일단, 개념부터 잡아보겠습니다. 여기서 말하는 '추상(abstract)'의 개념은 "어떤 실체가 있는 존재에서 공통되는 특성을 추출한 것"을 의미합니다. 뜬구름 잡는 소리 같다고요? 전혀 아닙니다. '공통되는 특성'을 뽑아서 만든 것이 추상 클래스의 핵심입니다. 그럼, 어떤 것들의 '공통되는 특성'을 뽑는 것일까요? 바로 [실체가 있는 클래스]의 공통된 특성을 뽑아서 모으는 것입니다. 

 

여기에 상속의 개념을 덧붙여 보겠습니다. 등장인물은 '추상 클래스'와 '실체 클래스'입니다. 우리는 상속의 개념을 배웠으니 추상 클래스와 실체 클래스를 상속 관계로 정의해 보겠습니다. 잘은 모르겠지만 "공통된 특성이 있는"것이 추상 클래스이니 이 추상 클래스가 부모 클래스입니다. 그리고 '실체 클래스'는 추상 클래스가 갖는 공통된 특성을 갖는 자식 클래스가 됩니다. 

 

즉, 이렇게 생각하면 편합니다.

추상 클래스 - 부모 클래스
실체 클래스 - 자식 클래스

 

지금 배우지 않았서 모르겠지만, (아무튼간에)추상 클래스의 특성이 필요해서 추상 클래스 형태로 다음과 같이 부모-자식 관계를 설계했다고 생각해 보겠습니다. 

 

1. '동물'이라는 분류가 있고 그 하위에 '새' / '곤충' / '생선' 클래스가 있다고 가정해 보겠습니다. 당연하겠지만 '동물'이 부모 클래스가 되고 새, 곤충, 생선은 자식 클래스가 되겠죠? 여기서 '동물'이란 부모 클래스는 추상 클래스가 되고, '새' / '곤충' / '생선'이라는 자식 클래스들은 실체 클래스가 됩니다. 

 

2. 비슷한 예가 하나 더 있었습니다. 'Tire'가 있고, Tire 속성을 상속받는 'KumhoTire' / 'HankookTire'라는 자식 클래스를 통해서 상속관계를 배웠었습니다. 여기서 Tire가 추상 클래스가 되고 자식 클래스들은 실체 클래스가 됩니다. 

 

여기에서도 추상 클래스를 통해 설계한 부모-자식 관계에서도 동작은 거의 비슷합니다. extends 키워드로 부모(추상) 클래스를 상속받는다는 점도 똑같고, 부모(추상) 클래스가 가진 속성을 자식(실체) 클래스들이 그대로 물려받아 사용도 가능합니다. 오버라이드도 똑같이 합니다. 그럼, 추상 클래스는 어떤 특성이 있으며 왜 쓰는 것일까요?

 

 


 

 

추상 클래스는 우리가 흔히 말하는 '부모'클래스의 역할을 하지만, 관념적으로 목적이 살짝 다릅니다. 우선 추상 클래스는 "자식(실체) 클래스들이 공통으로 사용할 특성들을 추출해 모아놓은 클래스" 입니다. 말장난 같지만, 자식 클래스들이 공통으로 쓰는 필드나 메서드만 모아서 만든 부모 클래스 같은 역할인 것입니다. 

 

이 추상 클래스는 부모 클래스로서의 역할은, 오로지 자식 클래스에게 "공통된 특성을 물려주는 것"만을 목적으로 합니다. 그렇기 때문에, 해당 클래스는 부모 클래스의 형태이지만 이 추상 클래스가 단독으로 객체로 생성되어 사용할 수 없습니다. 이는 무엇을 의미할까요? new 키워드를 사용하지 못한다는 의미입니다. 이 부분이 중요합니다. 

 

위에서 '동물', 즉 Animal이란 부모 클래스가 추상 클래스로 선언되었다고 하면, 이는 아래와 같은 코드를 사용할 수 없습니다.

 

Animal animal = new Animal();	// 사용할 수 없다.

 

이 Animal이 추상 클래스라고 하면, 이 Animal을 상속 받는 자식(실체) 클래스에서 extends Animal이라고 사용하는 것만 가능하다는 의미입니다. 부모 클래스인데, 단독으로 사용은 못하고... 여러 요소를 선언만 해둔 다음 상속하는 용도로만 쓰는 부모 클래스라니, 독특하다는 생각이 듭니다. 

 

다음 아티클에서, 이 추상 클래스의 개념이 왜 필요한지 살펴보도록 하겠습니다.