[TIL] Spring에서 interface와 abstract class

2025-03-28 TIL

📝 TIL (Today I Learned)
🔗 원본 이슈: #33
📅 작성일: 2025-03-28
🔄 최종 수정: 2025년 04월 08일


🍀 새롭게 배운 것

  • Spring을 공부하다가 interfaceabstract class 개념이 헷갈려서 둘 사이에 어떤 관계가 있는지 알아보았다.

    인터페이스를 추상 클래스가 상속받는 경우는 고급개념이라고 한다..


✅ 인터페이스(interface)란?

  • 일종의 기약(약속). 어떤 기능을 반드시 구현해야 한다는 걸 명시해주는 것.
  • 예: interface Animal { void sound(); }
    Animal 인터페이스를 구현하는 클래스는 sound()를 반드시 구현해야 함.

✅ 추상 클래스(abstract class)란?

  • 일부는 구현되어 있고, 일부는 구현이 안 된 중간 단계의 클래스
  • 공통 기능은 구현하고, 필수 구현 사항은 abstract로 남김.

✅ 그럼 인터페이스를 추상 클래스가 “상속받는”다는 건?

public interface Animal {
    void sound();
    void eat();
}

public abstract class AbstractAnimal implements Animal {
    // 일부만 구현함
    @Override
    public void eat() {
        System.out.println("This animal eats food.");
    }

    // sound()는 구현 안 함 → 자식 클래스가 구현하게 만듦
}

👉 이렇게 쓰는 이유?

  1. 공통 로직을 추상 클래스에서 한 번만 구현하고,
  2. 각 서브 클래스는 나머지 인터페이스 기능만 구현하면 되니까 코드가 더 깔끔해진다.

💡 Spring에서 자주 쓰이는 이유

  • 예를 들어, 여러 서비스 클래스가 공통적인 작업(예: 로깅, 에러 처리 등)을 해야 할 때:
public interface MyService {
    void doSomething();
}

public abstract class AbstractMyService implements MyService {
    protected void log(String msg) {
        System.out.println("[LOG] " + msg);
    }
}

→ 이렇게 추상 클래스에서 공통 기능을 넣어두면, 실제 서비스 클래스에서는 doSomething()만 구현하면 돼서 유지보수가 쉬워진다.


🔁 정리하자면!

  • 인터페이스: “이 기능은 꼭 만들어야 해!”라고 강제.
  • 추상 클래스: “공통 코드는 여기 있어. 너는 나머지만 구현해!”
  • 인터페이스를 추상 클래스가 상속받는 것: 공통 기능은 추상 클래스가 제공하고, 나머지는 자식 클래스에게 위임하는 깔끔한 구조.

class, interface, abstract class를 통한 설계 예시

// 인터페이스
interface Flyable {
    void fly();
}

interface Attackable {
    void attack();
}

// 추상 클래스
abstract class Character {
    void move() {
        System.out.println("이동 중...");
    }

    abstract void specialSkill();
}

// 구체 클래스
class Warrior extends Character implements Attackable {
    public void attack() {
        System.out.println("검으로 공격!");
    }

    public void specialSkill() {
        System.out.println("분노 발동!");
    }
}

class Fairy extends Character implements Flyable {
    public void fly() {
        System.out.println("훨훨 날기~");
    }

    public void specialSkill() {
        System.out.println("마법 사용!");
    }
}

  • 이런 식으로 하면 공통 기능은 추상 클래스, 특수 능력은 인터페이스로 조합해서 유연한 설계가 가능.