리셋 되지 말자

SRP와 ISP 본문

Java(폐지)/객체지향 설계 5원칙-SOLID

SRP와 ISP

kyeongjun-dev 2020. 7. 21. 13:03

단일 책임 원칙(SRP)와 인터페이스 분할 원칙(ISP) - 클래스를 나누느냐 인터페이스를 나누느냐

SRP와 ISP는 같은 문제에 대한 두 가지 다른 해결책이라고 볼 수 있다.프로젝트 요구사항과 설계자의 취향에 따라 선택될 수 있다.
하지만 특별한 경우가 아니라면 단일 책임 원칙을 적용하는 것이 더 좋은 해결책이라고 할 수 있다.

인터페이스 최소주의 원칙


인터페이스를 통해 메서드를 외부에 제공할 때 최소한의 메서드만 제공하라는 것이다.

상위 클래스는 풍성하게, 인터페이스는 작게


앞의 게시물 '상속과 인터페이스'에서 상위 클래스는 풍성할수록 좋고, 인터페이스는 작을수록 좋다고 언급했다. 이는 리스코프 치환 원칙(LSP)로 예를 들 수가 있다.

LSP에 따라 하위 객체는 상위 객체인 척 할 수 있다.

왼쪽 : 빈약한 상위 클래스, 오른쪽 : 풍성한 상위 클래스

빈약한 상위 클래스

package poorSuperClass;

import java.util.Date;

public class Driver {
    public static void main(String[] args) {
        사람 김학생 = new 학생("김학생", new Date(2000, 01, 01), "20000101-1234567",
                "20190001");
        사람 이군인 = new 군인("이군인", new Date(1998, 12, 31), "19981231-1234567",
                "19-12345678");

        System.out.println(김학생.이름);
        System.out.println(이군인.이름);

        // System.out.println(김학생.생일); // 사용불가
        // System.out.println(이군인.생일); // 사용불가

        System.out.println(((학생) 김학생).생일); // 캐스팅 필요
        System.out.println(((군인) 이군인).생일); // 캐스팅 필요

        // System.out.println(김학생.주민등록번호); // 사용불가
        // System.out.println(이군인.주민등록번호); // 사용불가

        System.out.println(((학생) 김학생).주민등록번호);
        // 캐스팅 필요
        System.out.println(((군인) 이군인).주민등록번호);
        // 캐스팅 필요

        김학생.먹다();
        이군인.먹다();

        // 김학생.자다(); // 사용불가
        // 이군인.자다(); // 사용불가

        ((학생) 김학생).자다(); // 캐스팅 필요
        ((군인) 이군인).자다(); // 캐스팅 필요

        // 김학생.소개하다(); // 사용불가
        // 이군인.소개하다(); // 사용불가

        ((학생) 김학생).소개하다(); // 캐스팅 필요
        ((군인) 이군인).소개하다(); // 캐스팅 필요

        ((학생) 김학생).공부하다(); // 캐스팅 필요
        ((군인) 이군인).훈련하다(); // 캐스팅 필요
    }
}

풍성한 상위 클래스

package richSuperClass;

import java.util.Date;

public class Driver {
    public static void main(String[] args) {
        사람 김학생 = new 학생("김학생", new Date(2000, 01, 01), "20000101-1234567",
                "20190001");
        사람 이군인 = new 군인("이군인", new Date(1998, 12, 31), "19981231-1234567",
                "19-12345678");

        System.out.println(김학생.이름);
        System.out.println(이군인.이름);

        System.out.println(김학생.생일);
        System.out.println(이군인.생일);

        System.out.println(김학생.주민등록번호);
        System.out.println(이군인.주민등록번호);

        // System.out.println(김학생.학번); // 사용불가
        // System.out.println(이군인.군번); // 사용불가

        System.out.println(((학생) 김학생).학번);
        // 캐스팅 필요
        System.out.println(((군인) 이군인).군번);
        // 캐스팅 필요

        김학생.먹다();
        이군인.먹다();

        김학생.자다();
        이군인.자다();

        김학생.소개하다();
        이군인.소개하다();

        // 김학생.공부하다(); // 사용불가
        // 이군인.훈련하다(); // 사용불가

        ((학생) 김학생).공부하다(); // 캐스팅 필요
        ((군인) 이군인).훈련하다(); // 캐스팅 필요
    }
}

상위클래스가 빈약할 때, 캐스팅(형변환)이 훨씬 많이 필요한 것을 확인할 수 있다.

'Java(폐지) > 객체지향 설계 5원칙-SOLID' 카테고리의 다른 글

DIP - 의존 역전 원칙  (0) 2020.07.21
ISP - 인터페이스 분리 원칙  (0) 2020.07.21
LSP - 리스코프 치환 원칙  (0) 2020.07.20
OCP - 개방 폐쇄 원칙  (0) 2020.07.20
SRP-단일 책임 원칙  (0) 2020.07.20
Comments