그리미
인터페이스와 추상 클래스 본문
문법적 측면
- 추상 클래스
- 모든 접근 제어자가 가능하고, 인스턴스 변수를 선언할 수 있다.
- 람다 표현식을 사용할 수 없다.
- 인터페이스
- public, static, final 변수만 가능하고 인스턴스 변수를 선언할 수 없다.
- 람다 표현식을 사용할 수 있다. (람다는 함수형 인터페이스를 통해서만 가능하다)
추상 클래스의 일반 메서드 vs 인터페이스의 디폴트 메서드
- 인스턴스 변수 접근 가능 차이
- 상태에 접근할 수 있다는 점에서 차이가 존재한다.
public abstract class CircleClass { private String color; private List<String> allowedColors = Arrays.asList("RED", "GREEN", "BLUE"); public boolean isValid() { if (allowedColors.contains(getColor())) { return true; } else { return false; } } } public class ChildCircleClass extends CircleClass { // 재정의 하지 않아도 상태에 직접 접근할 수 있다. }
public interface CircleInterface { List<String> allowedColors = Arrays.asList("RED", "GREEN", "BLUE"); // 상수 String getColor(); public default boolean isValid() { if (allowedColors.contains(getColor())) { return true; } else { return false; } } } public class ChidlCircleInterfaceImpl implements CircleInterface { private String color; // 인터페이스 구현체에 상태를 정의해야 한다. @Override public String getColor() { // 재정의 하지 않으면 상태를 가져올 수 없다. (상태에 접근할 수 없다) return color; } public void setColor(String color) { this.color = color; } }
- 추상 클래스는 단일 상속만 가능하고, 인터페이스는 여러 인터페이스들을 구현할 수 있음
- 디폴트 메서드가 겹치면 재정의 하면 됨
- 이러한 면에서 인터페이스를 사용하는게 일반적으로 더 좋음