Java 객체지향 설계 다시 보기

객체지향 설계의 핵심 원칙인 SOLID를 자바 코드로 구현하며, 변화에 유연하게 대응할 수 있는 아키텍처 설계 방법을 분석한다.

DIP(의존 역전 원칙)와 OCP(개방-폐쇄 원칙)

구체적인 클래스가 아닌 인터페이스에 의존하게 함으로써, 기존 코드를 수정하지 않고도 기능을 확장할 수 있는 구조를 설계한다.

// 1. 추상화된 인터페이스 정의
interface PaymentProcessor {
    void process(int amount);
}

// 2. 구체적인 구현체들
class CreditCardProcessor implements PaymentProcessor {
    public void process(int amount) {
        System.out.println("Processing credit card payment: " + amount);
    }
}

class KakaoPayProcessor implements PaymentProcessor {
    public void process(int amount) {
        System.out.println("Processing KakaoPay payment: " + amount);
    }
}

// 3. 인터페이스에 의존하는 서비스 클래스 (DIP 준수)
class OrderService {
    private final PaymentProcessor paymentProcessor;

    // 생성자를 통한 의존성 주입 (DI)
    public OrderService(PaymentProcessor paymentProcessor) {
        this.paymentProcessor = paymentProcessor;
    }

    public void completeOrder(int amount) {
        paymentProcessor.process(amount);
    }
}

SOLID 원칙 요약

| 원칙 | 설명 | 적용 효과 |

| :— | :— | :— |

| SRP | 단일 책임 원칙 | 클래스 변경 이유를 하나로 제한하여 응집도 향상 |

| OCP | 개방-폐쇄 원칙 | 확장은 열려 있고 수정은 닫힌 구조로 유지보수성 확보 |

| LSP | 리스코프 치환 원칙 | 자식 클래스는 언제나 부모 클래스를 대체 가능해야 함 |

| ISP | 인터페이스 분리 원칙 | 클라이언트는 사용하지 않는 메서드에 의존하지 않아야 함 |

| DIP | 의존 역전 원칙 | 상위 모듈은 하위 모듈의 구현이 아닌 추상화에 의존 |

설계의 실제 적용

좋은 설계는 초기 비용이 발생하지만, 요구사항이 변경될 때 그 진가를 발휘한다.

예를 들어 새로운 결제 수단이 추가되어도 OrderService의 코드는 단 한 줄도 수정할 필요가 없다.

P.S

객체지향 설계는 객체 간의 결합도를 낮추고 응집도를 높이는 과정이다.

SOLID 원칙을 기반으로 인터페이스를 적극 활용하면, 거대한 시스템에서도 변경의 파급 효과를 최소화할 수 있는 것 같다.

Author avatar

웨이호프

WordPress creator and blogger.

View all posts