JAVA

[JAVA] ISP (인터페이스 분리 원칙)

준몽쓰 2025. 4. 8. 14:20

■ ISP

- 인터페이스를 각각 사용에 맞게 분리해야한다는 원칙

- SRP 원칙은 클래스의 단일 책임을 강조한다면, ISP는 인터페이스의 단일 책임을 강조

- 인터페이스를 사용하는 클라이언트를 기준으로 분리함으로써 클라이언트의 목적과 용도에 적합한 인터페이스 만 제공

 

■ ISP 적용 전

// 너무 많은 책임을 지는 인터페이스
public interface Worker {
    void work();
    void eat();
    void sleep();
}

// 로봇도 이 인터페이스를 구현해야 함
public class Robot implements Worker {
    @Override
    public void work() {
        System.out.println("로봇이 작업 중...");
    }

    @Override
    public void eat() {
        // 로봇은 먹지 않음 → 의미 없는 코드
        throw new UnsupportedOperationException("로봇은 먹지 않아요");
    }

    @Override
    public void sleep() {
        // 로봇은 자지 않음 → 의미 없는 코드
        throw new UnsupportedOperationException("로봇은 자지 않아요");
    }
}

- 로봇처럼 일부 기능이 필요 없는 객체도 쓸데없는 메서드를 구현했기 때문에 ISP 위반

 

■ ISP 적용 후

// 인터페이스를 역할별로 분리
public interface Workable {
    void work();
}

public interface Eatable {
    void eat();
}

public interface Sleepable {
    void sleep();
}

// 사람은 모든 기능을 사용
public class Human implements Workable, Eatable, Sleepable {
    @Override
    public void work() {
        System.out.println("사람이 일합니다");
    }

    @Override
    public void eat() {
        System.out.println("사람이 식사합니다");
    }

    @Override
    public void sleep() {
        System.out.println("사람이 잠을 잡니다");
    }
}

// 로봇은 일만 함
public class Robot implements Workable {
    @Override
    public void work() {
        System.out.println("로봇이 일합니다");
    }
}

- Robot 클래스는 자신에게 필요한 인터페이스만 구현하기 때문에, 메서드를 구현하지 않아도 된다.

 

 

정리)

- 인터페이스는 꼭 필요한 기능만 나누어 정의해야한다.

- 객체가 필요하지 않은 기능을 강제로 구현하지 않아야한다.

- 큰 인터페이스보다 작은 역할 단위의 인터페이스 분할이 유지보수성과 유연성을 높인다.