본문 바로가기

Dev. Java

추상 클래스 뽀개기


추상 클래스는 이전 포스팅에서도 다룬 적이 있지만, 다시 정리된 내용이 있어 새로 올린다.

먼저 추상 클래스의 특징을 살펴보면 다음과 같다.



이렇게 글로 된 설명만 보고 추상 클래스를 이해 하였다면, 당신은 현업 개발자이거나 프로그래밍 감이 정말 좋

은 축에 속하는 사람일 것이다. 필자를 포함한 초보들은 이런 설명만 보고는 도무지 이해를 못한다. 

동의하였다면 아래 그림을 살펴보자.


1. 추상 클래스

 추상 클래스는 미완성 클래스이다. 객체가 가지는 특성을 추상화 했으나 구현하지 못한 것이다.

 



2. 자식 클래스

  자식 클래스에 공통으로 포함된 move 메서드와 carry 메서드에서 볼 수 있듯이, 추상 메서드는 반드시 자식 

  클래스에서 오버라이딩하여 구현하여야 한다. 그렇지 않으면 자식도 추상 클래스가 된다.



 

3. 기타 클래스

  다음으로 살펴 볼 것은 ShipUtil과 ShipMain이다.



search 메서드가 static 메서드로 선언되었다. 왜 그럴까? 객체를 생성하지 않고 메서드를 호출하려고 했기 

때문이다. 또한 search 메서드는 아규먼트로 Ship(조상) 클래스를 받고 있기 때문에 Ship 아래의 모든 클래스

를 받을 수 있다는 것을 기억하자. 


if문에 진입하기 전까지 객체 s는 Ship(부모)에 있는 메서드만 사용할 수 있다. if문에 진입하는 순간 객체 s가 

Boat인지 아니면 Cruise인지 물어보고 있다. 왜 물어보는 것일까? 배의 이름을 출력하기 위해서이다. 


이름을 출력하기 위해서 객체 타입을 먼저 체크하고 있다. 그러면 물어만 본다고 해서 조상 타입의 객체가 

자식 클래스에 있는 기능을 사용할 수 있을까? 이미 알고 있듯이, 자식은 조상의 기능을 모두 사용할 수 있

지만 반대의 경우는 사용할 수 없다. 그럼 어떻게 하여야 할까? 예제에서 볼 수 있듯이 조상 타입의 객체 s를 

자식(Boat, Cruise)로 캐스팅 해줘야만 자식 클래스에 있는 name 메서드를 쓸 수 있는 것이다.   



이제 메인 클래스를 살펴보자. 

앞절에서 언급한 바와 같이, 추상 클래스는 자신의 이름으로 객체를 생성할 수 없다.  

라인7과 같이 Ship(추상클래스) ship1 = new Boat(자식) 객체의 형식으로 사용하여야 한다.


<참고> 추상 클래스 메모리 구조