OOP

[OOP] 객체 지향 설계 5원칙(SOLID) : SRP(Single Responsibility Principle)-단일 책임 원칙

2h1824 2025. 1. 6. 21:08

SRP(Single Responsibility Principle)

각 클래스는 하나의 책임을 가져야 한다는 원칙

클래스의 역할과 책임을 명확히 분리 ㅡ> 책임 의존성 과중 지양 ㅡ> 변경이 필수적인 경우에만 해당하는 클래스만 수정

코드 예제

SRP가 적용되지 않은 코드

#include <iostream>
#include <string>
using namespace std;

class Student {
public:
    void setName(const string& name) {
        this->name = name;
    }

    void displayDetails() {
        cout << "Student Name: " << name << std::endl;
    }

    void calculateGrade(int score) {
        if (score >= 90) {
            cout << "Grade: A" << std::endl;
        } else if (score >= 80) {
            cout << "Grade: B" << std::endl;
        } else {
            cout << "Grade: C" << std::endl;
        }
    }

private:
    string name;
};

해당 코드는 SRP가 적용되지 않은 코드

ㅡ> Student 클래스의 책임 3가지 (SRP 위반)

  1. Student 클래스는 학생들의 정보를 저장
  2. 학생들의 정보를 출력하는 기능
  3. 성적 계산

ㅡ> 하나의 객체에 너무 많은 책임이 몰림 ㅡ> 객체의 의존성 상승 ㅡ> 코드 수정으로 인한 영향, 범위가 넓어짐

ㅡ> 코드 유지보수 효율성 저하 

SRP에 따르려면 Student 클래스에서는 학생 정보만을 담고 있고, 나머지 기능들은 다른 클래스들에 구현해야 합니다

 

SRP가 적용된 코드

#include <iostream>
#include <string>
using namespace std;

// 학생 정보 관리 클래스
class Student {
public:
    void setName(const string& name) {
        this->name = name;
    }

    string getName() const {
        return name;
    }

private:
    string name;
};

// 성적 계산 클래스
class GradeCalculator {
public:
    void calculateGrade(int score) {
        if (score >= 90) {
            cout << "Grade: A" << std::endl;
        } else if (score >= 80) {
            cout << "Grade: B" << std::endl;
        } else {
            cout << "Grade: C" << std::endl;
        }
    }
};

// 출력 클래스
class StudentPrinter {
public:
    void displayDetails(const Student& student) {
        cout << "Student Name: " << student.getName() << std::endl;
    }
};

위 코드는 SRP 원칙을 준수하여 Student는 학생 정보만을 담고 해당 정보 관련 기능만을 수행합니다. 더불어 성적 계산 및 학생 정보 출력 기능을 따로 클래스로 구현하여 단일 책임 원칙을 준수하였습니다. 

ㅡ> 위의 코드와 같이 클래스가 하나의 책임을 갖도록 설계하면 의존성이 낮아져 코드 수정 사항이 있을 때도 해당하는 클래스만 수정하면 되어 코드 유지보수의 효율성이 높아집니다.

정리

필자도 객체지향 언어를 사용하여 개발을 진행할 때 SRP를 의식하지 않고 하나의 클래스에 많은 기능을 집약적으로 구현하는 경우가 많았다. 결국은 코드의 수정 사항이 생길 때마다 해당 클래스에서 연관되어 있는 함수들을 다 수정하느라 나중에는 수정해야 될 부분을 빠뜨려 컴파일 중 에러를 일으키게 되었다. 

객체지향 언어를 사용하면서 해당 언어의 이점을 활용하지 못한다면 굳이 객체지향 언어를 사용하는 의미가 퇴색되는 것이니 이점을 살리기 위해 SRP를 준수하여 코드 유지보수의 효율성을 높일 수 있도록 해보자.

* 하나의 객체 = 하나의 책임

 

 


참고자료

https://blog.itcode.dev/posts/2021/08/13/single-responsibility-principle

 

[OOP] 객체지향 5원칙(SOLID) - 단일 책임 원칙 SRP(Single Responsibility Principle) - 𝝅번째 알파카의 개발

올바른 객체지향 설계를 위해 수립한 원칙이 있으며, 이 다섯 가지 원칙을 통틀어 객체지향 5원칙(SOLID)이라 명명한다. 필수로 적용하지는 않지만, 적어도 이 규칙을 준수하면 준수할 수록 올바

blog.itcode.dev