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. 맛있다.")
// ...
}
}
[참고]
💠 완벽하게 이해하는 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
'개발 공부 > 아키텍처' 카테고리의 다른 글
| SOLID 원칙을 알아보자 5 : 의존성 역전 원칙 - kotlin (0) | 2023.08.25 |
|---|---|
| SOLID 원칙을 알아보자 4 : 인터페이스 분리 원칙 - kotlin (0) | 2023.08.22 |
| SOLID 원칙을 알아보자 3 : 리스코프 치환 원칙 - kotlin (0) | 2023.08.09 |
| SOLID 원칙을 알아보자 1 : 단일 책임 원칙 - kotlin (0) | 2023.07.29 |