본문 바로가기
Java

자바 OOP (4) - 인터페이스와 추상 클래스

by gentle-tiger 2025. 6. 17.
프로젝트 중 느낀 자바 기초의 부족함을 보완하고자 핵심 주제를 순차적으로 복습할 예정입니다.
자바 코어 → 자바 스레드 → 자바 OOP → 자바의 예외 → 자바의 컬렉션 → 최대 절전 모드 순으로 정리할 예정입니다. 

 

인터페이스와 추상 클래스

  1. 인터페이스란 무엇입니까?
  2. 인터페이스용 객체를 만들 수 있습니까?
  3. 인터페이스에 멤버 변수가 있습니까?
  4. 인터페이스의 메서드에는 어떤 수정자가 허용됩니까?
  5. 마커 인터페이스란?
  6. 추상 클래스를 무엇이며, 인스턴스화할 수 있습니까?

 

인터페이스란 무엇입니까?

인터페이스는 객체 지향 프로그래밍에서 구현을 강제하고 역할을 정의하는 일종의 계약입니다. 인터페이스는 서로 다른 클래스 간에 공통된 동작을 보장하기 위해 행위의 표준을 제공하고, 다중 상속의 복잡성을 피하면서 여러 타입을 안전하게 구현할 수 있도록 설계되었습니다. Java에서 인터페이스는 클래스와 달리 행위를 선언만 하고 실제 구현은 가지지 않는게 원칙이었지만, Java 8부터 default 및 static 메서드를 지원하면서 일부 구현도 가능합니다.

 

인터페이스용 객체를 만들 수 있습니까?

인터페이스 자체로는 인스턴스를 만들 수 없습니다. 이는 인터페이스는 완전한 구현체가 아니라 설계도 역할만 하기 때문에 실체가 없어서 직접 객체를 생성할 수 없습니다. 대신, 구현한 클래스의 인스턴스를 인터페이스 타입으로 참조할 수는 있습니다. 이렇게 하면 다형성을 유지할 수 있습니다.

Movable m = new Movable(); // 컴파일 오류
Movable m = new Car(); // Car implements Movable

 

 

인터페이스에 멤버 변수가 있습니까?

인터페이스는 상수만 허용하고 변수(인스턴스 필드)는 선언할 수 없습니다. 이는 인터페이스가 상태를 관리하지 않고 오직 행위만 정의하는 특성 때문입니다. 인터페이스에 선언된 모든 필드는 묵시적으로 public static final이기 때문에 반드시 값을 초기화해야 하고, 이후에는 변경할 수 없습니다.

interface Config {
    int TIMEOUT = 1000; // public static final이 암묵적으로 붙음
}

 

 

인터페이스의 메서드에는 어떤 수정자가 허용됩니까?

Java 인터페이스 내 메서드에는 기본적으로 인터페이스에 선언된 추상 메서드에 public abstract가 묵시적으로 붙어 있어, 이를 구현하는 클래스는 반드시 해당 메서드를 구현해야 합니다. Java 8부터는 default 키워드를 사용해 기본 메서드를 선언할 수 있는데, 이는 구현 클래스가 선택적으로 오버라이드할 수 있도록 설계된 것입니다. 또한 static 키워드를 사용하면 클래스 수준의 유틸리티 메서드처럼 인터페이스에 정적 메서드를 선언할 수도 있습니다. Java 9부터는 private 메서드도 허용되는데, 이는 인터페이스 내부에서 코드 중복을 줄이기 위한 용도로만 쓰이며 외부에는 노출되지 않습니다. 이처럼 인터페이스의 메서드는 목적에 따라 키워드가 명확히 정해져 있어, 역할과 범위를 구분할 수 있게 되어 있습니다.

 

 

마커 인터페이스란?

마커 인터페이스는 메서드나 필드를 전혀 가지지 않고, 자신을 구현한 클래스가 특정 속성을 가졌음을 나타내는 특별한 인터페이스입니다. 주로 런타임이나 컴파일타임에 객체가 특정 조건을 만족하는지 식별하기 위해 사용됩니다. 대표적으로 Serializable은 객체가 직렬화될 수 있음을 JVM에 알리고, Cloneable은 객체가 안전하게 복제될 수 있음을 의미합니다.

마커 인터페이스는 instanceof 연산자나 리플렉션으로 쉽게 검사할 수 있어 메타데이터 역할을 하며, 타입 자체로써 컴파일러가 잘못된 사용을 미리 차단할 수 있다는 장점이 있습니다. 이 점에서 단순히 의미만 부여하는 애노테이션과 달리, 타입 계층으로 제한을 줄 수 있다는 것이 중요한 차별점입니다. 따라서 타입 정의가 주 목적이라면 마커 인터페이스를, 추가 속성이나 다양한 프로그램 요소에 붙여야 한다면 마커 애노테이션을 사용하는 것이 적절합니다.

 

 

추상 클래스를 무엇이며, 인스턴스화할 수 있습니까?

추상 클래스(Abstract Class)는 클래스의 일종으로, 공통 필드와 메서드 구현을 일부 포함하면서, 완전하지 않은 설계 요소(추상 메서드)를 동시에 가질 수 있는 클래스입니다. 추상클래스 자체로는 인스턴스를 생성할 수 없습니다. 이는 추상 메서드가 포함되어 있어 클래스가 완전하지 않음을 의미하기 때문입니다. 반드시 추상 클래스를 상속한 구체 서브클래스를 통해서만 객체를 생성할 수 있습니다. 

Animal a = new Animal(); // 오류: 추상 클래스는 직접 인스턴스화 불가
Animal a = new Dog(); // OK: Dog가 Animal을 상속하여 모든 추상 메서드를 구현함