객체지향프로그래밍의 중요한 특성 중 하나인데,
구현체 클래스들이 필수로 구현해야 하는 추상 자료형이다. 즉, 객체의 사용 방법을 가이드라인한 것이라고 할 수 있다.
상수와 추상 메소드로만 이루어져 있고, 구현된 코드가 없기 때문에 인터페이스로 인스턴스도 사용할 수 없다.
인터페이스에서는 어떤 메소드들이 있어야 하는지 선언만 하고, 실제 메소드의 구현은 구현 클래스에서 이루어진다.
다중 상속 가능 : 인터페이스는 구현된 메소드가 없이 껍데기만 존재하여, 클래스 상속 시 발생했던 모호함이 없다.
추상 메소드와 상수만 사용 가능 : 인터페이스에서는 구현 소스를 만들 수 없다.
생성자 사용 불가 : 인터페이스 객체가 아니므로 생성자를 사용할 수 없다.
메소드 오버라이딩 필수 : 구현체는 인터페이스의 추상 메소드를 모두 오버라이딩해야 한다.
interface 인터페이스이름 {
타입 상수명 = 값; //상수
타입 메소드명(); //추상메소드
}
사용 예시이다.
interface RemoteControl {
//상수
int MAX_VOLUME = 10;
int MIN_VOLUME = 0;
//추상메소드
void turnOn();
void turnOff();
}
여기서 상수 필드는 public static final이 생략되어있다.
지금까지 인터페이스의 개념과 사용법에 대해 알아보았다. 그렇다면 인터페이스는 왜 사용하는 걸까?
(= 개발 코드가 직접 객체의 메소드를 호출하면 되는데, 중간에 왜 인터페이스를 둘까?)
코드를 수정하지 않고 사용하는 구현 객체를 손쉽고 빠르게 변경할 수 있기 때문이다.
클래스는 이미 구현된 메소드가 있을 수 있기 때문에 다중 상속이 불가능하지만,
인터페이스는 선언만 할 뿐 구현된 메소드가 없기 때문에 오버라이딩해서 쓰면 돼서 메소드를 얼마든 상속 받아도 아무런 문제가 발생하지 않는다.