SOLID 원칙은 유지보수성, 확장성, 유연성, 테스트 용이성을 갖춘 객체지향 설계를 위한 핵심 5대 원칙이다.이 원칙을 제대로 이해하고 실무에 적용하면, 요구사항 변경에도 끄떡없는 탄탄한 시스템을 만들 수 있다. 1. SRP - 단일 책임 원칙 (Signle Responsibility Principle) 📌 정의"하나의 클래스는 하나의 책임만 가져야 한다."정확히 말하면 클래스는 오직 하나의 변경 이유만 가져야 한다. 🎯 왜 중요한가?여러 책임을 가진 클래스는 변경 범위가 커짐하나의 책임이 바뀔 때 전혀 관련 없는 기능까지 깨질 위험있음테스트가 어려워지고 응집도가 낮아짐❌ 위반 예시public class ReportManager { void generateReport() { ... } v..
1. DIP란?DIP (Dependency Inversion Principle)"상위 모듈은 하위 모듈에 의존하면 안 된다"모두가 추상화(인터페이스)에 의존해야 한다" 📌 DIP의 핵심고수준 모듈(비즈니스 로직)과 저수준 모듈(구현 세부사항)이 서로 구체적인 것에 의존하지 않고, 공통된 추상화에 의존해야 한다는 원칙이다.2. DIP가 필요한 이유❌ DIP를 지키지 않으면고수준 로직이 저수준 세부 구현에 강하게 결합구현이 바뀌면 고수준 로직도 수정해야 해서 유지보수성 급격히 저하코드 재사용과 확장이 어려움✅ DIP를 지키면고수준 모듈이 구현 변화에 영향받지 않음새로운 기능 추가/변경 시 기존 로직에 영향 최소화의존성 관리가 명확해지고 테스트가 쉬워짐❌3. DIP 위반 예시public class FileL..
1. ISP란?"클라이언트는 자신이 사용하지 않는 메서드에 의존하면 안 된다"즉, 하나의 거대한 인터페이스를 만들어서 모든 기능을 몰아넣지 않는다.클라이언트(사용자)의 관점에 맞춰 필요한 인터페이스만 제공하라는 원칙이다.2. 왜 ISP가 필요한가?❌ Fat Interface(비대한 인터페이스)의 문제클라이언트가 불필요한 메서드까지 강제로 구현하거나 알게 됨구현체가 사용하지 않는 기능에 끌려가서 변화에 민감해짐인터페이스 하나 수정 시, 모든 구현체가 영향받는 변경 전파 문제✅ ISP를 지키면필요한 기능만 알게 되어 의존성 최소화변경이 국소화되고, 코드 유지보수가 쉬워짐인터페이스 별로 역할이 명확해져서 설계가 깔끔해짐❌3. ISP 위반 예시 📌 문제 코드public interface Machine { ..
1. LSP란?리스코프 치환 원칙은 "서브타입은 언제나 자신의 기반 타입(부모 타입)으로 교체할 수 있어야 한다"는 원칙이다. 📌 원칙의 핵심"자식 클래스는 부모 클래스를 대체해도 동작에 문제가 없어야 한다"LSP를 만족하면 클라이언트는 부모 타입(추상 타입)만 보고도 구현체(자식 클래스)에 상관없이 동일한 방식으로 사용할 수 있어야 한다.2. LSP를 이해하는 질문이 자식 클래스는 진짜 is-a 관계인가?부모 클래스를 사용하는 코드에서 자식 클래스를 넣었을 때, 기능이 깨지지 않는가?다형성을 깨지 않고 안전하게 확장할 수 있는가?3. LSP 위반 예시 (고전적인 Rectangle vs Square)public class Rectangle { protected int width; protec..
1. OCP란?OCP (Open/Closed Principle)"소프트웨어 구성 요소는 확장에는 열려(Open)있고, 변경에는 닫혀(Closed) 있어야 한다." 기능이 확장될 수 있어야 하고기존의 코드는 변경하지 않아야 한다는 객체지향 설계 원칙이다.📌 즉, 새로운 요구사항이 생겨도 기존 코드를 수정하지 않고, 기능 추가만으로 시스템을 확장할 수 있어야 한다는 뜻이다. 2. 왜 OCP가 중요한가? ✅ OCP를 지키면코드 변경 없이 새로운 기능을 추가할 수 있어 유지보수에 강함기존 코드를 건드리지 않으므로 사이드 이펙트가 줄고 테스트가 쉬움기능 추가가 많고, 요구사항이 자주 바뀌는 비즈니스 영역에서 매우 중요❌ OCP를 지키지 않으면기존 클래스에 계속 조건문이나 분기 로직이 추가됨 (if/else 지옥..
1. 단일 책임 원칙(SRP)란?"클래스는 단 하나의 책임만 가져야 한다."여기서 말하는 '책임'이란 변경의 이유(Reason to Change)이다.즉, 클래스는 오직 하나의 변경 이유만 가져야 한다는 것이 핵심이다.2. SRP가 필요한 이유 📌 SRP가 지켜지지 않으면?하나의 클래스가 너무 많은 역할을 담당 -> 높은 결합도한 기능이 바뀌면, 관련 없는 기능도 영향을 받음유지보수가 어렵고, 테스트도 어려워짐📌 SRP가 지켜지면?클래스가 하나의 역할만 담당 -> 낮은 결합도, 높은 응집도변경이 국소화되어 예측 가능테스트 단위가 작아지고 명확함❌ 3. SRP 위반 예제public class ReportManager { public void generateReport() { // 1...