JAVA/JAVA

Java | Abstract 추상 클래스 & 추상 메소드

pathas 2020. 1. 31. 17:21

Abstract 추상 클래스 & 추상 메소드


Abstract

해당 클래스/메소드가 추상 클래스/추상 메소드임을 명시하는 예약어

  • 클래스나 메소드 앞에 abstract를 붙여서 추상 클래스 or 추상 메소드임을 명시
  • 클래스에 추상 메소드가 포함되어 있는 경우 반드시 클래스에 abstract를 작성해야 함
  • abstract는 접근 제어자 앞이나 뒤에 사용할 수 있음

작성법

// ① abstract를 접근 제어자 앞에 작성
abstract 접근 제어자 class 클래스명 {
    abstract 접근 제어자 반환형 메소드명();
}

// ② abstract를 접근 제어자 뒤에 작성
접근 제어자 abstract class 클래스명 {
    접근 제어자 abstract 반환형 메소드명();
}

추상 클래스

추상 메소드를 하나라도 가지고 있는 클래스를 추상 클래스라고 함
즉, 일반 클래스에는 추상 메소드가 있을 수 없음

  • 추상 클래스를 상속받은 자식 클래스는 반드시 추상 메소드를 오버라이딩해야 함
    추상 클래스가 자식 클래스에 추상 메소드의 재정의를 강요
    ↔ final class: 오버라이딩을 제한하기 위해서 전적으로 상속을 금지함
  • 추상 클래스는 프로그램의 설계를 목적으로 함
    ↔ 일반 클래스는 여러 개의 객체를 생성하고 데이터를 저장하는 것을 목적으로 함
  • 추상 클래스는 객체로 생성할 수 없음
    자식 클래스에서 추상 클래스를 상속받고 추상 메소드를 오버라이딩해서 구현을 마친 뒤,
    자식 클래스를 이용해서 객체를 생성해야 함

추상 클래스 장점

  • 추상 클래스에서 설계가 완료되면 자식 클래스에서 상속을 받아서 기능을 확장하는데 용이
  • 자식 클래스에 추상 메소드의 구현을 강요하기 때문에 표준화 정도를 높임
  • 클래스들의 공통 사항을 한 곳에서 관리할 수 있기 때문에 개발 및 유지보수가 편리해짐

추상 메소드

메소드는 ()선언부와 {}구현부로 나누어지는데
선언부까지만 작성하고 구현부는 작성하지 않은 메소드

  • 메소드 내용이 상속받는 클래스에 따라 달라지기 때문에 추상 메소드 사용
  • 구현부는 해당 클래스를 상속받는 하위 클래스에서 반드시 작성해야 함
    {}구현부를 작성하지 않은 경우 에러 발생
  • 주석으로 어떤 기능을 수행하는 메소드인지 설명해야 함
  • 오버라이딩 메소드에는 abstract를 작성하지 않음

사용례

package j200131;

// 추상 메소드를 가진 추상 클래스
abstract class Exam {

    // 일반 메소드
    public int sum(int x, int y) {
        return x + y;
    }

    /* 추상 메소드, 하위 클래스에서 오버라이딩을 완료해야 함 */
    // 하위 클래스에서 "안녕?"을 출력하는 메소드로 구현
    abstract public void sayHi();

    // 하위 클래스에서 매개변수 a와 b를 더한 뒤 결과를 출력하는 메소드로 구현
    abstract public void printSum(int a, int b);
}

public class AbstractTest extends Exam {

    // Exam 클래스의 sayHi() 추상 메소드 오버라이딩
    public void sayHi() {
        System.out.println("안녕?");
    }

    // Exam 클래스의 printSum() 추상 메소드 오버라이딩
    public void printSum(int a, int b) {
        int result = sum(a, b);
        System.out.println(a + "과(와) " + b + "의 합은 " + result + "(이)야");
    }

    public static void main(String[] args) {

        // 하위 클래스인 AbstractTest 객체 생성
        AbstractTest at = new AbstractTest();

        // AbstractTest 클래스에서 재정의된 메소드 호출
        at.sayHi();              // 안녕?
        at.printSum(30, 40);     // 30과(와) 40의 합은 70(이)야

    }

}

추상 클래스와 추상 메소드, abstract 예약어에 대해 살펴보았습니다.

추상 클래스의 경우 전체 프로그램을 설계할 때 사용하며, 자식 클래스에 기능 구현을 강요하기 때문에

설계가 완료된 경우에 자식 클래스에서 기능을 넓혀가는 것이 보다 편리해질 수 있습니다.

추상 메소드를 작성할 때는 메소드를 ()선언부까지만 작성해야한다는 점을 기억해야겠습니다.

또, 주석으로 어떤 기능의 메소드인지를 미리 명시해두면 작업하기가 한층 수월해질 것입니다.