개발 공부/아키텍처

SOLID 원칙을 알아보자 2 : 개방-폐쇄 원칙 - kotlin

yong_DD 2023. 8. 3. 16:44

SOLID 원칙이란?

Single Responsibility Principle

→ 

단일 책임 원칙

Open-Closed Principle 

→ 

개방-폐쇄 원칙

Liskov Substitution Principle 

→ 

리스코프 치환 원칙

Interface Segregation Principle 

→ 

인터페이스 분리 원칙

Dependency Inversion Principle

→ 

의존성 역전 원칙


Open-Closed Principle 

 개방-폐쇄 원칙 

소프트웨어 개체는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다

열려 있다(Open)

- 새로운 기능을 추가 할 수 있으며, 추가 시 큰 힘을 들이지 않고 추가

닫혀 있다(Close)

- 수정에 대해서는 폐쇄적이여야함

- 코드를 수정해도 이를 사용하는 다른 곳에 영향을 미치지 않아야함 (유연하게 대응할 수 있어야함)

 


[예제 코드]

data class Fruit (val name:String)

// 과일을 받아 과일의 색을 알려 주는 클래스
class InformationOfFruits {
    fun getColorOfFruit(fruit : Fruit)  {
        if(fruit.name == "사과") {
            println("빨간색")
        } else if (fruit.name == "바나나") {
            println("노란색")
        }
    }
}

fun main(arg: Array<String>) {
    val info = InformationOfFruits()
    val apple = Fruit("사과")
    val banana = Fruit("바나나")

    info.getColorOfFruit(apple) // 빨간색
    info.getColorOfFruit(banana) // 노란색
}

단순히 사과랑 바나나만 있다면 크게 문제가 없을 것이다.

하지만 귤, 딸기, 두리안, 파파야 등 다른 여러 과일들이 필요하다면?

불필요한 if문이 남발 될 것이며 그를 통해 추가 될 때마다 코드를 변경 해줘야하고 한 눈에 알아보기도 어렵다.

 

interface Fruit  {
    fun getColorOfFruit(){}
}

class Apple : Fruit {
    override fun getColorOfFruit() {
        super.getColorOfFruit()
        println("빨간색")
    }
}

class Banana : Fruit {
    override fun getColorOfFruit() {
        super.getColorOfFruit()
        println("노란색")
    }
}

class Tangerine : Fruit {
    override fun getColorOfFruit() {
        super.getColorOfFruit()
        println("주황색")
    }
}

class Papaya : Fruit {
    override fun getColorOfFruit() {
        super.getColorOfFruit()
        println("초록색")
    }
}

class InformationOfFruits {
    fun getColorOfFruit(fruit : Fruit)  {
        fruit.getColorOfFruit()
    }
}

fun main(arg: Array<String>) {
    val info = InformationOfFruits()
    val apple = Apple()
    val banana = Banana()
    val tangerine = Tangerine()
    val papaya = Papaya()

    info.getColorOfFruit(apple) // 빨간색
    info.getColorOfFruit(banana) // 노란색
    info.getColorOfFruit(tangerine) // 주황색
    info.getColorOfFruit(papaya) // 초록색
}

공통적으로 사용하는 Fruit를 추상화하여 각 과일 class로 상속 하도록 했다.

이렇게 작성하게 되면 getColorOfFruit()는 변경에 닫히고, 추가적인 기능은 늘릴 수 있도록 된다.

 

interface Fruit  {
    fun getColorOfFruit(){}
    fun getKorName(){}
}

class InformationOfFruits {
    fun getColorOfFruit(fruit : Fruit)  {
        fruit.getColorOfFruit()
    }

    fun getKorName(fruit : Fruit) {
        fruit.getKorName()
    }

    fun advantageOfFruits() {
        println("1. 비타민이 많다.")
        println("2. 맛있다.")
        // ...
    }
}

 

 

 

[참고]

https://inpa.tistory.com/entry/OOP-%F0%9F%92%A0-%EC%95%84%EC%A3%BC-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-OCP-%EA%B0%9C%EB%B0%A9-%ED%8F%90%EC%87%84-%EC%9B%90%EC%B9%99

 

💠 완벽하게 이해하는 OCP (개방 폐쇄 원칙)

개방 폐쇄 원칙 - OCP (Open Closed Principle) 개방 폐쇄의 원칙(OCP)이란 기존의 코드를 변경하지 않으면서, 기능을 추가할 수 있도록 설계가 되어야 한다는 원칙을 말한다. 보통 OCP를 확장에 대해서는

inpa.tistory.com

https://steady-coding.tistory.com/378

 

[SOLID] 개방 폐쇄 원칙(OCP)이란?

안녕하세요? 제이온입니다. 저번 시간에는 단일 책임 원칙에 대해서 알아보았습니다. 오늘은 개방 폐쇄 원칙을 설명하겠습니다. 개방 폐쇄 원칙 (Open-Closed Principle)의 정의 개방 폐쇄 원칙은 "확

steady-coding.tistory.com