[5단원]5원칙 - SRP

단일 책임 원칙 (Single Responsibility Principle)

1. 정의

하나의 클래스는 하나의 책임만 가져야 한다는 것이 핵심

2. 속성이 단일 책임 원칙을 지키지 못하는 경우: '사람' 클래스 예시

public class Main{
    
    public static void main(String[] args) {
        사람 로미오 = new 사람();
        사람 줄리엣 = new 사람();
        
        로미오.군번 = "129301203012";
    }
    
    public static class 사람 {
        String 군번;
    }
}

2.1 문제점

  • 사람 클래스에서는 군번이라는 속성이 모든 사람, 즉 남자와 여자 모두에게 적용됨
  • 하지만 이 경우 남자와 여자의 책임이 명확하게 구분되어 있지 않기 때문에 문제가 생깁니다.

2.2 해결 방안

  • 남자여자 클래스를 따로 만들고,
  • 군번 속성은 남자 클래스에서만 다루는 것이 좋음
  • 이렇게 하면 각 클래스가 하나의 책임만 갖게 되어 단일 책임 원칙을 준수함

3. 하나의 속성이 여러 의미를 가지는 경우

3.1 문제점

  • 하나의 필드가 여러 의미를 가질 때도 단일 책임 원칙을 지키지 못한다.
  • 예를 들어, 하나의 필드가 토지일 경우 면적을, 건물일 경우 층수를 나타내는 것이다.

3.2 해결 방안

  • 이런 문제를 해결하려면, 단일 책임 원칙에 따라 필드를 분리해야함
  • 토지와 건물을 분리하여 각각의 클래스에서 면적과 층수를 다루면 됩니다.

4. 메서드가 단일 책임 원칙을 지키지 못하는 경우: '강아지' 클래스 예시

public static class 강아지 {
        final static Boolean 수컷 = true;
        final static Boolean 암컷 = false;
        
        Boolean 성별;
        
        void 소변보다() {
            if (this.성별 == 수컷) {
                // 한쪽 다리를 들고 소변
            } else {
                // 앉아서 소변
            }
        }
    }

4.1 문제점

'강아지' 클래스의 소변보다() 메서드가 수컷과 암컷의 행동을 모두 처리해야 하는 경우, 단일 책임 원칙을 위배하게 됩니다.

4.2 해결 방안

  • '수컷강아지'와 '암컷강아지' 클래스를 만들고 각각에서 소변보다() 메서드를 오버라이딩하여 구현해야 합니다.
  • 이렇게 하면 각 클래스는 하나의 책임만 가지게 되어 단일 책임 원칙을 준수
    public static class 수컷 extends 강아지 {
            
            void 소변보다() {
            }
        }
        
        public static class 암컷 extends 강아지 {
            
            void 소변보다() {
            }
        }
        
        public static abstract class 강아지 {
            
            abstract void 소변보다();
        }

5. 단일 책임 원칙과 객체지향 4대 특성

5.1 추상화 <> 단일 책임 원칙

  • 추상화
    • 모델링 과정 담당
  • 단일 책임 원칙과 관계가 깊음
  • 클래스 설계시 단일 책임 원칙 고려 ⇒ 추상화가 정확하게 이루어짐

Uploaded by N2T

'자바 > 스프링입문객체지향' 카테고리의 다른 글

[5단원] 객체지향 세계와 SOLID 마무리  (0) 2023.09.13
[5단원]5원칙 - SOLID  (0) 2023.09.10
[5단원]5원칙 - OCP  (0) 2023.09.10
[4단원]this 키워드  (0) 2023.09.04
[4단원]super 키워드  (0) 2023.09.04