추상화(Abstract)

추상: 사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 그것을 추출하여 파악하는 것, 프로그래밍에서 추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는 것이다.

 

[JAVA] 클래스와 객체 에서 클래스를 설계도에 비유했다. 추상 클래스는 미완성 설계도로 비유할 수 있다.

클래스의 멤버와 무관하게 추상 클래스는 추상 메서드를 가지고 있기 때문에 추상 클래스라고 불린다.

 

추상 메서드란 선언부에 abstract 제어자를 붙이고 메서드의 선언부만 존재하고 바디는 존재하지 않는 메서드를 말한다.

//추상 클래스
abstract class Abstract{
    String a;
    abstract void print();

    String getA() {
        return a;
    }
}

추상 클래스는 abstract 제어자로 선언하고 인스턴스를 생성할 수 없다는 점 빼고는 일반 메서드랑 똑같다. 

추상 클래스 안에 일반 메서드를 가질 수 있고 생성자와 static 메서드도 가질 수 있다. 

 

인스턴스를 생성할 수 없다는 말은 말 그대로 추상화된 클래스이기 때문에 상속받은 하위 클래스에서 미완성된 메서드를 구현해주어야 하위 클래스의 인스턴스를 생성하고 사용할 수 있다는 뜻이다.

 

abstract class Abstract{
    String a;
    abstract void print();

    String getA() {
        return a;
    }
}

class SubClass extends Abstract {

    @Override
    void print() {
        System.out.println("subClass");
    }
}

public class AbstractTest {
    public static void main(String[] args) {
        SubClass s = new SubClass();
        s.print(); //subClass
    }
}

참고로 추상 클래스에 추상 메서드가 없어도 클래스가 abstract로 선언되어 있으면 해당 클래스의 인스턴스는 생성이 불가능하다.

 

추상 클래스는 추상 메서드를 갖고 있어서 객체를 생성하지도 못하는데 왜 추상 클래스를 만드는 걸까?

실제 구체적인 내용을 하위 클래스에서 구현하게 강제한다면 상황이 변해도 유연하게 대응이 가능하기 때문이다.

abstract class Shape {
    abstract double area();
}

class Rectangle extends Shape {
    private double width;
    private double height;

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

    @Override
    public double area() {
        return width * height;
    }
}

class Circle extends Shape {

    private double radius;
    private final double pi = Math.PI;

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

    @Override
    public double area() {
        return Math.pow(radius, 2) * pi;
    }
}


public class AbstractTest {
    public static void main(String[] args) {
        Circle circle = new Circle(4);
        System.out.println("Circle area = " + circle.area()); //Circle area = 50.26548245743669

        Rectangle rectangle = new Rectangle(10,20);
        System.out.println("Rectangle area = " + rectangle.area()); //Rectangle area = 200.0
    }
}

Shape의 추상 클래스를 만들고 Circle, Rectangle 클래스가 Shpae 클래스를 상속받아 각각 area 메서드를 재정의 했다.

위처럼 하위 클래스는 Overriding을 통해 상황에 맞는 메서드를 유연하게 구현할 수 있다.

 

정리하면 추상화는 클래스 간의 공통점을 찾아 하나로 묶어 공통의 상위 클래스로 만드는 작업이다.

 

BELATED ARTICLES

more