티스토리 뷰

★ 추상 클래스란?

- 추상 클래스가 무엇인가라고 유추해봤을 때 말 그대로 추상적이었다. 즉, 구체적이지 않고 막연한 것을 뜻한다고 한다.

  '어떤 클래스가 추상적이다' 라는 말은 무엇일까? '구체적이지 않은 클래스'라는 뜻이다.

  추상 클래스는 영어로 abstract class 이고, 추상 클래스가 아니면 concrete class 라고 한다. 

 


추상 클래스는 항상 추상 메서드를 포함한다. 

추상 메서드는 구현 코드가 없다. 즉 함수 몸체(body)가 없다는 뜻이다.

 

중괄호 { }로 감싼 부분을 함수의 구현부(implement) 라고 한다. 

이 부분이 없는 함수이면 추상 함수 (abstract function)이고, 자바에서는 추상 메서드 (abstract method)라고 한다.

 

추상메서드는 아래와 같이 선언 하며 abstract 예약어를 사용한다. 그리고 { } 대신 ; 를 사용한다.

int add ( int x, int y) {}

자바에서 추상 메서드는 abstract 예약어를 사용하여 선언만 하는 메서드이다.

 

abstract int add(int x, int  y);

이것은 추상 메서드가 아니다. { }를 사용한 것만으로도 메서드를 구현한 것이다.  { } 안에 코드가 없을 뿐...

 


☆메서드 선언의 의미

 

- 로직을 구현하는 것보다 중요한 것이 어떻게 구현할지 결정하는 '개발 설계' 이다.

int add ( int num1, int num2)

이 코드를 보면 ' 아~ 두 개의 정수를 입력받은 후 더해서 그 결과값을 반환하라는 것이구나! ' 라고 알 수 있다.

즉, 선언부 (declatration) 만 봐도 어떤 일을 하는 메서드인지 알 수 있다. 

따라서, 함수 몸체를 구현하는 것보다 중요한 것은 함수 선언부를 작성하는 것이다. 

메서드를 선언한다는 것은 메서드가 해야 할 일을 명시해 두는 것이다.

 


★ 추상 클래스 구현하기

 

추상 클래스의 구현 과정을 코드로 보기 전에 클래스 간의 관계를 살펴볼 수 있는 클래스 다이어그램을 그려 보았다.

추상 클래스와 추상 메서드는 파란색 글씨와 파란색 네모로 설정했다.

 

Computer 클래스는 추상 클래스이다. 컴퓨터 종류에는 데스크톱과 노트북이 있다.

그리고 노트북 종류에는 MyNoteBook이 있다.

 

Computer 클래스는 추상 클래스이고,

상속받은 두 클래스 중 DeskTop 클래스는 일반 클래스 , NoteBook 클래스는 추상 클래스이다.

Computer 클래스가 제공하는 메서드 중 두 개는 파란색 네모칸으로 추상 메서드이다.

즉, display( ) 와 typing ( ) 은 추상메서드이고, turnOn( ) / turnOff( )는 구현 코드가 있는 메서드이다.

 


1. Computer 클래스 내부에 추상 메서드 display ( ) 와 typing ( )을 선언한다.

   오류가 발생한다. 

   This method requires a body instead of a semicolon.

   이 메서드의 몸체 (body) 부분을 작성하거나 이 메서드를 추상 메서드로 바꾸라는 설명이다. 

   추상 메서드로 선택하면 display ( ) 와 typing ( )에 abstract 예약어가 생긴다.

 

2. turnOn( ) / turnOff( )는 몸체 부분에 코드를 구현했기 때문에 아무 이상이 없다.

 

3. 그 후, 메서드와 클래스 이름에 모두 오류 표시가 된다. 

  The type Computer must be an abstract class to define abstract methods.

  추상 메서드가 속한 클래스를 추상 클래스로 선언하지 않았기 때문이다.

  Computer를 추상 클래스로 만들기 위해 abstract 예약어를 더한다.

 

정리를 하면,

Computer를 상속 받는 클래스 중 turnOn과 turnOff 구현 코드는 공통이다.

하지만, display ( ) 와 typing ( )는 하위 클래스에 따라 구현이 달라질 수 있다.

이 두 메서드 구현에 대한 책임을 상속받는 클래스에 위임한다는 뜻이다.

 

따라서, Computer클래스의 추상 메서드는 추상 클래스를 상속 받은 DeskTop, NoteBook에서 실제로 구현하게 된다.

이 클래스의 상위 클래스에서 하위 클래스도 공통으로 사용할 메서드를 구현하고,

하위 클래스마다 다르게 구현할 메서드는 추상 메서드로 선언해 두는 것이다.

 


☆ 추상 클래스 상속받기

1. DeskTop 클래스를 만들어 Computer 클래스를 상속 받도록 한다.

   그러면 오류가 뜬다. 

   The type DeskTop must implement the inherited abstract method Computer.typing()

   해결 방법은  

   1. 구현되지 않은 메서드를 구현한다.

   2. DeskTop 클래스를 추상클래스로 만든다.

   

   즉, 추상 클래스를 상속받은 하위 클래스는 구현되지 않은 추상 메서드를 모두 구현해야 구체적인 클래스가 된다.

   Add unimplemented methods 옵션을 눌러 몸체 코드를 작성한다.

 

2. display( )  와 typing ( ) 을 재정의한다.

 


이 NoteBook 클래스는 display 하나만 구현하였다.

그러면 추상 메서드를 하나 가지고 있기 때문에 추상 클래스가 된다.

 

MyNoteBook 클래스는 NoteBook 클래스를 상속받았다.

MyNoteBook 클래스는 모든 추상 메서드가 구현된 클래스이므로 abstract 예약어를 사용하지 않는다.


★ 추상 클래스를 만드는 이유

- 추상 클래스는 상속을 하기 위해 만든 클래스이다.

 

각 클래스를 이용하여 프로그램을 실행할 수 있는 테스트 프로그램을 실행보기위해  ComputerTest 클래스를 만들었다.

Computer 클래스 형으로  인스턴스  4개를 실행했다.

오류를 확인해보면 Computer클래스와 NoteBook 클래스를 인스턴스로 생성할 수 없다고 나온다.

추상 클래스는 모든 메서드가 구현되지 않았으므로 인스턴스로 생성할 수 없다.

왜냐하면 구현된 코드가 없어  수행할 수 있는 내용이 없기 때문이다.

 

구현된 메서드 하위 클래스에서 공통으로 사용할 구현 코드. 하위 클래스에서 재정의할 수도 있음.
추상 메서드 하위 클래스가 어떤 클래스냐에서 따라 구현 코드가 달라짐.

 


※ 이 글은 Do it ! 자바 프로그래밍 입문 책을 참고했습니다.