📌 학습 목차
31-1. 추상 클래스
31-2. 추상 메서드
32. 추상 클래스와 추상 메서드 예제
31-1. 추상 클래스
추상 클래스(abstract class): 추상 메서드를 가진 미완성 클래스(설계도)
•추상 클래스는 여러 클래스에서 공통적으로 사용될 수 있는 부분을 추리거나
기존 클래스에서 공통적으로 사용되는 부분을 뽑아서 만든 클래스로서, 새로운 클래스를 작성하는 데 도움을 줄 목적으로 작성됨
•추상 클래스는 상속을 통해 자손 클래스에서 추상 메서드를 오버라이딩으로 모두 구현한 경우에만 객체를 생성할 수 있음
•추상 클래스는 클래스 선언부에 abstract 제어자를 사용하여 추상 메서드 구현이 필요한 추상 클래스임을 나타냄
•추상 클래스는 추상 메서드를 포함한다는 것을 제외하곤 일반 클래스와 같이 멤버 변수, 생성자, 메서드를 가질 수 있음
31-2. 추상 메서드
추상 메서드(abstract method): 메서드의 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 미완성 메서드
•추상 메서드는 꼭 필요한 메서드이나 자손 클래스마다 메서드 내용이 다르게 구현될 것으로 예상되는 경우에 사용함
이에 추상 클래스에서는 선언부만 작성한 후 어떤 기능을 수행할 목적으로 작성했는지를 주석으로 덧붙이고,
메서드 내용은 자손 클래스에서 자신의 클래스에 맞게 구현할 수 있도록 미완성 메서드로 남겨놓음
•추상 클래스는 상속을 통해 자손 클래스에서 추상 메서드를 오버라이딩으로 모두 구현해야 함
이때 추상 메서드 중 하나라도 구현하지 않을 경우, 자손 클래스 또한 추상 클래스로 지정해야 함
•추상 메서드는 메서드 선언부에 abstract 제어자를 사용하며, 구현부가 없어 괄호 대신 문장의 끝을 알리는 ';'로 끝맺음
•메서드는 구현부와 관계없이 선언부만으로도 호출할 수 있음
이에 추상 메서드가 구현되었다는 가정 하에 일반 메서드에서 추상 메서드를 호출하는 코드를 작성할 수 있으며,
메서드 호출 시 추상 클래스에 정의된 추상 메서드가 아닌 추상 메서드가 구현된 인스턴스 메서드가 호출됨
32. 추상 클래스와 추상 메서드 예제
package chap_07;
// 1) 추상 클래스
abstract class Player1 {
📌 // 1-1) 멤버 변수 선언
int x, y;
📌 // 1-2) 생성자 정의
Player1() {
x = 0;
y = 0;
}
📌 // 1-3) 추상 메서드 선언
abstract void move(int x, int y);
abstract void stop();
📌 // 1-4) 추상 메서드를 호출하는 인스턴스 메서드 정의
void move() { move(x, y); }
}
// 2) 자손 클래스
class Footballer1 extends Player1 {
📌 // 2-1) 추상 메서드 구현
@Override
void move(int x, int y) { System.out.println("지정 위치로 이동"); }
@Override
void stop() { /* 내용 생략 */ }
}
public class _32_Example {
public static void main(String[] args) {
📌 // 3-1) 객체 생성
Footballer1 f = new Footballer1();
📌 // 3-2) 추상 메서드를 호출하는 인스턴스 메서드 호출
f.move(); // 지정 위치로 이동
}
}
1-1) 멤버 변수 선언 / 1-2) 생성자 정의
•추상 클래스는 일반 클래스와 같이 멤버 변수와 생성자를 가질 수 있음
1-3) 추상 메서드 선언
•메서드의 선언부만 작성한 추상 메서드 move와 stop을 선언함
1-4) 추상 메서드를 호출하는 인스턴스 메서드 정의
•추상 메서드 move가 구현되었다는 가정하에, 이를 호출하는 인스턴스 메서드 move를 정의함
2-1) 추상 메서드 구현 / 3-1) 객체 생성
•추상 클래스인 Player 클래스를 상속받은 Footballer 클래스에서
추상 메서드 move와 stop을 오버라이딩으로 모두 구현해 Footballer 인스턴스를 생성함
3-2) 추상 메서드를 호출하는 인스턴스 메서드 호출
•추상 메서드 move를 호출하는 인스턴스 메서드 move를 호출할 경우,
Player 클래스에 정의된 추상 메서드 move가 아닌 Footballer 클래스에서 구현된 Footballer 인스턴스의 move 메서드가 호출됨
Reference
[남궁성의 정석코딩] Java의 정석 기초편 강의
[도우출판] Java의 정석 기초편 / 기본편