[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();
}
위의 설계 원칙을 따르면 유연하고 확장 가능한 소프트웨어를 설계할 수 있으며, 변경에 견고한 클래스를 구현할 수 있습니다.