인터페이스(Interface)는 원래 다양한 분야에서 쓰이는 용어로, 두 개체가 상호작용 하는 방식을 정의하는 경계를 의미한다.
예시) 개체 : 시스템/장치/프로그램 등
즉, 서로 다른 두 대상이 같이 동작하기 위해 필요한 언어와 규칙(표준)을 정해주는 역할이다.
이 규칙을 통해 내부가 복잡하더라도 사용자는 단순한 방식으로 기능을 활용가능하고, 다른 구성요소들도 동일한 규칙을 따라 일관되게 확장될 수 있다.
예시1)
두 개체: 노트북(시스템) ↔ USB 메모리/키보드/마우스(장치)
인터페이스(경계): USB 규격(포트 모양, 전압/신호, 통신 방식)
예시2)
두 개체: 쇼핑몰 서버(프로그램) ↔ 결제대행사 API(다른 프로그램)
인터페이스(경계): “결제 요청/응답” API 규격(필드명, 요청 방식, 응답 코드)

자바에서의 인터페이스는 이러한 개념을 코드로 옮긴 것으로, 한마디로 완전히 추상화된 설계도(규격)이다.
클래스와 문법적으로 비슷하지만 class 대신 interface 키워드를 사용
기본적으로 인터페이스의 메서드는 추상 메서드로 취급
(Java 8부터 default 메서드와 static 메서드가 추가되어 예외가 생김)
인터페이스에 선언된 메서드는 기본적으로 public abstract 이며 생략 가능
인터페이스에 선언된 변수는 자동으로 public static final(상수)로 간주되며 생략 가능
예시 코드)
interface Basic {}
class Advanced extends Basic{}
=> 불가능
class Advanced implements Basic{}
=> 가능
하나의 클래스는 여러 개의 인터페이스를 다중 구현할 수 있음
구현 클래스는 인터페이스에 선언된 모든 추상 메서드를 반드시 구현(override) 해야 객체를 생성할 수 있음
만약 일부만 구현한다면, 그 클래스는 추상 클래스(abstract class) 로 선언되어야함

인터페이스는 extends 키워드를 사용해 다른 인터페이스를 상속
클래스와 달리 인터페이스는 다중 상속이 가능
(일반적으로 구현부 없이 규격(메서드 선언)만 정의하므로 충돌 위험이 상대적으로 적기 때문)
인터페이스에도 구현부가 있는 메서드를 정의할 수 있음
→ 선언 시 메서드 앞에 default 키워드를 반드시 붙임
접근 제한자는 public만 가능하며, public은 생략 가능
구현 클래스는 필요하면 default 메서드를 재정의(override) 할 수 있음
기존 인터페이스에 메서드를 추가해야 할 때, 모든 구현 클래스가 한꺼번에 깨지는 문제를 줄이기 위해 사용
→ 기본 구현을 인터페이스에 제공하므로, 구현체가 반드시 구현할 필요는 없음
cf) default method 충돌 해결
인터페이스에도 static 메서드를 선언할 수 있으며, 사용 방식은 클래스의 static 메서드와 동일
호출은 인터페이스명.메서드() 형태로 함 (구현 클래스의 객체로 호출하지 않음)
해당 인터페이스와 관련된 유틸리티/헬퍼 기능을 제공할 때 유용
static 메서드는 구현 클래스에 상속되지 않으며, 구현 클래스에서 재정의(override) 할 수도 없음

| 인터페이스 특징 | 내용 |
|---|---|
| 표준화 처리 가능 | 여러 클래스들이 동일한 인터페이스를 구현하여 일관된 방식으로 동작 처리 |
| 개발 기간 단축 가능 | 시스템 구조를 먼저 설계하고, 각 부분을 독립적으로 개발하여 개발 기간 단축 |
| 서로 관계가 없는 클래스들 간의 관계 형성 | 관련이 없는 클래스들이 동일한 인터페이스를 구현하여 공통된 동작 공유 |
| 간접적인 클래스 사용으로 모듈 교체 용이 | 구체적인 클래스에 의존하지 않고 인터페이스를 통해 클래스 사용, 모듈 교체 용이 |
| 독립적 프로그래밍 가능 | 각 클래스가 독립적으로 개발 및 테스트 가능, 코드 재사용성과 유지보수성 향상 |
| 다형성 지원 | 같은 인터페이스를 구현하는 객체들을 일관되게 처리하여 코드 유연성과 확장성 증가 |
| 설계의 유연성 제공 | 클래스 간의 강한 결합을 피하여 설계의 유연성 증가, 시스템 변경 및 확장 시 영향 최소화 |
| 구분 | 클래스 | 인터페이스 |
|---|---|---|
| 특징 | class 키워드를 사용하여 정의필드와 메서드, 생성자로 이루어짐 | interface 키워드를 사용하여 정의static 상수와 추상메서드(메서드 선언부)로 이루어짐public static final 생략 가능public abstract 생략 가능 |
| 관계 | 인터페이스를 구현함 | 클래스에 의해 구현됨 |
| 멤버 변수 | 선언 가능 | 상수만 가능 |
| 다중 상속 | 클래스는 하나의 클래스만 상속 가능 | 인터페이스는 여러 개의 인터페이스 상속 가능 (구현부가 없으므로 헷갈리지 않음) |
| 다중 구현 | 클래스는 여러 개의 인터페이스를 다중으로 구현(implements) 가능 | |
| 인스턴스 | 생성 가능 | 생성 불가 |
| 타입 | 타입으로 사용 가능 | 타입으로 사용 가능 |
| 구분 | 추상 클래스 | 인터페이스 |
|---|---|---|
| 객체생성 | 불가 | 불가 |
| 일반 메소드 | 가능 | 불가 |
| 일반 필드 | 가능 | 불가(static 상수만 가능) |
| 메서드 | abstract를 붙여야만 추상 메서드 | 모든 메서드는 추상 메서드 |
| 사용 | - 추상적인 클래스의 성격을 가질 때(일부 메서드만 미완성 설계도) - 서로 유사한 클래스 사이에 코드를 공유하고 싶을 때 | - 서로 관련 없는 클래스 사이에 공통으로 적용되는 인터페이스를 구현하게 하기 원할 때 (ex) Comparable, Serializable- 객체(클래스)의 어떤 기능을 구현하고 있다는 “약속”의 성격이 있을 때 |
| 공통점 | - 특정 기능의 구현을 강제하고 싶을 때 - 다형성 가능 - 보다 추상화된 설계도에 의존하는 코드를 작성하고 싶을 때 - 타입으로 사용 가능 | - 특정 기능의 구현을 강제하고 싶을 때 - 다형성 가능 - 보다 추상화된 설계도에 의존하는 코드를 작성하고 싶을 때 - 타입으로 사용 가능 |
슬슬 복잡해지는 Java의 구조
복잡과 익숙해짐의 사이