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 예약어에 대해 살펴보았습니다.
추상 클래스의 경우 전체 프로그램을 설계할 때 사용하며, 자식 클래스에 기능 구현을 강요하기 때문에
설계가 완료된 경우에 자식 클래스에서 기능을 넓혀가는 것이 보다 편리해질 수 있습니다.
추상 메소드를 작성할 때는 메소드를 ()선언부까지만 작성해야한다는 점을 기억해야겠습니다.
또, 주석으로 어떤 기능의 메소드인지를 미리 명시해두면 작업하기가 한층 수월해질 것입니다.