[ Java ] Srp와 Ocp
![[ Java ] Srp와 Ocp](https://cdn.hashnode.com/res/hashnode/image/upload/v1737273102428/bcde6f94-1a3b-4364-97b4-45278df097ed.png)
목표 : 객체지향 프로그래밍에서 '단일 책임 원칙(SRP)'과 '개방-폐쇄 원칙(OCP)'에 대해 알아보고, 각각의 원칙을 적용한 코드를 살펴보자.
1️⃣SRP ?
한 클래스는 하나의 책임만 가져야한다. 우리는 이를 따르면서 관심사를 분리해야한다. 예를 들어, 다음 코드는 Animal을 정하고 강아지와 고양이에 따라 울음소리가 다른 기능을 함께 갖고있다. 따라서, SRP위반 코드이다.
//SRP 위반 코드
public class Animal{
private String animal;
public void setAnimal(String animal){
this.animal=animal;
}
public void cry(){
if(animal.equals("dog")){
System.out.println("멍멍");
}
else if(animal.equals("cat"){
System.out.println("냐옹");
}
}
}
이를 SRP에 따르도록 수정해보자. Animal 클래스에서는 단순히 함수를 제공하고 Dog와 Cat클래스를 분리해서 강아지일 경우 강아지의 울음소리만 고양이일 경우 고양이의 울음소리만 나도록 책임을 분리한다.
public class Animal{
public void cry(){
System.out.println("동물울음");
}
}
-------------------------------------------
public class Dog extends Animal{
@Overriding
public void cry(){
System.out.println("멍멍");
}
}
-----------------------------------------
public class Cat extends Animal{
@Overriding
public void cry(){
System.out.println("냐옹");
}
}
2️⃣ OCP?
소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀있어야한다. 새롭게 확장해도 사용 영역의 변경은 닫혀있다.
만약 다음 코드에서 소 울음소리를 추가하려면 cry()함수를 수정해야한다. 즉, 기존 코드를 변경해야한다.
//OCP 위반 코드
public class Animal{
private String animal;
public void setAnimal(String animal){
this.animal=animal;
}
public void cry(){
if(animal.equals("dog")){
dogSound();
}
else if(animal.equals("cat"){
catSound();
}
}
public void dogSound(){
System.out.println("멍멍");
}
public void catSound(){
System.out.println("냐옹");
}
}
다음 코드를 기존코드 변경없이 소 울음소리를 추가해보도록 하자. 인터페이스를 이용해서 다형성을 이용하였다. 따라서 Animal의 코드 변경없이 우리는 소 울음소리를 추가할 수 있다.
public interface Animal{
void cry();
}
-------------------------------------------
public class Dog implements Animal{
public void cry(){
System.out.println("멍멍");
}
}
-----------------------------------------
public class Cat implements Animal{
public void cry(){
System.out.println("냐옹");
}
}
------------------------------------------
public class Cow implements Animal{
public void cry(){
System.out.println("음메");
}
}
⚡ 정리
SRP
한 클래스는 하나의 책임만 가져야한다.
OCP
소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀있어야한다. 새롭게 확장해도 사용 영역의 변경은 닫혀있다.
![[Spring] N+1문제 발생과 분석](https://cdn.hashnode.com/res/hashnode/image/upload/v1756727965704/8c24d83c-1a9e-4b4d-b733-c130243cbc6b.png)

![[Project] 날씨에 맞는 옷 추천 서비스 : 지그재그 크롤링 여정 기록 (1) ChromeDriver를 EC2에 설치하기](https://cdn.hashnode.com/res/hashnode/image/upload/v1753843082352/c2452b33-97a4-4148-8ba4-750e5eee6aff.png)
![[Project] 날씨에 맞는 옷 추천 프로젝트: Selenium은 정말 필요한 선택이었을까? - 크롤링 삽질 기록](https://cdn.hashnode.com/res/hashnode/image/upload/v1753343114273/b32cc35e-a2e6-4085-a132-26c72f8792d9.png)
![[Spring] @Cacheable, @CachePut, @CacheEvict](https://cdn.hashnode.com/res/hashnode/image/upload/v1749265456525/51b97bad-f86e-4f0f-9b33-77eaa733176f.png)