-
SOLID 원칙 (객체지향 5대원칙)CS/프로그래밍 공통 2021. 4. 5. 00:59
1. SRP, Single Reponsibility Principle (단일 책임 원칙)
- 소프트웨어의 설계 부품(클래스, 함수 등)은 단 하나의 책임(기능)만을 가져야 한다.
- 프로그램 변경에 영향을 받는 부분이 적어야 함 -> 응집도는 높고, 결합도는 낮은 프로그램
2. OCP, Open-Close Principle (개방-패쇄 원칙)
- 기존의 코드를 변경하지 않고(Close) 기능을 수정하거나 추가할 수 있도록(Open) 설계해야 한다.
public class SoundPlayer { public void play() { System.out.println("play was"); } } public class Client { public static void main(String[] args) { SoundPlayer sp = new SoundPlayer(); sp.play(); } }
- MP3 파일을 재생하도록 요구사항이 변경되면 SoundPlayer의 play() 메소드를 수정해야 한다. -> OCP 원칙 위배
- 수정을 위해서는 우선 변해야 하는 것이 무엇인지 정의 -> play() 메소드가 변해야 하는 부분이고 이 메소드를 인터페이스로 분리
public interface PlayAlgorithm { public void play(); } public class Wav implements PlayAlgorithm { @Override public void play() { System.out.println("Play Wav"); } } public class Mp3 implements PlayAlgorithm { @Override public void play() { System.out.println("Play Mp3"); } } public class SoundPlayer { private PlayAlgorithm file; public void setFile(PlayAlgorithm file) { this.file = file; } public void play() { file.play(); } } public class Client { public static void main(String[] args) { SoundPlayer sp = new SoundPlayer(); sp.setFile(new Wav()); sp.setFile(new Mp3()); sp.play(); } }
3. LSP, Liskov Substitution Principle (리스코프 치환 원칙)
- 자식 클래스는 부모 클래스에서 정의한 행위를 수행할 수 있어야 한다.
- 자식 클래스와 부모 클래스 사이의 행위에는 일관성이 있어야 한다.
4. ISP, Interface Segregation Principle (인터페이스 분리 원칙)
- 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다.
- 하나의 일반적인 인터페이스보다는 여러 개의 구체적인 인터페이스가 낫다.
5. DIP, Dependency Inversion Priciple (의존 역전 원칙)
- 의존 관계를 맺을 때, 변화하기 쉬운것 보다는 변화하기 어려운 것에 의존해야 한다는 원칙이다.
- 변화하기 쉬운 것 -> 구체화된 클래스
- 변화하기 어려운 것 -> 추상 클래스나 인터페이스