각진 세상에 둥근 춤을 추자

[Java] 추상 클래스 본문

Java

[Java] 추상 클래스

circle.j 2022. 9. 20. 19:43

추상 클래스(abstract class)는 완전하게 구현되어 있지 않은 메소드를 가지는 클래스를 의미한다.

메소드가 미완성이므로 추상 클래스는 객체를 생성할 수 없는데, 주로 상속 계층에서 추상적인 개념을 나타내기 위한 용도로 사용된다.

 

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

추상 메서드에는 구현 코드가 없는데, 함수의 구현 코드가 없다는 것은 곧 함수 몸체인 body가 없다는 것을 뜻한다.

 

int add (int x, int y){
	return x+y;
}

 

위 코드와 같이 중괄호 { }로 감싼 부분을 함수의 구현부(implementation)라고 한다.

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

 

추상 메서드는 다음과 같이 선언만 하며 abstract 예약어를 쓰며 중괄호 대신 ; 를 쓴다.

abstract int add (int x, int y);

 

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

 

먼저, 추상 클래스의 구현 과정을 코드로 작성 하기 전에 클래스 간의 관계를 살펴 볼 수 있는 다이어그램을 그려 본다.

클래스 다이어그램 맨 위쪽에는 클래스 이름을 쓴다.

아래쪽에는 변수 이름을 쓰고 메서드 이름을 쓴다.

추상 클래스와 추상 메서드는 기울임꼴로 표시한다. 

 

해당 다이어그램에서 Computer 클래스는 추상 클래스이며 이를 상속받은 일반 클래스인 DeskTop과 추상 클래스인 NoteBook이 있다. 

NoteBook를 상속받은 MyNoteBook 클래스는 일반 클래스이다.

Computer 클래스가 제공하는 메서드 중 display()와 typing()은 추상 메서드이고, turnOn()과 turnOff()는 구현 코드가 있는 메서드이다.

 

다이어그램을 토대로 프로그램을 구현해 본다.

 

 

(1) 추상 클래스 Computer 구현하기

 

위 사진과 같이 추상 메서드를 일반 메서드와 동일한 구조로 작성하면 오류가 발생하는 것을 알 수 있다.

추상 메서드와 일반 메서드와의 차이를 알려주는 코드를 추가로 작성해야 한다.

오류가 발생한 부분에 마우스를 가져다 대면 오류를 해결할 수 있는 방법으로 두 가지가 제시된다.

 

첫 번째 방법:  Add body (메서드의 몸체 부분을 작성한다.)

두 번째 방법:  Change 'Computer.display' to 'abstract' (메서드를 추상 메서드로 바꾼다.)

 

여기서 두 번째 방법을 선택하면 display()와 typing() 메서드에 abstract 예약어가 생기는 것을 볼 수 있다.

 

그 후, 클래스 이름에 생긴 오류 또한 abstract를 추가하여 추상 클래스로 선언해 준다. 

 

package ch09_1;

public abstract class Computer {
	
	public abstract void display();
	public abstract void typing();
	public void turnOn() {
		System.out.println("전원을 켭니다.");
	};
	public void turnOff() {
		System.out.println("전원을 끕니다.");
	}
	
}

 

 

(2) DeskTop 클래스를 선언 후 Computer 클래스 상속받기 

 

추상 클래스인 Computer를 상속받은 클래스는 추상 클래스가 가진 메서드를 상속받는다.

따라서 상속받은 클래스는 추상 메서드를 포함하는데,

그렇기 때문에 추상 메서드를 모두 구현하든가 아니면 DeskTop도 추상 클래스로 만들든가 해야 한다.

 

위 옵션 중 첫 번째 방법: Add unimplemented methods 를 선택하여

추상 클래스에서 구현되지 않은 메소드를 하위 클래스인 DeskTop에서 구현한다. 

 

주석 (//TODO Auto-generated method stub)을 삭제하고 몸체 코드를 작성한다.

package ch09_1;

public class DeskTop extends Computer{

	@Override
	public void display() {
		System.out.println("DeskTop display()");
	}

	@Override
	public void typing() {
		System.out.println("DeskTop typing()");
	}

}

 

 

(2) NoteBook 클래스를 선언 후 Computer 클래스 상속받기 

 

NoteBook 클래스에서는 상위 클래스인 Computer 클래스의 상속받은 추상 메서드를 모두 구현하지 않고, display() 하나만 구현한다.

그러므로 NoteBook 클래스는 추상 메서드만 가지고 있기 때문에 추상 클래스가 된다. 

package ch09_1;

public abstract class NoteBook extends Computer {
	
	public void display() {
		System.out.println("NoteBook display()");
	}

}

 

 

(3) NoteBook 클래스를 상속받는 MyNoteBook 클래스 구현하기

 

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

package ch09_1;

public class MyNoteBook extends NoteBook{
	public void typing() {
		System.out.println("MyNoteBook typing()");
	}
}