인터페이스는 자바에서 추상 메서드(구현이 없는 메서드)와 상수만을 가지는 특별한 클래스이다. 인터페이스는 객체 지향 프로그래밍에서 다형성을 극대화하고, 구현 클래스들이 동일한 동작을 수행하도록 강제하는 역할을 한다.
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 자동 적용) | 인스턴스 필드와 상수 선언 가능 |
목적 | 클래스 간 공통된 행위 규약 정의 | 클래스 간의 공통된 동작과 상태 정의 |