SOLID
01 Apr 2019단일 책임 원칙(Single Responsibility Principle)
- 클래스는 단 한 개의 책임을 가져야 한다.
- 클래스를 변경하는 이유는 단 한 개여야 한다.
개방 폐쇄 원칙(Open Closed Principle)
- 확장에는 열러 있고 변경에는 닫혀 있다.
- 기능을 변경, 확장할 수 있다.
- 그 기능을 사용하는 코드는 수정하지 않는다.
- 추상화나 상속을 통해서 구현
개방 폐쇄 원칙이 깨질 때의 주요 증상
- 다운 캐스팅을 한다
public void drawCharacter(Character character) { if (character instanceof Missile) { // 타입 확인 Missile missile = (Missile) character; // 타입 다운 캐스팅 missile.drawSpecific(); } else { character.draw(); } }
- 비슷한 if-else 블록이 존재한다.
public class Enemy extends Character { private int pathPattern; public Enemy(int pathPattern) { this.pathPattern = pathPattern; } public void draw() { if (pathPattern == 1) { x += 4; } else if (pathPattern == 2) { y += 10; } else if (pathPattern == 4) { x += 4; y += 10; } } }
리스코프 치환 원칙(Liskov Substitution Principle)
- 상위 타입 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작한다.
public void someMethod(SuperClass sc) { sc.someMethod(); } someMethod(new SubClass());
리스코프 치환 원칙은 계약과 확장에 대한 것
- 위반 사례
- 명시된 명세에서 벗어난 값을 리턴한다.
- 명시된 명세에서 벗어난 예외를 발생한다.
- 명시된 명세에서 벗어난 기능을 수행한다.
인터페이스 분리 원칙(Interface Segregation Principle)
- 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 용도에 맞게 분리한다.
의존 역전 원칙(Dependency Inversion Principle)
- 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 된다. 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 한다.
- 고수준 모듈
- 의미 있는 단일 기능을 제공하는 모듈
- 저수준 모듈
- 고수준 모듈의 기능을 구현하기 위해 필요한 하위 기능의 실제 구현
- 고수준 모듈