Programming/Java

SOLID, 객체 지향 설계 원칙

사랑우주인 2022. 2. 25. 04:22

SOLID

객체 지향 설계 다섯 가지 원칙

- S: Single Responsibility Principle

- O: Open Closed

- L: Liskov Substitution Principle

- I: Interface Segregation Principle

- D: Dependency Inversion Principle


S: Single Responsibility Principle, 단일 책임 원칙

- 하나의 클래스는 하나의 책임(기능)을 가져야 한다.

- 책임의 캡슐화

public class Car{
	private Seat seat; 
    private Heater heater; 
    private Wheel wheel;
}

O: Open Closed Principle, 개방 폐쇄 원칙

- 기능 추가 시, 기존 코드 변경이 없어야 한다.

- ex) 상속


L: Liskov Substitution Principle, 리스코프 치환 원칙

- 하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는데 문제가 없어야 한다."

- 객체 지향에서의 상속은 조직도나 계층도가 아닌 분류도가 되어야 한다.

계층도의 예

춘향이는 아버지형의 객체 참조 변수이기에 아버지 객체가 가진 행위(메서드)를 할 수 있어야 하는데 춘향이에게 아버지의 어떤 역할을 시킬 수 있을까 ?

분류도의 예

논리적인 흠이 없다. 팽귄 한마리 이름은 뽀로로이고, 동물의 행위(메서드)를 잇게하는데 전혀 이상함이 없다.
아버지 - 딸 구조(계층도/조직도)는 리스코프 치환 원칙을 위배하고 있는 것이고, 동물 - 펭귄 구조(분류도)는 리스코프 치환 원칙을 만족하는 것이다.


I: Interface Segregation Principle, 인터페이스 분리 원칙

- 하나의 일반적인 인터페이스보다 여러개의 구체적인 인터페이스 사용해야 한다. 

public interface Animal{

	public void 짖다();
    public void 걷다();
}
//강아지, 고양이는 같은 동물에 속하지만, 고양이는 짖지 않는다. 
//위의 코드는 ISP에 위배

public interface Dog{
	public void 짖다(); 
    public void 걷다();
}

public interface Cat{ 
    public void 걷다();
}

D: Dependency Inversion Principle, 의존 역전 원칙

- 의존 관계를 가질 때는 하위 개념보다 상위 개념 또는 추상화된 것에 의존해야 한다.

public class Rabbit{
	private Carrot feed;
  	...

}

public class Rabbit{
	private Apple feed;
	...
}

//Carrot, Apple의 상위 클래스 Vegetable
public class Rabbit{
	private Vegetable feed;
	...
}

 


참고
https://ktko.tistory.com/entry/자바-객체-지향의-원리-SOLID-LSP-리스코프-치환-원칙 [KTKO 개발 블로그와 여행 일기]