인터페이스 : 추상 메소드와 상수 필드만 가질 수 있는 클래스의 변형체
InterProduct
public interface InterProduct {
// public static final int MAX_NUM = 100; <- public static final 부분은 지워도 된다.
int MAX_NUM = 100;
// private static final int MAX_NUM = 100; <- 접근지정자도 interface에서는 public 이어야 한다.
// public InterProduct() {} <- 인터페이스는 생성자 자체도 필요로 하지 않는다. (가질 수 없다.)
/* 설명. 기본적으로 추상메소드만 가능하다. (접근지정자는 public) */
// public abstract void nonStaticMethod(); <- public abstract 생략 가능
void nonStaticMethod();
/* 설명. static 메소드는 바디부까지 작성을 허용했다. (JDK 1.8부터 추가된 기능) */
public static void staticMethod() {}
/* 설명. non-static 메소드여도 default 키워드를 추가하면 바디부까지 작성을 허용했다. (JDK 1.8부터 추가된 기능) */
public default void defaultMethod() {}
/* 설명. private도 abstract가 아닌 온전한 메소드로 사용은 가능하다. (default도 없이) */
private void privateMethod() {
/*설명. 다른 public default 메소드에서 활용할 수만 있는 기능 */
}
}
인터페이스를 구현하기 위해서는 implements 키워드를 사용해야 한다.
Product
public class Product implements InterProduct {
@Override
public void nonStaticMethod() {
System.out.println("InterProduct의 nonStaticMethod 오버라이딩 메소드 호출됨");
}
}
Application
public class Application {
public static void main(String[] args) {
/* 설명. 인터페이스도 객체를 생성할 수 없다. */
// InterProduct ip1 = new InterProduct(); <- 이렇게 하면 안 된다.
Product product = new Product();
// InterProduct product = new Product(); <- 이것도 가능하다.
product.nonStaticMethod();
}
}

공유를 목적으로 하는 상수(public static final 필드)를 기반으로 모든 기능을 공통화(public abstract 메소드)해서 강제성을 부여할 목적
단일 상소이라는 단점을 어느 정도 극복하기 위해 사용하기도 한다. 모든 클래스는 하나의 부모 클래스 외에도 여러 개의 인터페이스를 구현할 수 있다.

public class Application implements InterOne, InterTwo {
@Override
public void interOneMethod() {}
@Override
public void interTwoMethod() {}
}
| 구분 | 추상 클래스 | 인터페이스 |
|---|---|---|
| 자체 인스턴스 생성 | 생성 불가 | 생성 불가 |
| 다형성 적용 시 상위 타입 활용 가능 유무 | 가능 | 가능 |
| 구분 | 추상 클래스 | 인터페이스 |
|---|---|---|
| 상속 가능 범위 | 단일 상속 | 다중 상속 |
| 키워드 | extends 사용 | implements 사용 |
| 추상 메소드 갯수 | abstract 메소드 0개 이상 | 모든 메소드는 abstract |
| abstract 키워드 명시 | 명시적 사용 | 묵시적으로 abstract |