JAVA에서 앞서 배운 추상화를 활용하는 방법은 크게 두 가지가 있습니다.
추상 클래스(abstract class)를 이용하는 방법과 인터페이스(interface)를 이용하는 방법입니다.
우선 추상 클래스에 대해서 알아보도록 하겠습니다.
우선 일반 클래스와 추상 클래스를 비교해 보겠습니다.
왼쪽이 일반 클래스이고, 오른쪽은 추상 클래스입니다.
사실 추상클래스와 일반 클래스는 거의 같습니다만 몇 가지 특징을 가지고 있습니다.
우선 틀린 그림 맞추기처럼 눈으로만 비교를 해 볼까요?
우선 클래스를 만들 때 abstract라는 키워드가 추가되어 있습니다. 그리고 코드블록(body라고도 부릅니다.) 이 없는 메서드들이 있습니다.
이것들은 abstract라는 키워드를 갖는 대신 몸체가 없군요.
우리는 이 메서드를 추상 메서드라고 부릅니다.
‘꼭 있어야 할’ 것들만 있는 메서드라는 이 되겠죠?
접근 제한자와 메서드이름, 반환 타입은 꼭 있어야 한다는 뜻일까요?
그렇게 해석할 수도 있겠지만 이 추상 클래스를 상속해 보면 답을 알게 될 것입니다.
추상 클래스를 상속받는 순간 추상 메서드는 강제 오버라이드 됩니다.
위 상황에 따르면 내 의사에 상관없이 birth와 eat 메서드는 무조건 오버라이드가 된다는 뜻입니다.
추상화는 꼭 필요한 것을 남겨놓는 작업이라고 했죠?
추상 메서드는 꼭 만들어야만 하는 메서드라는 뜻이 되는 것입니다.
여러 개발자가 각각의 자동차 소프트웨어를 만들기로 하였습니다. 그리고 시동과 가속, 브레이크 기능은 공통적으로 꼭 들어가야 하는 기능이라고 공지해 둔 상태입니다.
하지만 본의 아니게 많은 인원이 작업하다 보면 의사소통에 혼선이 생기거나 제대로 전달되지 않을 가능성이 있습니다. 그래서 개발 후 하나로 합쳐보면 엉망이 되는 경우가 많은 것도 사실입니다.
그래서 방법을 바꿔보도록 하겠습니다.
꼭 필요한 기능을 추상메서드로 만든 CarStandard라는 클래스를 상속받도록 합니다.
그럼 필수 메서드는 강제 오버라이드 되므로, 개발자들이 놓치지 않고 기능을 개발할 수 있게 됩니다.
여기에 개발에 필요한 메서드들도 담고 있다면 더욱 유용하겠지요?
추상 클래스와 일반 클래스의 또 다른 차이점은 바로, 객체화입니다.
일반 클래스는 누구든지 객체화가 되지만, 추상 클래스는 자식 클래스에서만 객체화가 됩니다.
위의 코드에서 보면 Dog이라는 클래스는 객체화가 되지만 Mammal을 객체화가 되지 않습니다.
Mammal 은 오직 자식 클래스인 Dog에서만 객체화가 되기 때문입니다.
자식은 부모를 상속받았는데, 자식이 부모를 객체화한다고요?
어차피 상속받았는데 부모 클래스를 사용하기 위해 객체화한다는 것은 뭔가 말이 안 맞죠?
이제 이 상속에 대해 아직 이야기하지 않은 내용을 알려드릴 때가 되었습니다.
사실, 상속은 자식 클래스를 객체화하면 먼저 부모의 클래스를 객체화 한 다음 그것을 받아쓰는 자식의 객체가 생성되는 것입니다.
즉, 추상 클래스는 자식 외엔 객체화할 수 없다는 것은, 상속관계로만 사용할 수 있다 와 같은 뜻입니다.
이렇게 추상 클래스와 추상 메서드에 대해서 알아보았습니다.
덤으로 상속에 대한 새로운 사실도 알게 되었고요.
다음엔 JAVA에서 추상화를 사용하기 위한 두 번째 방법, 인터페이스에 대해서 알아보도록 하겠습니다.