추상 클래스
미완성 설계도. 미완성 클래스.
멤버의 개수에 관계된 것이 아니라 단지 미완성 메서드(추상 메서드)를 포함하고 있다는 의미이다.
미완성 설계도로 완성된 제품을 만들 수 없듯, 추상 클래스로 인스턴스를 생성할 수 없다.
추상 클래스는 상속을 통해.. 자손 클래스에 의해서만 비로소 "완성"될 수 있다.
- 클래스로서의 역할을 할 수없음.
- 새로운 클래스를 작성하는 데 있어서 바탕이 되는 조상 클래스로서 의미를 갖는다.
- 아무 것도 없는 상태에서 시작하는 것보단.. 완전하지 않더라도 어느정도 틀이 존재하는 상태에서 시작하는 것이 乃
abstract class 클래스이름 {
....
}
추상 메서드
[ 메서드 = 선언부 + 구현부 ]
선언부만 작성하고 구현부는 작성하지 않은 채로 남겨둔 것이 추상메서드이다.
- 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 조상클래스에서 선언부만을 작성하고, 주석을 덧붙여 어떤 기능을 수행할 목적으로 작성되었는지 알려준다.
- 실제 내용은 상속받는 클래스에서 구현하도록 함.
/* 어떤 기능을 수행할 목적으로 작성하였는지 주석 통해 설명함. */
abstract 리턴타입 메서드이름 {
....
}
추상클래스를 상속받는 자손클래스는 "오버라이딩" 을 통해 추상클래스의 추상메서드를 모두 구현해주어야 함.
조상으로부터 상속받은 추상메서드 중 하나라도 구현하지 않으면.. 자손 클래스 역시도 추상 클래스로 지정해주어야 한다.
abstact class Player{
abstarct void play(int pos);
abstact void stop();
}
class AudioPlayer extends Player {
void play(int pos) { .... }
void stop() { .... }
}
abstract class AbstractPlayer extneds Player{
void play(int pos) { ... }
} //stop() 이라는 추상메서드 구현하지 않아서 해당 자손 클래스도 "추상클래스"이다.
추상 클래스 작성 ?
1) 여러 클래스에 공통적으로 사용될 수 있는 클래스를 작성
2) 기존의 클래스의 공통적인 부분을 뽑아서 추상클래스로 만들어 상속하도록 함
상속: 자손 클래스를 만드는데 조상 클래스를 사용하는 것
추상화: 기존의 클래스의 공통부분을 뽑아서 조상 클래스를 만드는 것.
- 상속계층도를 따라 내려갈수록 클래스는 점점 기능이 추가되어 구체와의 정도가 심해진다. (세분화)
- 상속계층도를 따라 올라갈수록 클래스는 추상화의 정도가 심해진다. (공통요소만 남는다)
abstract class Unit {
int x,y;
abstract void move(int x, int y); // 추상메서드
void stop() { /* 현재 위치에 정지 */ }
}
class Marine extends Unit{ //보병
void move(int x ,int y) {
System.out.println("Marine[x=" + x + ", y=" + y + "]");
}
void stimPack() {/* 스팀팩을 사용한다. */}
}
class Tank extends Unit{ //탱크
void move(int x ,int y) {
System.out.println("Tank[x=" + x + ", y=" + y + "]");
}
void changeMode() {/* 공격모드 변환. */}
}
class Dropship extends Unit{ //수송선
void move(int x ,int y) {
System.out.println("Dropship[x=" + x + ", y=" + y + "]");
}
void load() {/* 선택한 대상을 태운다. */}
void unload() { /* 선택한 대상을 내린다. */ }
}
public class Ex7_10 {
public static void main(String[] args) {
Unit[] group = {new Marine(), new Tank(), new Dropship()};
for (int i = 0; i<group.length; i++) {
group[i].move(100, 200);
// 해당 부분만 봐서는 Unit 클래스의 move를 호출한 것 같지만 아니다.
// 완성된 move를 호출한다. 즉, 인스턴스들의 move 메서드가 호출되는 것. (당연함)
}
}
}
공통조상인 Unit클래스 타입의 객체배열을 통해 서로 다른 종류의 인스턴스를 하나의 묶음으로 다룰 수 있다는 것을 보여주기 위함이다.
다형성에서 배웠듯, 조상 타입의 참조변수로 자손 타입의 인스턴스를 참조하는 것이 가능하기 때문.
그리고 코드 내 주석으로 적어놨듯, group[i].move(100,200)이 Unit 클래스의 move 메서드를 호출하는 것으로 보이지만... 실제로는 이 추상메서드가 구현된 Marine, Tank, Dropship 인스턴스의 메서드가 호출되는 것이다.
모든 클래스의 조상인 Object 클래스 타입의 배열로도 서로 다른 종류의 인스턴스를 하나의 묶음으로 다룰 수 있지만.. Object 클래스에는 move 메서드가 정의되어있지 않음.
move 메서드 호출 부분에서 에러가 발생한다.
'프로그래밍 > java' 카테고리의 다른 글
[JAVA] default 메서드, static 메서드, 내부클래스, 익명클래스 (0) | 2022.09.03 |
---|---|
[JAVA] 인터페이스, 상속, 구현 (0) | 2022.08.31 |
[JAVA] 매개변수의 다형성, 객체 배열과 벡터 (0) | 2022.08.31 |
[JAVA] 참조변수의 형변환 (0) | 2022.08.29 |
[JAVA] 다형성(polymorphism) (0) | 2022.08.28 |