객체지향 설계에서 가장 중요한 원칙 중 하나는 "구현이 아닌 역할(인터페이스)에 의존하라"입니다.
자바의 인터페이스(Interface)는 껍데기(메서드 이름과 반환 타입)만 존재하고 내부는 완전히 비어있는 완벽한 '규약'입니다. 자바는 다중 상속을 지원하지 않지만, 인터페이스는 한 클래스가 여러 개를 동시에 구현(implements)할 수 있어 유연한 확장을 가능하게 합니다.
인터페이스는 컴퓨터의 'USB 포트 규격'입니다. 컴퓨터는 마우스인지 키보드인지 신경 쓰지 않습니다. 그저 "USB 규격을 맞췄는가?"만 확인하죠.
구현 클래스(마우스, 키보드)는 이 USB 규격(인터페이스)을 실제로 몸체에 장착(implements)하여 만든 제품들입니다. 규격만 맞추면 언제든 새로운 기기로 부품을 갈아 끼울 수 있는 엄청난 유연성이 생깁니다.
| 비교 항목 | 추상 클래스 (Abstract Class) | 인터페이스 (Interface) |
|---|---|---|
| 목적 | 관련성이 높은 클래스들의 공통 기능(코드)을 물려주기 위해 | 서로 관련 없는 클래스들이 동일한 규약(행동)을 지키게 하기 위해 |
| 메서드 구현 | 구현된 일반 메서드 + 추상 메서드 혼용 가능 | 기본적으로 모든 메서드가 구현부가 없는 추상 메서드 |
| 다중 상속 | 불가능 (단일 상속만 허용) | 가능 (여러 개 동시 구현 허용) |
| 키워드 | extends |
implements |