[c#] 클래스 설계 원칙

C#는 객체 지향 프로그래밍 언어로, 클래스는 프로그램의 중요한 구성 요소입니다. 이 문서에서는 효율적이고 유연한 클래스를 설계하기 위한 몇 가지 원칙을 살펴보겠습니다.

1. 단일 책임 원칙 (Single Responsibility Principle)

클래스는 하나의 책임만을 가져야 합니다. 즉, 하나의 클래스는 하나의 기능 또는 역할에만 집중해야 합니다. 이를 통해 클래스는 더 작고 명확하며, 유지 보수가 쉬워집니다.

public class FileManager
{
    public void ReadFile() { /* 파일 읽기 로직 */ }
    public void WriteFile() { /* 파일 쓰기 로직 */ }
}

2. 개방-폐쇄 원칙 (Open-Closed Principle)

클래스는 확장에는 열려 있고 변경에는 닫혀 있어야 합니다. 기존의 코드를 변경하지 않고 새로운 기능을 추가할 수 있도록 설계해야 합니다. 이를 위해 추상화와 다형성을 적극 활용해야 합니다.

public abstract class Shape
{
    public abstract double Area();
}

public class Circle : Shape
{
    public override double Area() { /* 원의 넓이 계산 로직 */ }
}

public class Rectangle : Shape
{
    public override double Area() { /* 직사각형의 넓이 계산 로직 */ }
}

3. 리스코프 치환 원칙 (Liskov Substitution Principle)

파생 클래스는 기본 클래스를 대체할 수 있어야 합니다. 즉, 상속 관계에서 파생 클래스는 기본 클래스로 대체 가능해야 합니다. 이를 통해 다형성을 보장하고 코드의 재사용성을 높일 수 있습니다.

public class Bird
{
    public virtual void Fly() { /* 새의 날기 로직 */ }
}

public class Ostrich : Bird
{
    public override void Fly() { throw new NotImplementedException("타조는 날지 못합니다."); }
}

4. 인터페이스 분리 원칙 (Interface Segregation Principle)

인터페이스는 클라이언트에 특화되도록 분리되어야 합니다. 클라이언트가 사용하지 않는 메서드에 의존하지 않도록 인터페이스를 작게 나누어야 합니다. 이를 통해 인터페이스의 응집성을 높일 수 있습니다.

public interface IEmail
{
    void SendEmail();
}

public interface ISMS
{
    void SendSMS();
}

위의 설계 원칙을 따르면 유연하고 확장 가능한 소프트웨어를 설계할 수 있으며, 변경에 견고한 클래스를 구현할 수 있습니다.

참고 자료