Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바 추상 클래스(Abstract Class) 완벽 가이드: 개념부터 사용법까지

자바에서 추상 클래스(Abstract Class)란 클래스 선언부에 abstract 키워드가 포함된 클래스를 의미합니다. 추상 클래스는 완전하지 않은 '설계도' 역할을 하며, 하위 클래스가 반드시 구현해야 할 메서드를 강제할 수 있어 객체 지향 설계에서 매우 중요한 개념입니다.

추상 클래스의 핵심 특징

  • 추상 클래스에는 추상 메서드(몸통이 없는 메서드, 예: public void get();)가 있을 수도 있고 없을 수도 있습니다.
  • 하지만 클래스에 추상 메서드가 하나라도 있다면, 그 클래스는 반드시 abstract로 선언해야 합니다.
  • 추상 클래스로 선언된 클래스는 인스턴스화(instantiation)할 수 없습니다. 즉, 직접 객체를 생성할 수 없습니다.
  • 추상 클래스를 사용하려면 다른 클래스가 이를 상속받아야 하며, 상속받은 클래스에서 추상 메서드의 구현체를 제공해야 합니다.
  • 추상 클래스를 상속받는다면, 해당 클래스 안의 모든 추상 메서드에 대한 구현을 반드시 제공해야 합니다.

추상 클래스 예제

다음은 추상 클래스를 만드는 예제입니다. 추상 클래스를 생성하려면 클래스 선언 시 class 키워드 앞에 abstract 키워드를 붙이기만 하면 됩니다.

/* File name : Employee.java */
public abstract class Employee {
   private String name; private String address; private int number;
   public Employee(String name, String address, int number) {
      System.out.println("Constructing an Employee");
      this.name = name; this.address = address;
      this.number = number;
   }
   public double computePay() {
      System.out.println("Inside Employee computePay"); return 0.0;
   }
   public void mailCheck() {
      System.out.println("Mailing a check to " + this.name + " " + this.address);
   }
   public String toString() {
      return name + " " + address + " " + number;
   }
   public String getName() {
      return name;
   }
   public String getAddress() {
      return address;
   }
   public void setAddress(String newAddress) {
      address = newAddress;
   }
   public int getNumber() {
      return number;
   }
}

코드를 살펴보면 알 수 있듯이, 추상 메서드가 존재하지 않는 한 Employee 클래스는 일반적인 자바 클래스와 동일한 형태입니다. 이제 이 클래스는 추상 클래스가 되었지만, 여전히 세 개의 필드, 일곱 개의 메서드, 하나의 생성자를 가지고 있습니다.

추상 클래스는 인스턴스화할 수 없다

그렇다면 Employee 클래스를 다음과 같은 방식으로 인스턴스화하려고 하면 어떻게 될까요?

/* File name : AbstractDemo.java */
public class AbstractDemo {
   public static void main(String [] args) {
      /* 다음 코드는 허용되지 않으며 컴파일 에러가 발생합니다 */
      Employee e = new Employee("George W.", "Houston, TX", 43);
      System.out.println("
 Call mailCheck using Employee reference--");
      e.mailCheck();
    }
 }

위 클래스를 컴파일하면 다음과 같은 오류가 발생합니다.

Employee.java:46: Employee is abstract; cannot be instantiated
Employee e = new Employee("George W.", "Houston, TX", 43); ^ 1 error  

오류 메시지에서 볼 수 있듯이 "Employee is abstract; cannot be instantiated", 즉 'Employee는 추상 클래스이므로 인스턴스화할 수 없다'는 컴파일 에러가 발생합니다. 이처럼 추상 클래스는 직접 객체를 생성할 수 없으며, 반드시 하위 클래스가 상속하여 추상 메서드를 구현한 뒤에야 비로소 사용할 수 있습니다.