이 글은 'Readable Code: 읽기 좋은 코드를 작성하는 사고법' 이라는 강의를 보고 정리하였다.
Readable Code: 읽기 좋은 코드를 작성하는 사고법| 박우빈 - 인프런 강의
현재 평점 4.9점 수강생 1,506명인 강의를 만나보세요. 이 강의를 통해 클린 코드 원칙에 대한 깊은 이해를 하고, 객체 지향 사고 방식에 입각한 깔끔한 코드를 작성할 수 있게 됩니다. 클린 코드와
www.inflearn.com
1. SRP (Single Responsibility Principle) - 단일 책임 원칙
하나의 클래스는 하나의 책임만 갖는다.
- 하나의 클래스는 단 한가지의 변경 이유(=책임)만을 가져야 한다.
- 객체가 가진 공개 메서드, 필드, 상수 등은 해당 객체의 단일 책임에 의해서만 변경되는가?
- 관심사의 분리
- 높은 응집도, 낮은 결합도
클래스가 변경될 이유는 한 가지로, 클래스 설계 시, 하나의 관심사로 응집하여 구현하도록 해야 한다.
2. OCP (Open/Closed Principle) - 개방/폐쇄 원칙
확장에는 열려있고, 수정에는 닫혀 있어야 한다.
기존 코드의 변경 없이, 기능 추가하도록 설계가 되어야 한다.
추상화와 다형성을 활용해서 OCP를 지킬 수 있다.
3. LSP (Liskov Substitution Principle) - 리스코프 치환 원칙
자식은 부모의 역할을 대체할 수 있어야 한다.
✅ 상속 구조에서, 부모의 클래스의 인스턴스를 자식 클래스의 인스턴스로 치환할 수 있어야 한다.
→ 자식 클래스는 부모 클래스의 책임을 준수하며,
부모 클래스의 행동을 변경하지 않아야 한다.
✅ LSP를 위반하면, 상속 클래스를 사용할 때
오동작, 예상 밖의 예외가 발생하거나,
이를 방지하기 위한 불필요한 타입 체크가 동반될 수 있다.
부모 클래스에서 정의한 스펙을 자식 클래스에서도 지켜야 한다.
instance of로 타입 체크하여 특정 타입에 대해서만 처리가 필요하다는 건 LSP를 위반한 사례이다.
4. ISP (Interface Segregation Principle) - 인터페이스 분리 원칙
✅ 클라이언트는 자신이 사용하지 않는 인터페이스에 의존하면 안 된다.
→ 인터페이스를 잘게 쪼개라!
✅ ISP를 위반하면, 불필요한 의존성으로 인해 결합도가 높아지고,
특정 기능의 변경이 여러 클래스에 영향을 미칠 수 있다.
인터페이스는 작고 구체적이어야 한다.
SRP와 비슷하게 인터페이스 또한 한 가지 책임을 가지도록 분리해야한다.
5. DIP (Dependency Inversion Principle) - 의존 역전 원칙
구현이 아닌 추상 클래스에 의존해야 한다.
✅ 상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안 된다.
둘 모두 추상화에 의존해야 한다.
✅ 의존성의 순방향 : 고수준 모듈이 저수준 모듈을 참조하는 것
의존성의 역방향 : 고수준, 저수준 모듈이 모두 추상화에 의존하는 것
→ 저수준 모듈이 변경되어도, 고수준 모듈에는 영향이 가지 않는다.
클래스 참조 시, 추상화 레벨이 높은 인터페이스, 추상클래스, 상위 클래스를 참조하도록 한다.
코드에 구현체가 드러나게 되면 기능 변경시, 클라이언트 코드의 변경이 생기므로
추상화 레벨이 높은 인터페이스 등을 메소드 파라메터, 필드, 리턴타입으로 활용하도록 한다.
Reference
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!