※ 이 글은 자바의정석을 참조하였다.
1. 추상클래스란?
- 클래스가 설계도라면 추상클래스는 ‘미완성 설계도’
- 추상메서드를 포함하고 있는 클래스
- 일반메서드가 추상메서드를 호출할 수 있다.
- 미완성된 설계도 이므로 인스턴스를 생성할 수 없다.
- 다른 클래스를 작성하는데 도움을 줄 목적으로 작성된다.
2. 인터페이스란?
- 일종의 추상클래스. 추상클래스보다 추상화 정도가 높다.
- 실제 구현된 것이 전혀 없는 기본설계도
- 추상메서드와 상수만을 멤버로 가질 수 있다.
- 인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용된다.
- 미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는 데 사용된다.
3. 인터페이스의 작성
- class대신 interface 를 사용하고 클래스 작성과 동일
- 구성요소(멤버)는 추상메서드와 상수만 가능하다.
4. 인터페이스의 상속
- 인터페이스도 클래스처럼 상속이 가능하다.(클래스와 달리 다중상속 허용)
- 인터페이스는 Object클래스와 같은 최고 조상이 없다.
5. 인터페이스의 구현
- 인터페이스를 구현하는것은 클래스를 상속 받는 것과 같다.
다만 ‘extends’ 대신 ‘implements’를 사용한다. - 인터페이스에 정의된 추상메서드를 완성해야 한다.
- 상속과 구현이 동시에 가능하다.
6. 인터페이스를 이용한 다형성
- 인터페이스 타입의 변수로 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다.
- 인터페이스를 메서드의 매개변수 타입으로 지정할 수 있다.
- 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.
7. 인터페이스의 장점
- 개발시간단축
- 표준화가 가능
- 서로 관계 없는 클래스들에게 관계를 맺어 줄 수 있다.
- 독립적인 프로그래밍이 가능
8. 현재(2026) 기준 참고 사항
함수형 인터페이스 (Java 8+)
// 추상 메서드가 1개인 인터페이스
@FunctionalInterface
public interface Calculator {
int calculate(int a, int b);
}
// 람다로 구현
Calculator add = (a, b) -> a + b;
Calculator multiply = (a, b) -> a * b;
System.out.println(add.calculate(5, 3)); // 8
Default 메서드 (Java 8+)
public interface Payment {
void pay(int amount);
// 기본 구현 제공
default void refund(int amount) {
System.out.println("환불: " + amount);
}
// 정적 메서드
static void printInfo() {
System.out.println("결제 인터페이스");
}
}
추상 클래스 vs 인터페이스 (2026 기준)
| 구분 | 추상 클래스 | 인터페이스 |
|---|---|---|
| 다중 상속 | 불가 | 가능 |
| 생성자 | 가능 | 불가 |
| 필드 | 가능 | 상수만 |
| 메서드 | 구현 가능 | default/static만 구현 가능 |
| 용도 | 공통 기능 제공 | 계약/규격 정의 |
실무 권장 패턴
// 인터페이스로 계약 정의
public interface UserService {
User findById(Long id);
void save(User user);
}
// 구현 클래스
@Service
public class UserServiceImpl implements UserService {
@Override
public User findById(Long id) { ... }
@Override
public void save(User user) { ... }
}
- TODO: Spring에서 @Service 인터페이스 분리 여부 검토 필요