본문 바로가기
백엔드(Back-End)/Java

[Java] - 추상 클래스(Abstract class), 추상 메서드(Abstract method)

by TwoJun 2023. 1. 11.

[Programming Language] - Java

Java의 추상 클래스(Abstract class), 추상 메서드(Abstract method)에 대해 간단히 정리해 보고자 합니다.

 

 

 

 

 

 

1. 추상 클래스(Abstract class)

1-1. 정의

- 추상 클래스는 추상 메서드(Abstract mehtod)를 보유하고 있는 클래스를 의미합니다.

 

- 추상화의 특성을 이용하고, 다른 클래스의 부모 클래스가 되기 위한 클래스이기도 하며 추상 클래스를 사용하는 근본적인 이유는, 클래스에 추상화의 개념을 접목시켜, 구조적으로 객체를 설계하고 코드의 유지보수성(수정, 추가), 확장성이 높은 프로그램을 설계할 수 있도록 하기 위함입니다.

 

 

- 여러 객체들에 대해 공통적으로 사용될 수 있는 공통 부분을 기준으로 추상 클래스를 작성합니다.

 

 

 

 

1-2. 추상 클래스(Abstract class)의 특징

(1) 추상 클래스를 선언할 때 abstract 키워드를 사용합니다.

abstract class GeneralPlayer{
    abstract void play();
    abstract void stop();
    abstract void UpVolume();
    abstract void DownVolume();
}

 

 

(2) 추상 클래스는 상속은 가능하지만, 인스턴스화(객체 생성)할 수 없습니다.

- 추상 메서드(완성되지 않은 구체적이지 않은 메서드, 구현부 미존재)를 가지고 있기 때문입니다.

 

- 추상 클래스는 상속 구조에서 다른 클래스의 부모 클래스임을 나타내는 역할로만 사용되기 때문입니다.

 

 

(3) 아래 코드처럼, 상속을 통해 또 다른 클래스에서 추상 메서드를 완성시켜야 객체를 생성할 수 있습니다.

class AudioPlayer extends GeneralPlayer {
    void play() {/* 내용 생략 */}
    void stop() {/* 내용 생략 */}
    void UpVolume() {/* 내용 생략 */}
    void DownVolume() {/* 내용 생략 */}
}

 

 

 

(4) 상속을 통해 일부 추상 메서드만 구현했다면 생성된 클래스는 추상 클래스가 됩니다.

- 상속을 통해 추상 메서드가 모두 완성되지 않았다면, 상속을 받는 클래스에 abstract를 붙입니다.

abstract class AbstractAudioPlayer extends GeneralPlayer {
    void play() {/* 내용 생략 */}
    void stop() {/* 내용 생략 */}
}

 

 

(5) 추상 클래스는 꼭 추상 메서드만 존재할 수 있는 것이 아니며, 인스턴스 변수, 생성자 등 다양한 요소가 존재할 수 있습니다.

 

 

 

 

1-3. 추상 클래스의 의미

- 추상 클래스는 어떤 의미에서 보면 완전히 완성되지 않은 설계도로 볼 수 있습니다.

추상 클래스는 단독으로 객체를 생성할 수 없고 자식 클래스를 통해 자신을 완성시켜줘야만 하기 때문입니다.

 

- 이처럼 추상 클래스는 일반적인 클래스로써의 역할을 수행할 순 없지만 다른 특정한 클래스를 새롭게 정의하는데 있어 바탕이 되는 부모(슈퍼) 클래스로써의 의미를 갖게 됩니다

 

 

 

 

 

 

2. 추상 메서드(Abstract method)

2-1. 정의

- 완성되지 않은 메서드를 의미하며, 구현부가 존재하지 않는 메서드입니다.

 

- 문법 : abstract 반환 타입 메서드명();

 

 

 

2-2. 추상 메서드(Abstract method)의 특징

(1) 추상 메서드는 어떤 클래스가 상속을 받아 자신이 구현되기 전까지 추상 메서드를 호출할 수 없습니다. 

- 하지만 클래스 상속을 통해 추상 메서드가 구현된다면, 해당 메서드를 호출할 수 있게 됩니다.

 

(2) 위와 같은 특징으로 추상 클래스 내부에서 추상 메서드를 호출할 수 있습니다

 

 

 

 

 

 

 

 

3. 추상 클래스에서의 다형성

- 아래에서 보는 것처럼 자식 클래스 타입의 참조변수로 객체를 물론 생성하였지만, 부모 타입의 참조변수로도 객체를 생성할 수 있게 됩니다.

 

- 이를 통해 추상 클래스에서도 다형성(부모 타입의 참조변수로 자식 타입의 객체를 다룰 수 있는 것)이 존재한다는 것을 알 수 있습니다.

package oop_second;

abstract class GeneralPlayer{
    abstract void play();
    abstract void stop();
}
// 완전히 구현된 AudioPlayer 클래스
class AudioPlayer extends GeneralPlayer {
    void play() { System.out.println("재생 시작"); }
    void stop() { System.out.println("재생 멈춤"); }
}

public class AbstractClass {
    public static void main(String[] args) {
        // 자식 클래스의 참조변수로 객체 생성 가능
        AudioPlayer ap1 = new AudioPlayer();

        // 다형성 : 부모의 참조변수로도 자식 객체를 다룰 수 있게 된다.
        GeneralPlayer ap2 = new AudioPlayer();
    }
}

 

 

 

 

 

 

======================================================================

해당 포스팅에 대해 내용 추가가 필요하다고 생각되면 기존 포스팅 내용에 다른 내용이 추가될 수 있습니다.

개인적으로 공부하며 정리한 내용이기에 오타나 틀린 부분이 있을 수 있습니다.

이에 대해 지적해 주시면 감사하겠습니다.

댓글