본문 바로가기
✏️Java 공부/Java의 정석

[Java 공부/Java의 정석] Chapter.07 : 객체지향 프로그래밍 2 - 5 (추상클래스)

by 코코의 주인 2022. 7. 7.

추상클래스

 클래스를 설계도에 비유한다면, 추상클래스는 미완성 설계도에 비유할 수 있다. 미완성 설계도로 완성된 제품을 만들 수 없듯이 추상클래스로 인스턴스는 생성할 수 없다. 추상클래스는 상속을 통해서 자손클래스에 의해서만 완성될 수 있다.

 추상클래스 자체로는 클래스로서의 역할을 다 못하지만, 새로운 클래스를 작성하는 데 있어서 바탕이 되는 조상 클래스로서 중요한 의미를 갖는다.

 추상 클래스는 키워드 'abstract'를 붙이기만 하면 된다. 이렇게 함으로써 이 클래스를 사용할 때, 클래스 선언부의 abstract를 보고 이 크래스에는 추상 메서드가 있으니 상속을 통해서 구현해주어야 한다는 것을 쉽게 알 수 있을 것이다.

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

추상메서드

 메서드는 선언부와 구현부(몸통)로 구성된다. 추상 메서드는 선언 부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 메서드를 말한다. 즉, 설계만 해놓고 실제 수행될 내용은 작성하지 않았기 때문에 미완성 메서드인 것이다.

 메서드를 이와 같이 미완성 상태로 남겨 놓는 이유는 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 조상 클래스에서는 선언 부만을 작성하고, 주석을 덧붙여 어떤 기능을 수행할 목적으로 작성되었는지만 작성한다. 실제 내용은 상송받는 클래스에서 구현하도록 비워두는 것이다. 그래서 추상 클래스로부터 상속받는 자손클래스는 오버라이딩을 통해 조상인 추상클래스의 추상메서드를 모두 구현해주어야 한다. 만일 조상으로부터 상속받은 추상메서드 중 하나라도 구현하지 않는다면, 자손클래스 역시 추상클래스로 지정해 주어야 한다.


추상 클래스의 작성

 상속이 자손 클래스를 만드는 데 조상 클래스를 사용하는 거라면, 이와 반대로 추상화는 기존의 클래스의 공통부분을 뽑아 조상 클래스를 만드는 것이라고 할 수 있다. 상속 계층도를 따라 내려갈수록 클래스는 점점 기능이 추가되어 구체화의 정도가 심해지며, 상속 계층도를 따라 올라갈수록 클래스는 추상화의 정도가 심해진다고 할 수 있다.

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

예제를 통해 알아보도록 하자.

예제

abstract class Player {
    boolean pause;	//일시정지 상태를 저장하기 위한 변수
    int currentpos;	//현재 Play되고 있는 위치를 저장하기 위한 변수

    Player() {
        pause = false;
        currentpos = 0;
    }

    abstract void play(int pos);    //지정된 위치(pos)에서 재생을 시작하는 기능이 수행되어야 한다.
    abstract void stop();   	    //재생을 즉시 멈추는 기능이 수행되어야 한다.

    void play() {
        play(currentpos);
    }

    void pause() {
        if(pause) {     //정지 상태면
            pause = false;
            play(currentpos);
        }
        else {      //재생 상태면
            pause = true;
            stop();
        }
    }
}

 Player라는 추상클래스를 작성하였다. 이 클래스는 VCR이나 Audio와 같은 재생 가능한 기기를 클래스로 작성할 때 조상으로 사용할 수 있을 것이다.

class CDPlayer extends Player {
    void play(int currentPos) {
        /*조상의 추상메서드를 구현했다고 침*/
    }
    void stop() {
        /*조상의 추상메서드를 구현했다고 침*/
    }
    int currentTrack;   //현재 재생중인 트랙
    
    void nextTrack() {
        currentTrack++;
        ...
    }
    void preTrack() {
        currentTrack--;
        ...
    }
}

조상 클래스의 추상메서드를 CDPlayer클래스의 기능에 맞게 완성해주고, CDPlayer만의 새로운 기능들을 추가했다.


총평

 추상클래스가 필요하다는 사람도 있고, 다른 방법으로 대체해서 사용하는 것이 좋다는 사람도 있다.

 나는 저런 개념을 처음 접해봐서 저게 필요한가 싶지만, 구글링을 해보니 실무에서도 종종 쓰이는 경우가 있다고 해서 개념 정도는 알아두는 것이 좋겠다고 판단했다.

댓글