인터페이스(Interface)는 일종의 설계도.
어떤 클래스가 꼭 가져야 할 기능의 틀만 정의하고, 실제 동작은 구현하지 않는다.
public interface Animal {
void sound(); // 메서드 시그니처만 정의
}
위 코드에서 sound() 메서드는 구현이 없는 껍데기.
이 인터페이스를 구현한 클래스는 반드시 sound() 메서드를 정의해야 한다.
예시
// 인터페이스 정의
public interface Animal {
void sound();
}
// 인터페이스 구현
public class Dog implements Animal {
@Override
public void sound() {
System.out.println("멍멍!");
}
}
public class Cat implements Animal {
@Override
public void sound() {
System.out.println("야옹~");
}
}
// 사용
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
dog.sound(); // 출력: 멍멍!
cat.sound(); // 출력: 야옹~
}
}
Dog와 Cat 클래스는 Animal 인터페이스를 implements해서 구현했다.
Animal 타입으로 객체를 다룰 수 있어 다형성(Polymorphism)을 활용할 수 있다.
| 특징 | 설명 |
|---|---|
| 메서드는 기본적으로 추상 메서드 | public abstract가 생략되어 있음 |
| 다중 구현 가능 | 클래스는 여러 인터페이스를 implements할 수 있음 |
필드는 public static final 상수만 허용 | 인터페이스 안의 변수는 상수로만 존재 |
자바 8 이후에는 default와 static 메서드도 허용됨 | 일부 구현을 제공할 수 있음 |
public interface MyInterface {
void method(); // 추상 메서드
default void defaultMethod() {
System.out.println("디폴트 메서드입니다.");
}
static void staticMethod() {
System.out.println("정적 메서드입니다.");
}
}
기능만 정의하고 구현은 나중에 맡기고 싶을 때
여러 클래스에서 같은 행동을 강제하고 싶을 때
유지보수나 확장성을 고려한 설계가 필요할 때
다형성을 활용해 코드를 유연하게 만들고 싶을 때
| 항목 | 인터페이스 | 추상 클래스 |
|---|---|---|
| 키워드 | interface | abstract class |
| 다중 상속 | 가능 | 불가능 |
| 변수 | public static final 상수만 가능 | 일반 변수도 사용 가능 |
| 메서드 구현 | 불가 (default/static만 가능) | 일부 구현 가능 |
| 목적 | 동작의 약속(규칙) | 공통 기능의 재사용 |
인터페이스는 기능의 틀을 제공하는 설계도이다.
클래스를 설계할 때 인터페이스를 활용하면 유지보수, 확장성, 다형성에서 큰 이점을 얻을 수 있다.
자바의 인터페이스는 객체지향 설계의 핵심 도구다.