- 자바의 정석 (기본편)을 참고했습니다.
- 복습을 위한 게시글입니다.
- 소스에 오타가 있을 수 있습니다. ^^;;
추상 클래스란 ?
기존의 클래스를 설계도에 비유했는데, 추상 클래스는 미완성 설계도에 비유할 수 있다.
여기서 미완성이라는 것은 멤버의 개수에 관계된 것이 아닌, 미완성 메서드(추상 메서드) 를 포함하고 있다는 의미이다.
추상 클래스는 클래스 이름 앞에 'abstract'를 적어주기만 하면 된다.
미완성 설계도인 추상 클래스는 인스턴스를 생성할 수 없으며, 상속을 통해 자손클래스에 의해 완성된다.
추상 클래스를 사용하는 이유
추상 클래스는 새롭게 클래스를 작성하는데 있어 틀을 잡을 수 있는 조상 클래스로서의 중요한 의미를 갖는다.
즉, 미완성 설계도를 만들어놓고 이것을 이용해 각각의 비슷한 설계도를 완성하는 것에 사용된다.
추상 클래스 예제 코드
public class Ex7_10 {
public static void main(String args[]) {
Unit[] group = { new Marine(), new Tank(), new Dropship() };
/* group[0] = new Marine();
* group[1] = new Tank();
* group[2] = new Dropship();
*/
for(int i=0; i<group.length; i++) {
// Unit의 move 메서드가 실행되는게 아닌 이 추상메서드가 구현된 클래스들의 move()가 실행된다.
group[i].move(100,200);
}
Marine m = new Marine();
m.stimPack();
Tank t = new Tank();
t.changeMode();
Dropship d = new Dropship();
d.load();
d.unload();
}
}
abstract class Unit {
int x,y;
abstract void move(int x, int y);
void stop() {
System.out.println("정지하세요.");
}
}
class Marine extends Unit {
void move(int x, int y) {
System.out.println("x="+x+",y="+y);
}
void stimPack() {
System.out.println("스팀팩을 사용하세요.");
}
}
class Tank extends Unit {
void move(int x, int y) {
System.out.println("x="+x+",y="+y);
}
void changeMode() {
System.out.println("모드를 바꿉니다.");
}
}
class Dropship extends Unit {
void move(int x, int y) {
System.out.println("x="+x+",y="+y);
}
void load() {
System.out.println("대상을 태웁니다.");
}
void unload() {
System.out.println("대상을 내립니다.");
}
}
/*
결과
x=100,y=200
x=100,y=200
x=100,y=200
스팀팩을 사용하세요.
모드를 바꿉니다.
대상을 태웁니다.
대상을 내립니다.
*/
추상 메서드란 ?
메서드의 선언부와 구현부 중 선언부만 작성하고 구현부를 작성하지 않은 채로 남겨둔 메서드를 뜻한다.
메서드의 구현부는 상속받는 클래스에 따라 달라질 수 있기 때문에 실제 구현부는 자손 클래스에 맞게 바뀔 수 있도록 구현부를 작성하지 않는 것이다.
추상 메서드 역시 'abstract'를 적어주고 구현부가 없으므로 중괄호{} 대신 세미콜론 ; 을 적어준다.
구현부는 상속받은 자손 클래스에서 전부 구현해야 하고, 하나라도 구현하지 않는다면 자손 클래스 역시 추상클래스로
정의해야 한다.
추상 메서드 예제 코드
// 추상 클래스
abstract class Player {
// 추상 메서드 선언 / 세미콜론 사용
abstract void play(int pos);
abstract void stop();
}
class AudioPlayer extends Player {
// 추상 메서드를 구현한다.
void play(int pos) {
/* 내용 생략 */
}
void stop() {
/* 내용 생략 */
}
}
// 추상 클래스 Player를 상속받고 있지만, 하나의 추상 메서드를 구현하고 있지 않으므로 abstract를 붙여준다.
abstract class AbstractPlayer extends Player {
// 추상 메서드를 구현한다.
void play(int pos) {
/* 내용 생략 */
}
}
'JAVA' 카테고리의 다른 글
[JAVA 복습] 인터페이스(Interface) (0) | 2021.09.03 |
---|---|
[JAVA 복습] 다형성(Ploymorphism) (0) | 2021.09.02 |
[JAVA 복습] 캡슐화와 접근 제어자 (0) | 2021.09.02 |
[JAVA 복습] 참조변수 super와 조상의 생성자 super() (0) | 2021.09.02 |
[JAVA 복습] 상속에 대해 (0) | 2021.09.02 |