인터페이스는 두 객체를 연결해주는 다리 역할을 한다.
상속 관계가 없는 다른 클래스들이 서로 동일한 메서드를 구현해야할 때 인터페이스는 구현 클래스들의 동일한 사용 방법과 행위를 보장해줄 수 있다.
public interface 인터페이스명 {
}
클래스처럼
public
,default
접근 제어자를 지정할 수 있다.
public static final
이어야 한다.public abstract
이어야 한다.제어자는 생략이 가능하다. 생략할 경우 컴파일러가 자동으로 제어자를 추가해준다.
(걱정할 필요가 없어요 ~!~!)
인터페이스는 추상 클래스와 마찬가지로 직접 인스턴스를 생성할 수 없기 때문에 클래스에 구현되어 생성된다.
즉, 구현체가 있어야한다.
implements
키워드를 사용하여 인터페이스를 구현할 수 있다.
public class 클래스명 implements 인터페이스명 {
@Override
public 리턴타입 메서드이름(매개변수, ...) {
}
}
인터페이스의 추상 메서드는 구현될 때 반드시 오버라이딩 되어야한다.
만약 인터페이스의 추상 메서드를 전부 구현하지 않고 일부만 구현하고 싶다면 해당 클래스를 추상 클래스로 변경해준다.
바꾼 추상 클래스를 다른 클래스가 상속해 오버라이딩하여 구현하도록 한다.
인터페이스 간에도 상속이 가능하다.
인터페이스 간에 상속은 implements
가 아니라 extends
키워드를 사용한다.
implements
extends
인터페이스는 클래스와는 다르게 다중상속이 가능하다 !!!!
public class Main extends D implements C {
@Override
public void a() {
System.out.println("A");
}
@Override
public void b() {
System.out.println("B");
}
@Override
void d() {
super.d();
}
public static void main(String[] args) {
Main main = new Main();
main.a();
main.b();
main.d();
}
}
interface A {
void a();
}
interface B {
void b();
}
interface C extends A, B {
}
class D {
void d() {
System.out.println("D");
}
}
Main
은class D
를 상속 받고,interface C
를implements
하고 있다.
interface C
는interface A
와interface B
를 상속받고 있으므로interface C
는 A가 가지고 있는void a()
, B가 가지고 있는void b()
를 모두 사용할 수 있다.void a()
와void b()
는 오버라이딩 되었기 때문에 결과값은 다음과 같이 나오게 된다.
[OUTPUT]
A
B
D