본문으로 바로가기

[Java] 추상클래스(abstract class)

category Language/Java 2020. 1. 18. 16:36

1. 추상클래스

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

추상클래스는 추상메서드(미완성 메서드)를 포함하고 있다.

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

 

추상클래스 자체로는 클래스로서의 역할을 다 못하지만,

새로운 클래스를 작성하는데 있어서 바탕이 되는 조상클래스로서 중요한 의미를 갖는다.

 

새로운 클래스를 작성할 때 아무것도 없는 상태에서 시작하는 것보다는

어느 정도 틀을 갖춘 상태에서 시작하는 것이 나을 것이다.

 

예제 코드

키워드 'abstract'를 붙이기만 하면 된다.

abstract class 클래스이름{
	...
}

2. 추상 메서드

메서드는 선언부와 구현부로 구성되어 있다.

선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 것이 추상메서드이다.

 

메서드를 이와 같이 미완성 상태로 남겨 놓는 이유는 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에

조상 클래스에서는 선언부만을 작성하고, 주석을 덧붙여 어떤 기능을 수행할 목적으로 작정되었는지 알려준다.

실제 내용은 상속받는 클래스에서 구현하도록 비워 두는 것이다.

 

예제 코드

키워드 'abstract'를 앞에 붙여 주고 추상 메서드는 구현부가 없으므로 괄호{} 대신 문장의 끝을 알리는 ';'을 적는다.

 

추상클래스로부터 상속받는 자손클래스는 오버라이딩을 통해 조상인 추상클래스의 추상메서드를 모두 구현해 주어야 한다.

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 paly(int pos){ /* 내용생략 */ }    //추상 메서드 구현
}

3. 추상 클래스의 작성

여러 클래스에 공통적으로 사용될 수 있는 클래스를 바로 작성하기도 하고,

기존의 클래스의 공통적인 부분을 뽑아서 추상클래스로 만들어 상속하도록 하는 경우도 있다.

 

상속이 자손 클래스를 만드는데 조상 클래스를 사용하는 것이라면,

이와 반대로 추상화는 기족의 클래스의 공통부분을 뽑아내서 조상클래스를 만드는 것이라고 할 수 있다.

 

상속계층도를 통한 설명

  • 추상화 - 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업
  • 구체화 - 상속을 통해 클래스를 구현, 확장하는 작업

예제코드

Player라는 추상클래스가 존재한다면 VCR이나 Audio와 같은 재생가능기기의 조상 클래스로 사용될 수 있을 것이다.

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(){
        /* 조상의 추상메서드를 구현. 내용생략 */
    }
    // CDPlayer 클래스에 추가로 정의된 멤버
    int currentTrack;
    void nextTrack(){
        currentTrack++;
    }
    void preTrack(){
        if(currentTrack>1){
            currentTrack--;
        }
            ...
    }
}    

 

 

'Language > Java' 카테고리의 다른 글

[Java] 컬렉션 프레임웍(Collection Framework)  (0) 2020.01.22
[Java] toString()과 String.valueOf()  (0) 2020.01.18
[Java] 제어자  (0) 2020.01.18
[Java] 다형성(Polymorphism)  (0) 2020.01.18
[Java] 상속(Inheritance)  (0) 2020.01.18