본문 바로가기
컴퓨터 과학/소프트웨어공학

[소프트웨어공학] SOLID(1) : 단일 책임 원칙 (Single Responsibility Principle, SRP)

by webcodur 2024. 3. 29.
728x90

목차

    단일 책임 원칙 (Single Responsibility Principle)

    SOLID 원칙 중 'S'는 'Single Responsibility Principle (단일 책임 원칙)'를 의미한다. 이 원칙에 따르면, 클래스는 하나의 책임만 가져야 한다는 것이다. 여기서 '책임'이란 변경을 위한 이유를 의미한다. 즉, 하나의 클래스는 하나의 기능만 수행하는 데 집중해야 한다는 원칙이다. 이렇게 함으로써 코드의 유지보수성이 향상되고, 클래스 간의 의존성이 줄어들어 시스템이 더 유연해진다.

     

    SRP를 지키지 않은 코드 예시

    게임 개발에 있어서 'S'를 지키지 않은 코드 예시는 게임 캐릭터의 속성 관리와 게임 로그를 한 클래스 내에서 관리하는 경우이다. 이런 설계는 단일 책임 원칙을 위반하는 것이다.

    using System;
    
    // S 원칙을 지키지 않음: Character 클래스가 캐릭터 정보 관리와 로그 기록을 모두 담당
    public class Character
    {
        public string Name { get; set; }
        public int Health { get; set; }
    
        public Character(string name, int health)
        {
            Name = name;
            Health = health;
        }
    
        public void TakeDamage(int damage)
        {
            Health -= damage;
            Console.WriteLine($"{Name} takes {damage} damage."); // 로그 기록
        }
    
        public void Heal(int amount)
        {
            Health += amount;
            Console.WriteLine($"{Name} heals {amount} health."); // 로그 기록
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Character hero = new Character("Hero", 100);
            hero.TakeDamage(10);
            hero.Heal(5);
        }
    }
    

     

     

    SRP를 지키는 코드 예시

    단일 책임 원칙을 준수하기 위해, 게임 캐릭터의 속성 관리와 게임 로그 기능을 분리한 설계를 적용할 수 있다.

    using System;
    
    // 캐릭터 정보 관리 전담
    public class Character
    {
        public string Name { get; set; }
        public int Health { get; set; }
    
        public Character(string name, int health)
        {
            Name = name;
            Health = health;
        }
    
        public void TakeDamage(int damage)
        {
            Health -= damage;
        }
    
        public void Heal(int amount)
        {
            Health += amount;
        }
    }
    
    // 로그 기록 전담
    public class Logger
    {
        public static void LogDamage(string name, int damage)
        {
            Console.WriteLine($"{name} takes {damage} damage.");
        }
    
        public static void LogHeal(string name, int amount)
        {
            Console.WriteLine($"{name} heals {amount} health.");
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Character hero = new Character("Hero", 100);
            hero.TakeDamage(10);
            Logger.LogDamage(hero.Name, 10);
            hero.Heal(5);
            Logger.LogHeal(hero.Name, 5);
        }
    }
    

     

    이렇게 클래스를 분리함으로써, 각 클래스는 자신의 책임에만 집중하게 되며, 코드의 유지보수성과 확장성이 향상된다.