-
Java | Abstract 추상 클래스 & 추상 메소드JAVA/JAVA 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 예약어에 대해 살펴보았습니다.
추상 클래스의 경우 전체 프로그램을 설계할 때 사용하며, 자식 클래스에 기능 구현을 강요하기 때문에
설계가 완료된 경우에 자식 클래스에서 기능을 넓혀가는 것이 보다 편리해질 수 있습니다.
추상 메소드를 작성할 때는 메소드를 ()선언부까지만 작성해야한다는 점을 기억해야겠습니다.
또, 주석으로 어떤 기능의 메소드인지를 미리 명시해두면 작업하기가 한층 수월해질 것입니다.
'JAVA > JAVA' 카테고리의 다른 글
Java | Interface (0) 2020.02.03 Java | Call by Value & Call by Reference (0) 2020.01.31 Java | Final (0) 2020.01.31 Java | Integer.to~String() (0) 2020.01.31 Java | Super & 생성자 호출 메커니즘 (0) 2020.01.30