[JAVA] 객체지향 프로그래밍(OOP) - 추상화와 추상 클래스
추상화(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을 통해 상황에 맞는 메서드를 유연하게 구현할 수 있다.
정리하면 추상화는 클래스 간의 공통점을 찾아 하나로 묶어 공통의 상위 클래스로 만드는 작업이다.
'Programming > Java' 카테고리의 다른 글
[JAVA] 제네릭(Generic) (0) | 2022.09.15 |
---|---|
[JAVA] 예외와 예외 처리(Exception handling) (0) | 2022.09.13 |
[JAVA] 객체지향 프로그래밍(OOP) - 다형성과 형변환 (0) | 2022.09.08 |
[JAVA] 객체지향 프로그래밍(OOP) - 캡슐화 (0) | 2022.09.07 |
[JAVA] 객체지향 프로그래밍(OOP) - 상속 (1) | 2022.09.07 |