목표 : 객체지향 프로그래밍에서 '단일 책임 원칙(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
소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀있어야한다. 새롭게 확장해도 사용 영역의 변경은 닫혀있다.