객체지향 배우는 중인데 interface랑 abstract class 구분에서 막혔습니다. 둘 다 직접 객체 못 만들고, 상속(구현)받아서 쓰고, 추상 메서드 정의하고... 하는 게 비슷해 보여서요.


게다가 자바 8부터는 인터페이스에도 default 메서드로 구현을 넣을 수 있게 됐다면서요? 그럼 이제 진짜 둘이 거의 똑같은 거 아닌가 싶은데, 그래도 굳이 나눠져 있는 이유가 있을 것 같아서 질문 드려요.


지금 만들고 있는 게 결제 기능인데, 카드결제랑 계좌이체 이런 걸 공통으로 묶으려고 합니다. 이걸 인터페이스로 할지 추상클래스로 할지 계속 고민 중이에요.


public interface Payment {
    void pay(int amount);
}

public abstract class AbstractPayment {
    protected String merchantId;
    public abstract void pay(int amount);
    public void log(String msg) {
        System.out.println(merchantId + ": " + msg);
    }
}


보니까 추상클래스는 merchantId 같은 필드(상태)를 가질 수 있고 생성자도 있는데 인터페이스는 안 되더라고요. 그리고 자바는 클래스 다중상속이 안 되니까 추상클래스는 하나밖에 못 물려받는데 인터페이스는 여러 개 구현 가능하고요. 이 정도 차이는 알겠는데, 그래서 실제로 설계할 때 "아 이건 인터페이스다" "이건 추상클래스다" 하고 판단하는 기준이 뭔지 모르겠어요.


default 메서드까지 생긴 마당에 그냥 다 인터페이스로 통일해도 되는 건 아닌가요? 실무 경험 있으신 분들은 이 둘을 어떤 감으로 나눠 쓰시는지 궁금합니다.