인터페이스는 자바에서 추상 메서드(구현이 없는 메서드)와 상수만을 가지는 특별한 클래스이다. 인터페이스는 객체 지향 프로그래밍에서 다형성을 극대화하고, 구현 클래스들이 동일한 동작을 수행하도록 강제하는 역할을 한다.
public과 abstract로 정의된다.public static final 상수로 선언되며, 값이 변경되지 않는다.implements 키워드를 통해 구현 클래스에서 구현된다.public interface 인터페이스명 {
// 상수 선언
타입 상수명 = 값;
// 추상 메서드 선언
타입 메서드명(매개변수);
// 디폴트 메서드 (선택적)
default 타입 메서드명(매개변수) {
// 기본 구현
}
// 정적 메서드 (선택적)
static 타입 메서드명(매개변수) {
// 구현
}
}
interface InterA {
// 상수 선언
public static final String STR1 = "홍길동";
String STR2 = "박문수"; // public static final 생략 가능
// 추상 메서드 선언
void methodA(); // public abstract 생략 가능
void methodB(); // 생략 가능
}
abstract class ClassA implements InterA {
public void methodA() {
System.out.println("methodA 호출");
}
}
class ClassAA extends ClassA {
public void methodB() {
System.out.println("methodB 호출");
}
}
public class InterfaceMainEx01 {
public static void main(String[] args) {
ClassAA aa = new ClassAA();
aa.methodA(); // "methodA 호출"
aa.methodB(); // "methodB 호출"
}
}
기본 구현을 제공하는 메서드로, 인터페이스를 구현하는 클래스에서 선택적으로 오버라이딩할 수 있다. 즉, 기본적으로는 인터페이스에서 제공된 구현을 사용하되, 필요에 따라 구현 클래스에서 변경할 수 있다.
interface InterA {
void methodA();
// 디폴트 메서드
default void methodB() {
System.out.println("methodB 호출");
}
}
class ClassA implements InterA {
public void methodA() {
System.out.println("methodA 호출");
}
}
public class InterfaceMainEx05 {
public static void main(String[] args) {
ClassA a = new ClassA();
a.methodA(); // "methodA 호출"
a.methodB(); // "methodB 호출" (기본 구현 사용)
}
}
interface InterA {
void method1();
// 디폴트 메서드
default void method2() {
System.out.println("method2 호출");
}
}
class ClassA implements InterA {
public void method1() {
System.out.println("ClassA method1 호출");
}
// 디폴트 메서드 오버라이딩
public void method2() {
System.out.println("ClassA method2 오버라이딩 호출");
}
}
class ClassB implements InterA {
public void method1() {
System.out.println("ClassB method1 호출");
}
}
public class InterfaceMainEx06 {
public static void main(String[] args) {
ClassA a = new ClassA();
ClassB b = new ClassB();
a.method1(); // "ClassA method1 호출"
a.method2(); // "ClassA method2 오버라이딩 호출"
b.method1(); // "ClassB method1 호출"
b.method2(); // "method2 호출" (기본 구현 사용)
}
}
| 특징 | 인터페이스(Interface) | 추상 클래스(Abstract Class) |
|---|---|---|
| 메서드 구현 여부 | 모든 메서드는 기본적으로 구현이 없음 (단, Java 8 이후 default 메서드 가능) | 일부 메서드는 구현될 수 있음 |
| 다중 상속 여부 | 여러 인터페이스를 동시에 구현 가능 | 단일 클래스만 상속 가능 |
| 필드 | 상수만 선언 가능 (public static final 자동 적용) | 인스턴스 필드와 상수 선언 가능 |
| 목적 | 클래스 간 공통된 행위 규약 정의 | 클래스 간의 공통된 동작과 상태 정의 |