인터페이스는 객체지향 프로그래밍에서 클래스가 따라야 할 규격을 정의하는 것으로, 추상 메서드와 상수만 포함할 수 있다. 인터페이스를 구현하는 클래스는 인터페이스에서 정의된 모든 메서드를 반드시 구현해야 한다.
추상 메서드만 선언 가능 (Java 8 이전)
메서드는 구현 없이 선언만 가능하다.
final 을 붙이면 오버라이드가 안된다!!
public interface Example {
void methodA(); // 추상 메서드
}
Java 8 이후 추가 기능
Java 9 이후
다중 상속 지원
클래스는 단일 상속만 가능하지만, 인터페이스는 다중 구현이 가능하다.
필드는 자동으로 public static final
인터페이스에 선언된 모든 변수는 상수로 취급된다.
```java
int CONSTANT = 10; // public static final int CONSTANT = 10;
```
final 을 붙이면 오버라이드가 안된다!!
접근 제한자는 public이 다 생략 되어 있다
public interface MyInterface {
// 상수: public static final이 자동으로 적용됩니다 (생략됨).
// 오버라이드 불가 (상수는 재정의할 수 없음).
// 상수필드는 생성자가 존재하지 않아 선언과 동시에 초기화 해야한다.
int CONSTANT = 100; // public static final int CONSTANT = 100;
// 추상 메서드: public abstract가 자동으로 적용됩니다 (생략됨).
// 오버라이드 가능 (구현 클래스에서 반드시 재정의해야 함).
void abstractMethod(); // public abstract void abstractMethod();
// 디폴트 메서드: public이 자동으로 적용됩니다 (생략됨).
// 오버라이드 가능 (구현 클래스에서 재정의할 수 있음).
default void defaultMethod() {
System.out.println("디폴트 메서드입니다.");
}
// 정적 메서드: public이 자동으로 적용됩니다 (생략됨).
// 오버라이드 불가 (정적 메서드는 클래스/인터페이스에 속하며 재정의할 수 없음).
//정적 메서드는 본질적으로 오버라이드가 불가능하기 때문에, 굳이 final을 붙일 필요가 없습니다.
static void staticMethod() {
System.out.println("정적 메서드입니다.");
}
}
class MyClass implements MyInterface {
@Override
public void abstractMethod() {
System.out.println("추상 메서드를 구현했습니다.");
}
}
public class Main {
public static void main(String[] args) {
MyClass myClass = new MyClass();
myClass.abstractMethod(); // 추상 메서드 구현 호출
myClass.defaultMethod(); // 디폴트 메서드 호출
MyInterface.staticMethod(); // 정적 메서드 호출
}
}
한 클래스에서 여러 인터페이스를 구현할 수 있다.
interface A {
void methodA();
}
interface B {
void methodB();
}
class C implements A, B {
@Override
public void methodA() {
System.out.println("A 메서드 구현");
}
@Override
public void methodB() {
System.out.println("B 메서드 구현");
}
}
디폴트 메서드가 여러 인터페이스에 정의된 경우, 명시적으로 오버라이딩해야 한다.
interface A {
default void display() {
System.out.println("A 인터페이스");
}
}
interface B {
default void display() {
System.out.println("B 인터페이스");
}
}
class C implements A, B {
@Override
public void display() {
System.out.println("C에서 디폴트 메서드 오버라이딩");
}
}
인터페이스끼리 상속할 수 있다.
interface Parent {
void parentMethod();
}
interface Child extends Parent {
void childMethod();
}
class MyClass implements Child {
@Override
public void parentMethod() {
System.out.println("Parent 메서드 구현");
}
@Override
public void childMethod() {
System.out.println("Child 메서드 구현");
}
}
| 특징 | 인터페이스 | 추상 클래스 |
|---|---|---|
| 메서드 | 추상 메서드, 디폴트 메서드, 정적 메서드 가능 | 추상 메서드와 일반 메서드 가능 |
| 필드 | 상수만 선언 가능 (자동으로 public static final) | 일반 필드 및 상수 선언 가능 |
| 다중 상속 | 다중 구현 가능 | 단일 상속만 가능 |
| 생성자 | 생성자 없음 | 생성자 존재 |
| 사용 목적 | 클래스 간 공통된 행동 규약 제공 | 공통된 필드와 메서드를 공유하며 일부 구현 제공 |
interface Animal {
void sound();
}
class Dog implements Animal {
@Override
public void sound() {
System.out.println("멍멍!");
}
}
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(); // 야옹!
}
}
interface AAA {}
interface BBB extends {}
interface CCC extends AAA, BBB {}
//인터페이스는 다중 상속 가능
class EEE{}
class DDD extends EEE{}
class EEE implements AAA, BBB{}
//interface의 부모로 class는 사용 할 수 없다