JAVA/BASIC

자바(JAVA) 추상클래스 (Abstract Class)

유혁스쿨 2023. 4. 12. 13:24
728x90
반응형

추상클래스란

객체를 직접 생성할 수 있는 클래스를 실체 클래스 라고 하는 반면 추상 클래스는 실체 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상클래스 라고 할 수 있다.

추상 클래스와 실체 클래스는 상속의 관계를 가지고 있다.

추상 클래스가 부모이고 실체 클래스가 자식으로 구현되어 실체 클래스는 추상 클래스의 모든 특성을 물려받고, 추가적인 특성을 가질 수 있다.

 

추상 클래스의 용도는 다음 두 가지가 있다.

 

1. 실체 클래스들의 공통된 필드 및 메소드 이름 통일 목적

실체 클래스를 설계하는 사람이 여러 사람일 경우, 실체 클래스마다 필드와 메소드가 제각기 다른 이름을 가질 수 있다.

예를 들어 소유자의 이름을 저장하는 필드를 Telephone에서는 owner라고 하고, SmartPhone에서는 user라고 할 수 있다.

그리고 전원을 켜다 라는 메소드를 Telephone에서는 turnOn()으로 설계하고 SmartPhone에서는 powerOn() 이라고 설계할 수 있다.

동일한 데이터와 기능임에도 불구하고 이름이 다르다 보니, 객체 사용법이 달라진다.

이것 보다는 Phone이라는 추상 클래스에 소유자인 owner필드와 turnOn() 메소드를 선언하고, Telephone과 SmartPhone은 Phone을 상속함으로써 필드와 메소드 이름을 통일시킬 수 있다.

 

2. 실체 클래스 작성 시간 절약

공통적인 필드와 메소드는 추상 클래스인 Phone에 모두 선언해 두고, 실체 클래스마다 다른 점만 실체 클래스에 선언하게 되면 실체 클래스를 작성하는데 시간을 절약할 수 있다.

 

추상 클래스는 실체 클래스의 공통되는 필드와 메소드를 추출해서 만들었기 때문에 객체를 직접 생성해서 사용할 수 없다.

다시 말해서 추상 클래스는 new 연산자를 사용하여 인스턴스를 생성시킬 수 없다.

public class Example{
    AbsClass absCalss = new AbsClass(); // 생성할 수 없음, 컴파일 오류 발생
}
abstract class AbsClass{}

추상 클래스는 새로운 실체 클래스를 만들기 위해 부모 클래스로만 사용된다.

따라서 실체 클래스의 extends 뒤에만 올 수 있는 클래스이다(인스턴스화 될 수 없고 상속을 통해서만 사용 가능하다는 의미)

이것은 앞서 말한 공통된 필드와 메소드의 이름을 통일할 목적 및 실체 클래스 작성시 시간 절약에 대한 목적이다.

추상 클래스도 일반 클래스와 마찬가지로 필드, 메소드 생성자를 선언할 수 있다.

new연산자로 직접 생성자를 호출할 수 는 없지만 자식 객체가 생성될 때 super(...)를 호출해서 추상 클래스 객체를 생성하므로 추상 클래스도 생성자가 반드시 있어야 한다.

 

public class Example {
    public static void main(String... args) {
        Car car = new Car("Car class");
        car.method(); // "추상클래스 owner : Car class" 출력
    }
}

/* 실체 클래스 Car */
class Car extends AbsClass{
    public String owner;
    public Car(String owner) {
        super(owner); // 추상 클래스 AbsClass 생성자 호출 (반드시 첫줄)
        this.owner = owner // Car클래스의 owner필드
    }
    @override
    public void absMethod() {
       System.out.println("실체클래스 owner : " + this.owner); 
       System.out.println("추상클래스 owner : " + super.owner); 
    }
}

/* 추상 클래스 AbsClass */
abstract class AbsClass{
    public String owner;

    public AbsClass(String owner) {
        this.owner = owner; // AbsClass클래스의 owner필드
    }
    
    public void method() {
        System.out.println("추상클래스 owner : " + this.owner);
    }
    
    public abstract void absMethod();
    
}

이하 추상메소드와 오버라이딩 내용은 생략.

728x90
반응형