'추상적이다'라는 말은 구체적이지 않고 막연한 것을 뜻한다.
'어떤 클래스가 추상적이다'라는 말은 구체적이지 않은 클래스라는 뜻이다.
이번 포스팅에서는 자바(Java)에서 추상 클래스에 대하여 공부를 해보고자 한다.
추상 클래스란
하나 이상의 추상 메서드를 포함하는 클래스를 가리켜 추상 클래스(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);
다음 메서드는 추상 메서드가 아니다.
int add(int x, int y){}
- { }를 사용한 것만으로도 메서드를 구현한 셈이다.
(다만 { } 안에 코드가 없다.)
자바에서 추상 메서드는 abstracat 예약어를 사용하여 선언만 하는 메서드이다.
메서드 선언의 의미
int add(int num1, int num2);
- 위 코드처럼 선언한 메서드를 보면 두 개의 정수를 입력받은 후 더해서 그 결과 값을 반환한다는 것을 유추할 수 있다.
- 즉, 이 메서드의 선언부(declatration)만 봐도 어떤 일을 하는 메서드 인지 알 수 있는 것이다.
함수의 선언부 즉 반환값, 함수 이름, 매개변수를 정의한다는 것은 곧 함수의 역할이 무엇인지, 어떻게 구현해야 하는지를 정의한다는 뜻이다.
따라서 함수 몸체를 구현하는 것보다 중요한 것은 함수 선언부를 작성하는 것이다.
메서드를 선언한다는 것은 메서드가 해야 할 일을 명시해 두는 것이다.
추상 클래스 구현
추상 클래스의 구현 과정에서 클래스 간의 관계를 살펴볼 수 있는 클래스 다이어그램은 다음과 같다.
- 맨 위쪽에는 클래스 이름을 쓰고, 아래쪽에 변수 이름, 그다음 메서드 이름을 쓴다.
- 추상 클래스와 추상 메서드는 기울임 꼴로 표시한다.
- Computer 클래스는 추상 클래스이며, 이를 상속받은 두 클래스 중 DeskTop 클래스는 일반 클래스이고 NoteBook 클래스는 추상클래스이다.
- NoteBook 크래스를 상속받은 Mynote Book 클래스도 일반 클래스이다.
- display( )와 typing( )은 추상 메서드이고, trunOn( )과 turnOff( )는 구현 코드가 있는 메서드이다.
추상 클래스 구현
public abstract class Computer {
public abstract void display();
public abstract void typing();
public void turnOn(){
System.out.println("전원을 켭니다.");
}
public void turnOff(){
System.out.println("전원을 끕니다.");
}
}
- Computer를 상속받는 클래스 중 turnOn( )과 turnOff( ) 구현 코드는 공통이다.
- display( )와 typing( )은 하위 클래스에 따라 구현이 달라질 수 있기 때문에 Computer에서 구현하지 않는다.
('이 두 메서드 구현에 대한 책임을 상속받는 클래스에 위임한다.'라는 의미) - 따라서 Computer 클래스의 추상 메서드는 추상 클래스를 상속받은 DeskTop과 NoteBook에서 실제로 구현하게 된다.
이 클래스의 상위 클래스에서는 하위 클래스도 공통으로 사용할 메서드를 구현하고, 하위 클래스마다 다르게 구현할 메서는 추상 메서드로 선언해 두는 것이다.
추상 클래스 상속
DeskTop 클래스 구현
public class DeskTop extends Computer{
@Override
public void display() {
System.out.println("DeskTop Display()"); //추상 메서드의 몸체 코드 작성
}
@Override
public void typing() {
System.out.println("DeskTop Typing()"); //추상 메서드의 몸체 코드 작성
}
}
- 2~10행은 상위 클래스인 Computer 클래스에 포함된 추상 메서드인 display( )와 typing( )을 재정의하는 부분이다.
NoteBook 클래스 구현
public abstract class NoteBook extends Computer{
@Override
public void display() {
System.out.println("NoteBook Display()");
}
}
- 이 클래스에서는 상속받은 추상 메서드를 모두 구현하지 않고 display( ) 하나만 구현했다.
- 추상 메서드를 하나 가지고 있기 때문에 추상 클래스가 된다.
MyNoteBook 클래스 구현
public class MyNoteBook extends NoteBook{
@Override
public void typing() {
System.out.println("MyNoteBook Typing()");
}
}
- 모든 추상 메서드가 구현된 클래스이므로 abstract 예약어를 사용하지 않는다.
추상 메서드 사용 이유
자바에서 추상 메서드를 선언하여 사용하는 이유는 추상 메서드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메서드를 구현하도록 하기 위함이다.
만약 일반 메서드로 구현한다면 사용자에 따라 해당 메서드를 구현할 수도 있고, 안 할 수도 있다.
하지만 추상 메서드가 포함된 추상 클래스를 상속받은 모든 자식 클래스는 추상 메서드를 구현해야만 인스턴스를 생성할 수 있으므로, 반드시 구현하게 된다.
'Back-End > Java' 카테고리의 다른 글
[Java] final 예약어 (0) | 2023.02.08 |
---|---|
[Java] 템플릿 메서드(Template Method) (0) | 2023.02.07 |
[Java] 다운 캐스팅과 instanceof (0) | 2023.02.06 |
[Java] 다형성(polymorphism) (0) | 2023.02.06 |
[Java] 메서드 오버라이딩(method overriding) (0) | 2023.02.06 |