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

자바 추상 클래스와 추상 메소드 완벽 가이드

자바에서 추상 클래스와 추상 메소드 만들기

네, 자바에서는 추상 메소드(abstract method)추상 클래스(abstract class)를 아주 쉽게 만들 수 있습니다. 추상 클래스는 abstract 키워드를 사용해 선언하며, 직접 객체를 생성할 수 없고 반드시 상속을 통해서만 사용할 수 있다는 점이 일반 클래스와 다릅니다.

추상 클래스란?

추상 클래스는 설계 의도상 직접 인스턴스화되지 않아야 하는 클래스나, 하위 클래스가 반드시 구현해야 하는 메소드를 정의해 둔 클래스입니다. 추상 메소드란 선언만 존재하고 구현 내용(메소드 본문)이 없는 메소드를 말하며, 이를 상속받는 하위 클래스가 해당 메소드를 반드시 오버라이딩하도록 강제하는 역할을 합니다.

  • 인스턴스화 불가: 추상 클래스는 new 키워드로 객체를 직접 생성할 수 없습니다.
  • 상속 전용: 하위 클래스가 상속하여 미구현된 메소드를 완성해야 합니다.
  • 일반 멤버 보유 가능: 추상 메소드 외에도 일반 메소드, 필드, 생성자를 함께 가질 수 있습니다.

예제

추상 클래스를 만드는 방법은 간단합니다. 클래스 선언부에서 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 클래스는 일반적인 자바 클래스와 동일한 형태입니다. 이 클래스는 이제 추상 클래스가 되었지만, 여전히 세 개의 필드, 일곱 개의 메소드, 그리고 하나의 생성자를 그대로 가지고 있습니다.

추상 클래스 활용하기

추상 클래스는 다음과 같이 상속하여 사용합니다. 하위 클래스는 부모 클래스에서 구현하지 않은 메소드를 반드시 오버라이딩해야 합니다.

public class Salary extends Employee {
   private double salary;

   public Salary(String name, String address, int number, double salary) {
      super(name, address, number);
      this.salary = salary;
   }

   @Override
   public double computePay() {
      System.out.println("Computing salary pay for " + getName());
      return salary / 52;
   }
}

이처럼 추상 클래스는 공통 기능을 상위 클래스에 미리 정의해 두고, 세부 구현은 하위 클래스에 맡기는 템플릿 역할을 수행합니다. 덕분에 코드의 재사용성과 유지보수성이 크게 향상되며, 객체 지향 설계의 다형성을 효과적으로 활용할 수 있습니다.