[작성일: 2023. 01. 29]
목차
추상 클래스(abstract class)
- 미완성 설계도(부족한 부분이 있음.)
- 미완성 메서드를 갖고 있는 클래스
- 클래스 앞에 abstract를 붙여줘야 함. (추상 메서드가 존재한다고 추론 가능)
- 다른 클래스 작성에 도움을 주기 위한 것. 인스턴스 생성 불가.
- 코드의 관리에 용이함.
- 상속을 받으며 추상클래스가 구체적이게 됨. (단계별로 관리 가능)
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(); // 인스턴스 생성 가능
Player p = new AudioPlayer(); // 다형성도 가능
추상 메서드(abstract method)
- 미완성 메서드
- 구현부(몸통, {})가 없는 메서드
/* 주석을 통해 어떤 기능을 수행할 목적으로 작성했는지 설명하기*/
abstract(제어자) 리턴타입 메서드이름(); // 추상메서드, 몸통{} 없음.
- 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우 사용함.
abstract class player { // 추상클래스
abstract void play(int pos); // 추상메서드
abstract void stop(); // 추상메서드
}
class AudioPlayer extends Player {
void play(int pos) { /*내용 생략*/ } // 추상메서드 구현
void stop() { /*내용 생략*/ } // 추상메서드 구현
} // 완전한 클래스가 됨.
abstract class AbstractPlayer extedns Player {
void play(int pos) { /*내용 생략*/ } // 추상메서드 구현
} // 한 개만 구현했으므로 아직 추상클래스, 추상메서드임.
// 두 개를 상속받았기 때문에 두 개 다 구현해야 완성 클래스가 됨.
// abstract 쓰지 않으면 에러.
- 추상 메서드 호출 가능(호출할 때는 선언부만 필요함.)
abstract class Player {
boolean pause;
int currentPos;
Player() { // 추상 클래스도 생성자는 있어야 함.
pause = false;
curruntPos = 0;
}
/* 지정된 위치(pos)에서 재생을 시작하는 기능이 수행하도록 작성되어야 함. */
abstract void play(int pos); // 추상 메서드1
/* 재생을 즉시 멈추는 기능을 수행하도록 작성되어야 함. */
abstract void stop(); // 추상 메서드2
void play() { // 인스턴스 메서드
play(currentPos); // 추상메서드 사용 가능
} // 메서드는 선언부만 알면 호출가능하므로 추상메서드도 호출 가능!
// 상속을 통해 자손이 완성된 후에 자손이 객체생성 되면 호출됨.
추상 클래스 작성
- 여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나 기존 클래스의 공통부분을 뽑아서 추상 클래스를 만듦.
public class Ex7_10 {
public static void main(String[] args) {
Unit[] group = new Unit[3];
group[0] = new Marine();
group[1] = new Tank();
group[2] = new Dropship();
for(int i=0; i<group.length; i++) {
group[i].move(100,200); // 추상메서드 호출이 아닌 구현된 메서드가 호출됨.
}
}
class Marine {
int x, y;
void move(int x, int y) { /*지정된 위치로 이동*/ }
void stop() { /*현재 위치에 정지*/ }
void stimpack() { /*스팀팩 사용*/ }
}
class Tank {
int x, y;
void move(int x, int y) { /*지정된 위치로 이동*/ }
void stop() { /*현재 위치에 정지*/ }
void changeMode() { /*공격모드 변환*/ }
}
class Dropship {
int x, y;
void move(int x, int y) { /*지정된 위치로 이동*/ }
void stop() { /*현재 위치에 정지*/ }
void load() { /*선택된 대상을 태움*/ }
void unload() { /*선택된 대상을 내림*/ }
}
// 위의 메서드 중에서 공통 부분을 뽑아 추상클래스로 만들면 코드가 간결해짐
abstract class Unit { // 공통부분을 Unit이라는 추상클래스로 묶음.
int x, y;
abstract void move(int x, int y);
void stop() { /*현재 위치에 정지*/
}
class Marine extends Unit {
void move(int x, int y) { /*지정된 위치로 이동*/ }
void stimpack() { /*스팀팩 사용*/ }
}
class Tank extends Unit {
void move(int x, int y) { /*지정된 위치로 이동*/ }
void changeMode() { /*공격모드 변환*/ }
}
class Dropship extends Unit {
void move(int x, int y) { /*지정된 위치로 이동*/ }
void load() { /*선택된 대상을 태움*/ }
void unload() { /*선택된 대상을 내림*/ }
}
- 추상화(불명확) ↔️ 구체화(명확, 구체적)
- 추상화된 코드는 구체화된 코드보다 유연하며 변경에 유리함.
GregorianCalendar cal = new GregorianCalendar(); // 구체적
Calendar cal = Calendar.getInstance(); // 추상적, Calendar 자손 객체를 반환
public static Calendar getInstance(Locale aLocale) {
return createCalendar(TimeZone.getDefault(), aLocale);
}
🐣 해당 게시글은 자바의 정석(남궁성 님) 영상으로 함께 공부하며 요약/정리한 글입니다.
🐣 입문 개발자가 작성한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.