프로그래밍Java 개발자

Java에서 추상 클래스와 인터페이스의 주요 차이점을 설명하고 각각을 사용해야 하는 시나리오를 설명하십시오.

Hintsage AI 어시스턴트로 면접 통과

답변

추상 클래스는 추상 메서드와 구체적인 메서드(구현 포함) 및 상태(데이터 필드)를 포함할 수 있습니다. 클래스는 단 하나의 추상 클래스에서만 상속될 수 있습니다. 추상 클래스는 상속 계층을 위해 일부 논리와 상태를 일반화해야 할 때 사용됩니다.

인터페이스는 메서드의 시그니처만 정의합니다(자바 8 이전). 자바 8부터는 기본 구현이 있는 메서드(default)와 정적 메서드를 포함할 수 있지만 상태는 없습니다. 하나의 클래스는 여러 인터페이스를 구현할 수 있습니다. 인터페이스는 상속 계층에 독립적인 행동 집합을 정의하기 위해 사용하십시오.

예시:

abstract class Animal { String name; public Animal(String name) { this.name = name; } abstract void makeSound(); } interface Movable { void move(); } class Dog extends Animal implements Movable { public Dog(String name) { super(name); } void makeSound() { System.out.println("Woof!"); } public void move() { System.out.println("Runs"); } }

트릭 질문

추상 메서드만 있는 추상 클래스와 인터페이스의 차이점은 무엇입니까? 이들을 상호 교환하여 사용할 수 있습니까?

답변: 아니요, 항상 그럴 수는 없습니다. 인터페이스는 상태(인스턴스 필드)를 가질 수 없으며 다중 구현을 지원하지만 추상 클래스는 단일 상속만 가능합니다. 또한, 인터페이스의 메서드 시그니처는 항상 public입니다.


주제에 대한 미비함으로 인해 발생한 실제 오류 사례


이야기

프로젝트에서는 유사한 행동을 가지지만 서로 다른 객체 계층에 속하는 여러 개의 인터페이스를 구현해야 했습니다. 개발자는 추상 클래스를 선택하여 다중 상속을 사용할 수 없게 되었습니다. 이후 이는 상당한 코드 리팩토링과 중복으로 이어졌습니다.


이야기

하나의 대규모 REST API 프로젝트에서 필드(상수)가 있는 인터페이스가 생성되었으며, 이는 일반 클래스처럼 변경 가능한 값이 될 것이라고 예상했습니다. 결과적으로 이 필들에 대한 변경 시도는 Silent Failure로 이어졌으며 — 값은 변하지 않고, 오류는 오랫동안 발견되지 않았습니다.


이야기

Java 8로의 마이그레이션 과정에서 개발자들이 인터페이스에 구현된 메서드를 추가했으나, 일부 클래스가 추상 클래스를 통해 동일한 이름의 메서드를 상속받는 것을 고려하는 것을 잊었습니다. 이로 인해 메서드 충돌과 예상치 못한 상속 해결 결과가 발생했습니다.