본문 바로가기

Design Pattern

SOLID Principles Series 1 : Single Responsibility (단일 책임 원칙)

SOLID Principles - Single Responsibility

소프트웨어 개발에서 SOLID 원칙 중 하나인 단일 책임 원칙은 하나의 클래스가 목적에 부합하는 단 하나의 책임만을 가져야 한다는 원칙입니다. 이를 통해 클래스의 역할과 책임이 명확히 분리되어 유지보수성과 확장성이 향상됩니다.

예시 1: 함수 분리

다음은 함수 분리의 예시입니다.

func add(first: Int, second: Int) -> Int {
  return first + second
}

func numPrint(num: Int) {
  print(num)
}

위의 예시에서 첫 번째 함수는 두 수를 더하고 결과를 반환하는 역할을, 두 번째 함수는 숫자를 프린트해주는 역할을 수행합니다.

이 두 함수는 각각 다른 책임을 가지므로 단일 책임 원칙을 준수하고 있습니다.

두 함수를 합쳐서 코드를 줄일 수도 있지만, 이는 단일 책임 원칙을 위배하게 됩니다.

예시 2: 클래스 분리

다음은 클래스 분리의 예시입니다.

옳지 않은 Sonny 예시:

class Sonny {
  let team: String
  let totalGoals: Int
  
  init(team: String, total: Int) {
    self.team = team
    self.totalGoals = total
  }
  
  func sonKaneDuoTotalGoal() {
    let kane: HarryKane = HarryKane(team: "Tottenham Hotspur F.C.", total: 210)
    print(self.totalGoals + kane.totalGoals)
  }
}

옳지 않은 Sonny 예시에서는 Sonny 클래스 내부에 sonKaneDuoTotalGoal()이라는 메서드가 추가되어 있습니다.

이 메서드는 Sonny 클래스 자체의 책임을 넘어서, Sonny와 Kane의 듀오 토탈 골을 계산하고 출력하는 역할을 수행합니다.

이는 단일 책임 원칙을 위배하는 예시입니다.

옳은 Sonny 예시:

class Sonny {
  let team: String
  let totalGoals: Int
  
  init(team: String, total: Int) {
    self.team = team
    self.totalGoals = total
  }
  
  func returnMyGoals() -> Int {
    return totalGoals
  }
}
let sonny = Sonny(team: "Tottenham Hotspur F.C.", total: 100)
let kane = HarryKane(team: "Tottenham Hotspur F.C.", total: 210)
print(sonny.totalGoals + kane.totalGoals)

옳은 Sonny 예시에서는 Sonny 클래스가 자신의 팀과 총 득점 수를 나타내는 역할을 수행하도록 수정되었습니다.

클래스 내부에는 자신의 골 수를 반환하는 returnMyGoals() 메서드만 존재합니다. 이렇게 함으로써 Sonny 클래스는 단일 책임 원칙을 준수하게 됩니다.

 

위의 코드는 외부에서 Sonny 인스턴스와 Kane 인스턴스를 생성하고, 두 선수의 총 득점 수를 더한 값을 출력하는 방식입니다.

이렇게 함으로써 Sonny 클래스는 자신의 역할에 집중하고, 듀오 토탈 골을 계산하거나 출력하는 책임은 외부에서 처리될 수 있습니다.