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...
1. 추상화란?추상화(Abstraction)는 불필요한 구현 세부사항은 감추고, 핵심적인 개념이나 행위만을 정의하여 표현하는 객체지향 설계 원칙이다.즉, "무엇을 할 수 있는가"에 집중하고, "어떻게 구현할 것인가"는 감춘다는 철학 📌Java에서의 예시List 인터페이스만 알아도 ArrayList나 LinkedList의 구체 구현을 몰라도 사용 할 수 있음이처럼 추상화를 통해 사용과 구현을 분리하고, 유연한 설계를 할 수 있다. 📌 예시로 이해하기"TV 리모컨"은 전원을 켜고 채널을 바꿀 수 있음 (기능 = 추상화된 인터페이스)내부적으로 무슨 회로로 동작하는지는 알 필요 없음 (구현 = 캡슐화)public interface RemoteControl { void powerOn(); void ..
1. 다형성이란?다형성(Polymorphism)은 하나의 인터페이스(또는 부모 타입)를 통해 다양한 구현(자식 클래스)의 동작을 수행할 수 있는 객체지향의 핵심 원칙이다. 간단히 말하면 : "같은 메시지를 보냈을 때, 객체가 각자 다른 방식으로 응답하는 능력" 2. 왜 다형성이 중요한가? 📌 유지보수성과 확장성 향상새로운 기능 추가 시 기존 코드 수정 없이 확장 가능 (OCP 원칙 실현)고수준 모듈이 저수준 구현이 아닌 인터페잇에 의존하게 된다 (DIP 원칙 실현)다양한 객체를 하나의 타입으로 다룰 수 있음📌 의존성 분리 (Decoupling)클라이언트 코드는 인터페이스만 알고 구체 구현은 모름 -> 유연한 설계 가능📌 테스트 용이성인터페이스 덕분에 Mock 객체를 쉽게 주입하여 단위 테스트가 가능..