추상 클래스는 미완성 설계도에 비유할 수 있다. 단어 그대로 완성되지 않고 남겨진 설계도란 것이다. 이러한 추상 클래스는 다른 클래스 작성에 도움을 주는 역할을 수행한다.
abstract class Player { // 추상 클래스
abstract void play(); //추상 메서드
abstract void stop(); //추상 메서드
}
class AudioPlayer extends Player{
void play(){
/* contents no*/
}
void stop() {
/* contents no*/
}
}
abstract class AbstractPlayer extends Player {
//일부 추상 메서드만 구현시 class 앞에 반드시 abstract 붙이기!
void play(int pos){/* contents no*/ }
}
추상 클래스는 클래스들 중 공통적인 부분만을 뽑아 묶은 후 만들기도 하는 데 이를 통해 코드의 유연함과 확장성을 가질 수 있게 된다.
인터페이스는 두 대상(객체) 간의 연결, 대화, 소통을 돕는 중간역할을 한다. 선언과 구현을 분리하기 때문에 변경에 유리하게 된다.
인터페이스는 일종의 추상클래스이다. 하지만 추상클래스(미완성 설계도)보다 추상화 정도가 높다.
interface 인터페이스이름{
public static final 상수; //없더라도 public static final 자동으로 붙게됨
public abstract 메서드이름(매개변수); /public abstract 자동으로 붙게 됨
class 클래스이름 implements{
//인터페이스에서 정의된 추상메서드를 구현해야 됨
}
인터페이스 타입의 변수로 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다.
interface Fightable{
void move(int x, int y);
void attack();
}
class Fight implements Fightable{
public void move(int x, int y){}
public void attack(){}
}
class Main{
public static void main(String[] args) {
Fightable f = new Fight();
}
}
인터페이스를 메서드의 매개변수 타입으로 지정할 수 있다.(인터페이스를 구현한 클래스의 인스턴스를 매개변수로 받는 것이다.)
void attack(Fightable f){
}
인터페이스를 메서드의 리턴타입으로 지정할 수 있다.(호출한 곳 타입 같거나 변환 가능한 것으로)
Fightable method(){ // 다형성으로 인해 가능한 것
//인터페이스를 구현한 클래스의 인스턴스를 반환
return new Fight();
}
참고문헌
자바의 정석
의존 관계를 통해 변경이 용이하게 된다. 다음 인터페이스를 이용하는 관계에서는 A가 인터페이스와 관계를 맺고 있기 때문에 손쉽게 C로 변경이 가능하다.
참고문헌
자바의 정석 기초편