
두 객체를 연결해주는 역할
개발코드에서 인터페이스의 메서드를 호출하면, 인터페이스는 객체의 메서드를 호출하고 개발코드에 전달한다.
public interface 인터페이스명 {
// 상수 필드
// 추상 메서드
// 디폴트 메서드
// 정적 메서드
// private 메서드
// private 정적 메서드
}
위에서 선언한 인터페이스는 구현 클래스 객체로부터 메서드를 호출하고, 실행코드에 전달하게 된다.
예를 들어 인터페이스에 추상 메서드 methodA() 가 있다면, 구현 클래스에서 이 메서드를 오버라이드 해야 한다.
/* 인터페이스명.java */
public interface 인터페이스명 {
// 추상 메서드 선언
public void methodA();
}
/* 구현클래스명.java */
public class 구현클래스명 implements 인터페이스명 {
@Override
public void methodA() {
// 실행 내용
}
}
인터페이스 추상메서드 선언 시 실행부분은 생략한다.
인터페이스도 하나의 타입이므로 변수의 타입으로 사용할 수 있다.
인터페이스 InterfaceName 와 구현 클래스 ImplementClass 이 있을 때,
인터페이스 타입 변수를 선언하고 여기에 구현 클래스를 대입한다.
InterfaceName inter = new ImplementClass();
인터페이스 변수를 통해 인터페이스의 메서드를 호출한다.
inter.methodA();
구현 클래스가 여러개고, 구현 클래스마다 메서드를 다르게 재정의했을 경우
인터페이스 변수에 대입된 구현 클래스를 교체할 수 있다.
InterfaceName inter;
inter = new ImplementClassA();
inter.methodA(); // ImplementClassA 에서 재정의한 메서드 실행
inter = new ImplementClassB();
inter.methodA(); // ImplementClassB 에서 재정의한 메서드 실행
클래스에서 배운 static final 상수 필드와 마찬가지로 인터페이스에서도 상수 필드를 가질 수 있다.
인터페이스에서 선언된 필드는 모두 상수이므로, public static final 는 생략이 가능하다.
상수명은 대문자와 언더바로 작성한다.
public interface 인터페이스명 {
int MAX_SPEED = 10;
}
인터페이스 상수는 구현 클래스와 관련이 없는 인터페이스 소속 멤버이므로, 구현 클래스를 생성하지 않고 인터페이스로 바로 접근하면 된다.
public class 실행코드 {
public static void main(String[] args) {
System.out.println(인터페이스명.MAX_SPEED);
}
}
public abstract 는 생략 가능하다.
실행부 블록 없이 선언부만 작성할 수 있다.
public interface 인터페이스명 {
void methodA();
void methodB(int x);
}
구현 클래스에서 이 추상 메서드를 override 한다.
추상 메서드 사용 시 인터페이스 변수에 구현 클래스를 생성해서 대입하고, 이 인터페이스 변수를 통해 호출한다.
실행 코드를 가진 메서드를 선언할 수 있다.
선언부 앞에 default 를 붙여서 선언한다.
디폴트 메서드는 상수 필드를 읽거나, 추상 메서드를 호출할 수 있다.
public interface 인터페이스명 {
default void methodA() { ... }
}
디폴트 메서드 역시 구현 클래스가 필요하고, 추상 메서드와 마찬가지로 인터페이스 변수를 통해 호출한다.
디폴트 메서드도 구현 클래스에서 override 할 수 있다.
override 시에는 default 키워드를 생략하고, public 접근 제한자를 반드시 붙여야 한다.
public class 구현클래스 implements 인터페이스명 {
@Override
public void methodA() { ... }
}
디폴트 메서드 사용 방법은 추상 메서드와 동일하다.
인터페이스에 정적 메서드도 선언할 수 있다.
정적 메서드는 구현 클래스 없이 인터페이스만으로 호출할 수 있다.
클래스 정적메서드 선언 방법과 동일하고, 접근 제한자 public 이 자동으로 붙는다.
public interface 인터페이스명 {
static void methodA(...) { ... }
}
정적 메서드의 실행 블럭에는 상수 필드와 private static 메서드를 호출할 수 있고, 추상 / 디폴트 / private 메서드를 호출할 수 없다.
정적 메서드 사용 시 인터페이스명으로 접근해서 호출한다.
인터페이스명.methodA();
인터페이스 내부에서만 호출할 수 있
는 private 메서드를 선언할 수 있다.
| 메서드 | 특징 |
|---|---|
private | 구현 클래스 필요 디폴트 메서드에서만 호출 가능 |
private static | 구현 클래스 필요X 디폴트 메서드와 정적 메서드에서 호출 가능 |
private 메서드를 이용해 디폴트 메서드나 정적 메서드 안에서 중복 코드를 줄일 수 있다.
구현 클래스는 여러개의 인터페이스를 implements 할 수 있다.

public class 구현클래스명 implements 인터페이스A, 인터페이스B {
// 추상 메서드 재정의
}
구현 객체가 어떤 인터페이스 타입을 가지는지에 따라, 호출할 수 있는 추상 메서드가 결정된다.
인터페이스A a = new 구현클래스명(); // 인터페이스A가 가지는 추상메서드 호출 가능
인터페이스B b = new 구현클래스명(); // 인터페이스B가 가지는 추상메서드 호출 가능