추상 클래스 (Abstract Class), 추상 메서드 (Abstract Method)
📚 참고
자바의 정석 기초편 (객체지향개념만)
추상 클래스
- 미완성 설계도 (미완성 메서드를 갖고 있는 클래스)
// 추상 클래스 (미완성 클래스)
abstract class Player {
// 추상 메서드 (몸통 {}이 없는 미완성 메서드)
abstract void play(int pos);
abstract void stop();
}
- 다른 클래스 작성에 도움을 주기 위한 것
- 인스턴스 생성 불가
// 🚩에러 ➡ 추상 클래스의 인스턴스 생성 불가
Player p = new Player();
- 상속을 통해 추상 메서드를 완성해야 인스턴스 생성 가능
class AudioPlayer extends Player {
// 추상 메서드 구현
void play(int pos) { /* 내용 생략 */ }
void stop() { /* 내용 생략 */ }
}
AudioPlayer ap = new AudioPlayer(); // 인스턴스 생성 OK
Player ap = new AudioPlayer(); // 인스턴스 생성 OK, 다형성
추상 메서드
- 미완성 메서드
- 구현부(= { }, 몸통)이 없는 메서드
- abstract : 제어자
/* 주석을 통해 어떤 기능을 수행할 목적으로 작성했는지 설명한다. */
abstract 리턴타입 메서드명();
- 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우에 추상 메서드를 사용한다.
- 자손 클래스가 추상 클래스를 상속 받을 때, 추상 메서드는 필수 기능이므로 반드시 구현해야하는 강제성이 있다. (추상 메서드를 구현하지 않으면 미완성 설계도임)
- AbstractPlayer 클래스는 조상 클래스인 Player의 play 메서드 1개만 구현했으므로 미완성 설계도이다. 그러므로 abstract 키워드를 붙여준다.
class AudioPlayer extends Player {
void play(int pos) { /* 내용 생략 */ }
void stop() { /* 내용 생략 */ }
}
abstract class AbstractPlayer extends Player {
void play(int pos) { /* 내용 생략 */ }
}
- 추상 메서드는 호출이 가능하다. (메서드는 선언부만 알면 호출 가능이므로 추상 메서드도 호출 가능)
- 상속을 통해 자손이 추상 메서드를 완성
- 자손 클래스 타입의 객체 생성
- 객체 생성 후, 인스턴스 메서드 호출 가능
abstract class Player {
// iv
boolean pause;
int currentPos;
// 생성자
Player() {
pause = false;
currentPos = 0;
}
// 추상 메서드
abstract void play(int pos);
abstract void stop();
// 인스턴스 메서드
void play() {
// 추상 메서드를 사용할 수 있다.
play(currentPos);
}
}
추상 클래스 작성
- 여러 클래스에 공통적으로 사용될 수 있는 추상 클래스를 작성
- 기존 클래스의 공통 부분을 뽑아서 추상 클래스를 만든다.
- 추상화 (애매) ↔ 구체화 (명확)
- 추상화된 코드는 구체화된 코드보다 유연 (변경에 유리)
// 구체적
GregorianCalendar cal = new GregorianCalendar();
// 추상적
// getInstance()는 Calendar의 자손 객체를 반환
Calendar cal = Calendar.getInstance();
public static Calendar getInstance(Locale aLocale) {
return createCalendar(TimeZone.getDefault(), aLocale);
}
private static Calendar createCalendar(TimeZone zone, Locale aLocale) {
// ...
if (caltype != null) {
switch (caltype) {
case "buddihist": // 불교력
cal = new BuddhistCalendar(zone, aLocale);
break;
case "japanese": // 일본력
cal = new JapaneseImperialCalendar(zone, aLocale);
break;
case "gregory": // 서양력
cal = new GregorianCalendar(zone, aLocale);
break;
}
}
}
'JAVA > 객체지향개념' 카테고리의 다른 글
인터페이스 (Interface) (0) | 2021.03.20 |
---|---|
다형성 (Polymorphism) (0) | 2021.03.19 |
캡슐화💊 (0) | 2021.03.19 |
접근 제어자 (Access Modifier) (0) | 2021.03.18 |
import문, static import문 (0) | 2021.03.18 |
댓글
이 글 공유하기
다른 글
-
인터페이스 (Interface)
인터페이스 (Interface)
2021.03.20 -
다형성 (Polymorphism)
다형성 (Polymorphism)
2021.03.19 -
캡슐화💊
캡슐화💊
2021.03.19 -
접근 제어자 (Access Modifier)
접근 제어자 (Access Modifier)
2021.03.18