Learning
When: 1학년 8월 7일
How:
SOLID 원칙을 배운 적이 있지만 제대로 알지 못해 응용도 제대로 못했기 때문에 더욱 자세히 알고자 공부하게 되었습니다.
Understanding:
L : 리스코프 치환 원칙 (Liskov Substitution Principle, LSP)
- 정의 : 리스코프 치환 원칙은 부모의 클래스에서 가능했던 것이 자식의 클래스에서 안되면 안 된다는 원칙입니다. 예를 들어 새 클래스를 만들고 그 클래스 안에 Fly() 메서드를 만들었다고 생각해 봅시다. 하지만 새 클래스의 자식인 펭귄 클래스에서는 Fly() 메서드를 구현할 수 없습니다. 펭귄은 날 수 없기 때문이죠. 그렇기 때문에 throw문으로 예외를 던지거나 Console.WriteLine("펭귄은 날 수 없습니다."); 이런 식으로 메서드를 오버라이드 해야 할 것입니다. 하지만 여기서는 날 수 있는 새 클래스와 날 수 없는 새 클래스로 나누던지 해서 구조를 바꿔주어야 합니다. Fly() 메서드의 구현 부분이 문제입니다. 펭귄은 못 나는 새니까 예외 처리하는 것이 뭐가 문제냐고 물으실 수 있지만, 부모와 자식의 관계를 조금 더 자세히 살펴보면 이 코드가 왜 문제인지 알 수 있습니다. 제가 예전에 인터페이스를 설명한 글에 나오는 약속에 대해 조금 설명해 보자면 약속은 잘 나가는 양식 레스토랑의 사장이 친한 레스토랑으로 좋은 직원을 보내주는 것입니다. 이 직원은 파스타도 만들 줄 알고, 스테이크도 구울 줄 안다는 것을 직접 설명하며 글로 적어주진 않았지만 받는 사장님은 굳이 말하지 않아도 알고 있습니다. 좋은 직원을 준다고 했으니 말이죠. 방금 한 것이 일종의 약속인 셈입니다. 그리고 그 직원이 갑자기 파스타를 할 줄 모른다고 하면 친구 사장은 당황하고 배신감을 느낄 것입니다. 방금 펭귄 클래스의 객체한테 날라고 시켰는데 날 줄 모른다고 한 것과 똑같은 상황인 것입니다. 상속과 추상화는 떼려야 뗄 수가 없는 관계인데, '부모는 할 수 있는데, 자식은 못해요.'라고 하는 것은 추상화를 완전히 무시하는 것이기 때문에 이 원칙을 지켜야 하는 것입니다.
Result: 처음에 공부할 때는 감이 안 잡혔는데 속으로 앞서 말한 상황을 생각해 보니 한 번에 이해가 되어 프로그래밍의 세계는 참 알다가도 모르겠다는 생각이 들었습니다.
'C#' 카테고리의 다른 글
| [C#] SOLID 원칙 (5 : D/DIP) (2) | 2025.08.10 |
|---|---|
| [C#] SOLID 원칙 (4 : I/ISP) (1) | 2025.08.08 |
| [C#] SOLID 원칙 (2 : O/OCP) (3) | 2025.08.06 |
| [C#] SOLID 원칙 (1 : S/SRP) (3) | 2025.08.05 |
| [C#] IndexOutOfRangeException과 ArgumentOutOfRange 에러의 차이 (1) | 2025.08.04 |