[ Java ] Srp와 Ocp

[ Java ] Srp와 Ocp

·

2 min read

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