[ Java ] Srp와 Ocp


목표 : 객체지향 프로그래밍에서 '단일 책임 원칙(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
소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀있어야한다. 새롭게 확장해도 사용 영역의 변경은 닫혀있다.
Subscribe to my newsletter
Read articles from Soyulia directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Soyulia
Soyulia
Nice to meet u :) Im Backend Developer