AiPE

추상 클래스(Abstract Class) 및 추상 메서드(Abstract Method)의 정의와 활용 본문

[XiBBaL] Study/Java

추상 클래스(Abstract Class) 및 추상 메서드(Abstract Method)의 정의와 활용

Oshimaker XiBBaL 2024. 4. 3. 17:32
반응형

1. 추상 클래스(Abstract Class)와 추상 메서드(Abstract Method)의 정의

추상 클래스(Abstract Class)는 하나 이상의 추상 메서드(Abstract Method)를 포함하는 클래스이다.

 

추상 메서드는 선언만 되어 있고 구현이 되어 있지 않은 메서드를 말한다.

쉽게, "응 난 이런 메서드를 만들었어." "그래서 이 메서드가 무슨 기능인데?" "(아직) 없어" 이 상태라는 것이다.

 

따라서 추상 메서드는 당연하게도 직접 인스턴스화 할 수 없다. (기능이 없어 실행하라고 해도 뭘 실행해야 할지 모른다.)

 

추상 메서드를 인스턴스화(구현)하려면 해당 추상 메서드를 구현하는 하위 클래스를 만들어야 한다.

즉, 해당 추상 메서드를 설명해주는 하위 클래스 및 메서드들이 있어야 한다.

 

 

그러면 이딴걸 왜 쓰고 왜 만들어 놨냐?

다음과 같은 이유에서이다.

 

 

 

 

2. 추상 클래스와 추상 메서드를 쓰는 이유

① 추상화 (=카테고리화)

추상 클래스는 실제로 구현되지 않은 추상 메서드를 포함할 수 있으므로, 현실 세계의 개념을 모델링하는 데 유용하다.

추상 클래스여서 그런지 말이 좀 추상적인데, 아래 문장을 읽으면 조금 더 와닿을 것이다.

 

추상 클래스를 통해 공통된 특성을 가진 클래스들을 추상 클래스로 묶어서 코드의 재사용성과 일관성을 높일 수 있다.

즉, 클래스들이 있는데, 이들은 공통적인 무언가를 상속받을 필요는 없는 상황이라고 해 보자.

하지만 프로그래머가 보기에 이 클래스들은 개념적인 공통점이 있다.

이러한 경우 추상 클래스를 이용해 하위 클래스들을 하나로 묶어둘 수 있다.

 

예를 들어, 자동차의 바퀴, 차체, 엔진, 시트를 각각의 클래스로 만들었는데, 공통되는 기능은 없다.

이 때, 이들을 보기좋게 카테고리화하기 위해 "자동차"라는 추상 클래스로 묶어둘 수 있다.

 

 

② 계약(Contract)

추상 클래스는 하위 클래스에서 반드시 구현해야 하는 메서드를 정의할 수 있다.

 

아까 추상 메서드가 인스턴스화 되기 위해서는 이를 보조하는 하위 클래스들이 무조건 존재해야 한다고 했다.

이러한 점을 이용해 상위 추상 클래스에 추상 메서드를 정의해두면 하위 클래스에서는 무조건 이를 설명해야 한다.

 

따라서, 추상 클래스를 사용해 하위 클래스에서 특정한 규약을 준수하도록 요구할 수 있다.

이렇게 하위 클래스에 강제적인 요구를 하는 행위를 프로그래밍에서는 계약(Constract)라고 부른다.

 

 

 

 

3. 문법과 용례

이제 실제 코드를 보면서 추상 클래스를 어떻게 선언하고 사용하는지 알아보자.

// 추상 클래스 선언
abstract class Shape {
    // 추상 메서드 선언
    abstract double area();
}

// 추상 클래스를 상속받는 하위 클래스 정의
class Rectangle extends Shape {
    double width;
    double height;

    Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    // 추상 메서드를 구현
    @Override
    double area() {
        return width * height;
    }
}

class Circle extends Shape {
    double radius;

    Circle(double radius) {
        this.radius = radius;
    }

    // 추상 메서드를 구현
    @Override
    double area() {
        return Math.PI * radius * radius;
    }
}

public class Main {
    public static void main(String[] args) {
        Shape rectangle = new Rectangle(5, 10);
        Shape circle = new Circle(3);

        System.out.println("Rectangle area: " + rectangle.area());
        System.out.println("Circle area: " + circle.area());
    }
}

 

이름 앞에 위치하는 키워드 "abstract"를 이용해 추상 클래스를 선언하며 추상 메소드를 선언할 수 있다.

 

Rectangle과 Circle 클래스는 Shape 클래스를 상속하므로 무조건 area 메소드를 설명해야 한다.

이를 위해 각각 @Override가 사용되었다.

 

Rectangle과 Circle을 하나로 묶기 위해 Shape라는 추상 클래스가 사용되었다고 할 수 있다.

반응형