자바[JAVA] : 추상클래스

2021. 1. 28. 02:52Java

반응형

● 추상 클래스

 추상 클래스(abstract class) 란? 

클래스를 설계도에 비유한다면, 추상클래스는 미완성 설계도라 할 수 있다. 클래스가 미완성이라는 것은 멤버의 개수에 관계된 것이 아니라, 단지 미완성 메서드(추상메서드)를 포함하고 있다는 의미이다.

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

추상클래스 자체로는 클래스로서의 역할을 다 못하지만, 새로운 클래스를 작성하는데 있어서 바탕이 되는 조상 클래스로서 중요한 의미를 갖는다. 추상클래스는 키워드 'abstract'를 붙이기만 하면 된다. 클래스 선언부의 abstract를 보고 이 클래스에는 추상메서드가 있으니 상속을 통해서 구현해주어야 한다는 것을 쉽게 알 수 있을 것이다.

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

추상 클래스는 추상메서드를 포함하고 있다는 것을 제외하고 일반 클래스와 동일하므로, 생성자가 있고, 멤버변수와 메서드도 가질 수 있다.

 추상 메서드 

메서드는 선언부와 구현부(몸통)로 구성 되어있으며, 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨둔 것이 추상메서드이다.

메서드를 이와같이 미완성 상태로 남겨 놓는 이유는 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 대문에 조상 클래스에서는 선언부만을 작성하고, 주석을 덧붙여 어떤 기능을 수행할 목적으로 작성되었는지 알려주고, 실제 내용은 상속받는 클래스에서 구현하도록 비워두는 것이다.

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) { //추상메서드 내용 구현 }
}

 

 추상 클래스의 작성 

추상클래스를 작성할 때 여러 클래스에 공통적으로 사용될 수 있는 클래스를 바로 작성하기도 하고, 기존 클래스의 공통적인 부분을 뽑아서 추상클래스로 만들어 상속하도록 하는 경우도 있다.

상속계층도를 따라 내려갈수록 클래스는 점점 기능이 추가되어 구체화의 정도가 커지며, 반대로 올라갈수록 추상화의 정도가 커진다고 할 수 있다. 즉, 상속계층도를 따라 내려 갈수록 세분화되며, 올라갈수록 공통요소만 남게 된다.

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

클래스의 메서드를 추상메서드로 하는 대신, 아무 내용도 없는 메서드로 작성할 수도 있다. 자손클래스에서 오버라이딩하여 자신의 클래스에 맞게 구현하기 때문에 굳이 추상메서드를 사용할 필요가 없다고 생각할 수도 있다.
만일 추상메서드로 정의되지 않고 빈 몸통만 가지고 있다면 상속받는 자손클래스에서는 이 메서드가 온전히 구현된 것으로 인식하고 오버라이딩을 하지 않을수도 있다. 그렇기 때문에 추상메서드로 선언하여 자손클래스에게 내용을 구현해주어야 한다는 것을 알려주는 것이다.

 

출처 : 자바의 정석

반응형