단일 책임 원칙 (Single Responsibility Principle, SRP)은 객체 지향 설계의 핵심 원칙 중 하나입니다. 이 원칙은 클래스나 모듈은 단 하나의 책임만 가져야 하며, 그 책임에 대해서만 변경되어야 한다는 것을 말합니다. 각 클래스는 하나의 기능 또는 책임을 가져야 하고, 해당 책임을 완전히 캡슐화해야 합니다. 이를 통해 코드의 응집도를 높이고, 유지보수성을 향상시킬 수 있습니다.
코드의 응집도를 높입니다:
각 클래스가 하나의 책임만 담당하면 클래스의 응집도가 높아집니다. 이는 클래스가 특정 기능에 집중되어 있어서 클래스 내부의 코드가 서로 연관되어 있고, 변경이 필요한 경우 해당 클래스만 수정하면 되므로 코드의 가독성과 유지보수성이 향상됩니다.
코드의 재사용성을 높입니다:
단일 책임 원칙을 준수하는 클래스는 특정 기능에 집중되어 있기 때문에 다른 곳에서 사용하기 쉬워집니다. 이는 코드의 재사용성을 높여 개발 생산성을 향상시킵니다.
변경에 대한 영향을 줄입니다:
클래스가 단일 책임을 가지고 있다면, 특정 기능의 변경이 다른 기능에 영향을 미치지 않습니다. 책임이 분리되어 있기 때문에 변경 사항이 해당 책임만 영향을 미치므로 시스템의 안정성이 유지됩니다.
책임을 분리합니다:
클래스가 한 가지 이상의 책임을 가지고 있다면, 이를 분리하여 여러 클래스로 나눕니다. 각 클래스는 하나의 책임만 갖도록 설계합니다.
의존성을 캡슐화합니다:
클래스 내부의 기능은 외부에 대한 의존성을 최소화하고, 외부에 노출된 인터페이스를 통해 상호작용하도록 설계합니다.
단일 책임을 명확하게 정의합니다:
클래스의 책임을 명확하게 정의하고 문서화하여 모든 개발자가 이를 이해할 수 있도록 합니다.
예를 들어, 소프트웨어에서 사용자 인증과 사용자 정보 관리는 서로 다른 책임입니다. 이를 하나의 클래스에 구현하는 대신 각각의 책임을 갖는 별도의 클래스로 분리할 수 있습니다. 이러한 분리를 통해 각 클래스는 자신의 책임에 집중할 수 있고, 변경이 필요한 경우 해당 클래스만 수정하면 되므로 유지보수성이 향상됩니다.
// 사용자 인증을 담당하는 클래스
public class AuthenticationManager {
public boolean authenticate(String username, String password) {
// 인증 로직 구현
return true;
}
}
// 사용자 정보를 관리하는 클래스
public class UserManager {
public void createUser(String username, String password) {
// 사용자 생성 로직 구현
}
public void updateUser(String username, String newPassword) {
// 사용자 업데이트 로직 구현
}
public void deleteUser(String username) {
// 사용자 삭제 로직 구현
}
}
위의 예시에서 AuthenticationManager 클래스는 사용자 인증에만 집중하고, UserManager 클래스는 사용자 정보 관리에만 집중합니다. 이렇게 단일 책임 원칙을 준수하면 클래스 간의 결합도를 낮출 수 있고, 각 클래스를 독립적으로 변경하거나 재사용할 수 있게 됩니다.