abstract class Player { // 추상 클래스(미완성 클래스)
boolean pause;
int currenPos;
Player() { // 추상 클래스도 생성자가 있어야 한다.
pause = false;
currentPost = 0;
}
abstract void play(int pos); // 추상 메서드(몸통{}이 없는 미완성 메서드)
abstract void stop(); // 추상 메서드
}
Player p = new Player(); // Error! 인스턴스 생성 불가
class AudioPlayer extends Player {
void play(int pos) { /* 내용생략 */ } // 추상 메서드를 구현
void stop() { /* 내용생략 */ } // 추상 메서드를 구현
}
AudioPlayer ap = new AudioPlayer(); //OK.
/* 주석을 통해 어떤 기능을 수행할 목적으로 작성했는지 설명한다 */
abstract 리턴타입 메서드이름();
아래와 같이 공통되는 부분을 추상 클래스로 만들어서 상속과 다형성을 활용하면 코드가 훨씬 간결해질 수 있다.
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() { /* 선택된 대상을 내린다. */ }
}
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);
}
핵심!
추상 메서드의 집합추상클래스와 인터페이스의 차이점
- 추상클래스: 일반 클래스인데, 추상 메서드를 가지고 있음.
- 인터페이스: 추상 메서드 외에는 가질 수 없음
💡 JDK 1.8 부터는 인터페이스에 default 메소드, static 메소드를 추가할 수 있게 되었다.
해결!
디폴트 메서드!💡 디폴트 메서드가 기존의 메서드와 충돌할 때의 해결 책
1. 여러 인터페이스의 디폴트 메서드 간 충돌: 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩
2. 디폴트 메서드와 조상 클래스의 메서드 간 충돌: 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.
class 클래스이름 implements 인터페이스이름 {
//인터페이스에 정의된 추상메서드를 모두 구현해야함
}
일부만 구현하는 경우 클래스 앞에 abstract를 붙여야 함.
갑 자바가 필요해져서 다시보는중 ㅎㅎ 정리감사영