추상 클래스보다는 인터페이스를 우선하라

인터페이스? 추상클래스?

인터페이스 장점

  1. 인터페이스는 믹스인 정의에 안성맞춤!

  2. 계층구조가 없는 타입 프레임워크를 만들 수 있다

  3. 디폴트 메서드

    public interface Student {
      public void study();
      public default void syaHello() {
        System.out.println("안녕하세요");
      }
    }
    

추상 골격 구현 클래스

public interface Character {
  public void move();
  public void seat();
  public void attack();
}
public class Thief implements Character{
  @Override
  public void move() {
    System.out.println("걷다");
  }

  @Override
  public void seat() {
    System.out.println("앉다");
  }

  @Override
  public void attack() {
    System.out.println("표창을 던진다");
  }    
}

public class Wizard implements Character{
  @Override
  public void move() {
    System.out.println("걷다");
  }

  @Override
  public void seat() {
    System.out.println("앉다");
  }

  @Override
  public void attack() {
    System.out.println("마법봉을 휘두르다");
  }
}
//추상 골격 구현 클래스 사용하는 버전
public abstract class AbstractCharacter implements Character{
  @Override
  public void move() {
    System.out.println("걷다");
  }

  @Override
  public void seat() {
    System.out.println("앉다");
  }
}

public class Thief extends AbstractCharacter implements Character{
    @Override
    public void attack() {
        System.out.println("표창을 던진다");
    }
}

public class Wizard extends AbstractCharacter implements Character{
    @Override
    public void attack() {
        System.out.println("마법봉을 휘두르다");
    }
}

<aside> ☝🏻 일반적으로 다중 구현용 타입으로는 인터페이스가 가장 적합

→ 복잡한 인터페이스라면 골격 구현을 함께 제공하는 방법을 꼭 고려하자!

→ 골격 구현은 가능하면 인터페이스의 디폴트 메서드로 제공하여 인터페이스를 구현한 모든 곳에서 활용 가능하도록 하자! (구현상에 제약이 있다면 추상 클래스로 제공)

</aside>