인터페이스란 일종의 추상 클래스이다
추상클래스보다 추상화 정도가 높다.
추상 클래스와 다르게 오직 상수와 추상 메서드만 멤버로 가질 수 있다
추상클래스가 부분적으로 완성된 미완성 설계도라면 인터페이스는 구현된 것은 없고 밑그림만 그려져 있는 기본 설계도라 할 수 있다
인터페이스 선언하기
interface 인터페이스 이름{
public static final 상수이름 = 값;
public abstract 메서드이름(매개변수);
}
인터페이스 멤버들은 제약사항이 있다
인터페이스는 클래스와 다르게 다중상속이 가능
interface Moveable{
void move(int x, int y);
}
interface Attackable{
void attack(Unit u);
}
interface Fightable extends Movable, Attackable{}
인터페이스도 추상클래스처럼 그 자체로 인스턴스를 생성할 수 없으며 인터페이스도 자신에 정의된 추상메서드의 몸통을 만들어주는 클래스를 작성해야 하는데 추상클래스와 다른점은 extends가 아니라 implements를 사용한다
abstract class Fighter implements Fightable{
public void move(int x, int y)
}
class Fighter extends Unit implements Fightable{
public void move(int x, int y){}
public void attack(Unit u){}
}
다중상속은 장점도 있지만 단점이 더 크다고 판단해서 자바에서는 다중상속을 허용하지 않는다. 인터페이스를 이용하면 다중 상속이 가능하지만 인터페이스로 다중상속을 구현하는 경우는 거의 없다.
자바에서는 한쪽만 상속을 받고 나머지 한 쪽은 클래스 내에 포함시켜 내부적으로 인스턴스를 생성해서 사용한다
public class Tv{
protected boolean power;
protected int channel;
protected int volume;
public void power(){//생략}
public void channelUp(){//생략}
public void channelDown(){}
public void volumeUp(){}
public void volumeDown(){}
}
public class VCR{
protected int counter;
public void play(){}
public void stop(){}
public void reset(){}
public int getCounter(){}
public void setCounter(){}
}
public interface IVCR(){
void play();
void stop();
viud reset();
int getCounter();
void setCounter();
}
IVCR 인터페이스를 구현하고 Tv클래스로부터 상속받는 TVCR클래스를 작성한다. 이때 VCR클래스 타입의 참조변수를 멤버변수로 선언하고 IVCR 인터페이스의 추상메서드를 구현하는데 사용한다.
public class TVCR extends Tv implements IVCR{
VCR vcr = new VCR();
public void play(){
vcr.play()
}
...이하생략
개발시간 단축
표준화 가능
서로 관계없는 클래스들에게 관계 맺어줌
독립적인 프로그래밍 가능
이 두 내용을 기억하자

클래스 A 클래스 B가 있다
클래스 A는 클래스 B의 인스턴스를 생서하고 메서드를 호출한다
이 경우 B가 이미 작성되어있어야 한다
또 B의 메서드가 변경되면 A도 변경되어야 한다.
-> 한쪽이 변경되면 다른쪽도 변경되어야 한다는 단점
만약 A가 B를 직접 호출하지 않고 인터페이스를 매개체로 해서 B의 메서드에 접근한다면 B에 변경사항이 있어도 A는 영향받지 않는다.
interface I{
void methodB();
}
class B implements I{
public void methodB(){
//생략
}
}
이렇게 하면 A에서는 B를 사용하지 않고 메서드를 호출할 수 있다.