추상 클래스 (Abstract Class)

클래스를 설계도에 비유한다면, 추상 클래스는 미완성 설계도에 비유할 수 있다.

추상클래스는 인스턴스를 생성할 수 없고, 상속을 통해서 자손클래스에 의해서만 완성될 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
abstract class Player {    // 추상메서드
    abstract void play(int pos);    // 추상메서드 구현
    abstract void stop();    // 추상메서드 구현
}
 
class AudioPlayer extends Player {
    void play(int pos) { ... }     // 추상메서드 구현
    void stop() { ... }    // 추상 메서드 구현
}
 
abstract class AbstractPlayer extends Player {
    // 하나만 구현하길 원한다면 자손 클래스 역시 추상클래스로 지정해야 한다.
    void play(int pos) { ... }    // 추상메서드 구현
}
cs

같은 크기의 TV라도 기능의 차이에 따라 여러 종류의 모델이 있다. 

각각의 설계도를 따로 그리는 것보다는, 이들의 공통 부분만을 그린 미완성 설계도를 만들어 놓고

이 미완성 설계도를 이용해 각각의 설계도를 완성해나가는 것이 좋다.


사용 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// 추상클래스
abstract class Player {
    boolean pause;
    int currentPos;
 
    Player() {
        pause = false;
        currentPos = 0;
    }
 
    abstract void play(int pos);     // 추상메서드
    abstract void stop();    // 추상메서드
 
    void play() {
        play(currentPos);    // 추상메서드를 사용 가능
    }
 
    void pause() {
        if(pause) {
            pause = false;
            play(currentPos);
        }
        else {
            pause = true;
            stop();
        }
    }
}
 
// Player 클래스를 조상으로 하는 CDPlayer 클래스
class CDplayer extends Player {
    void play(int currentPos) { ... } // 추상메서드 구현
    
    void stop() { ... }    // 추상메서드 구현
 
    int currentTrack; // 추가로 정의된 멤버
 
    void nextTrack() { // 추가로 정의된 멤버
        currentTrack++;
        ...
    }
}
cs


즉, 추상 클래스는 사용자가 구체적인 내용을 생각하지 않고 사용할 수 있는 기능으로,

메서드가 실제로 어떻게 구현될지 몰라도 메서드의 선언부만 알고 있으면 사용하는 것이 가능하다.



추상화(Abstraction)

클래스 간의 공통점을 찾아내서 공통의 조상을 만드는 작업이다.

기존의 클래스의 공통부분을 뽑아서 조상 클래스를 만드는 것이라 할 수 있다.

구체화와 반대되는 의미로, 구체화는 상속을 통해 클래스를 구현하는 작업이다.


동작 방법이 달라지는 메소드는 추상 메소드로 만들어서 하위 클래스에서 구현하도록 하고 

모든 클래스의 공통분모의 경우에는 상위 클래스에 두어서, 코드의 중복을 없애고 유지보수의 편의성 등을 얻을 수 있다.





참고 도서: 자바의 정석 책


+ Recent posts