S ๋จ์ผ ์ฑ ์ ์์น (Single Responsibility principle)
O ๊ฐ๋ฐฉ ํ์ ์์น (Open Closed Principle)
L ๋ฆฌ์ค์ฝํ ์นํ ์์น (Liscov Substitution Principle)
I ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น (Interface Sergregation Principle)
D ์์กด์ฑ ์ญ์ ์์น (Dependency Inversion Principle)
ํด๋น ๋ชจ๋์ด ์ฌ๋ฌ ๋์ ๋๋ ์กํฐ๋ค์ ๋ํด ์ฑ
์์ ๊ฐ์ ธ์๋ ์๋๊ณ , ์ค์ง ํ๋์ ์กํฐ์ ๋ํด์๋ง ์ฑ
์์ ์ ธ์ผ ํ๋ค.
์ฆ, ํด๋์ค๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ ์ด์ ๋ ์ค์ง ํ๋์ฌ์ผ ํ๋ค.
๐ค๊ทธ๋ผ ํด๋์ค๊ฐ ๋๋ฌด ๋ง์์ง์ง ์์๊น?
โก ํด๋์ค ํ๋๊ฐ ๊ธด ๊ฒ๋ณด๋ค๋ ๋ง์ ๊ฒ ๋ซ๋ค.
// ๋์ ์
class UserSettings {
fun changeUsername(user: User, newUsername: String) {
// ์ฌ์ฉ์ ์ด๋ฆ ๋ณ๊ฒฝ ๋ก์ง
}
fun saveSettings(settings: Settings) {
// ์ค์ ์ ์ฅ ๋ก์ง
}
}
-------------------------------------------------------------
// ์ข์ ์
class User {
fun changeUsername(newUsername: String) {
// ์ฌ์ฉ์ ์ด๋ฆ ๋ณ๊ฒฝ ๋ก์ง
}
}
class SettingsManager {
fun saveSettings(settings: Settings) {
// ์ค์ ์ ์ฅ ๋ก์ง
}
}
ํ์ฅ์ ๋ํด์๋ ์ด๋ ค์๊ณ ์์ ์๋ ๋ซํ์์ด์ผ ํ๋ค๋ ์์น
ํ์ฅ์ ๋ํด ์ด๋ ค์๋ค : ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋ ๋ ์๋ก์ด ๋์์ ์ถ๊ฐํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์๋ค.
์์ ์ ๋ํด ๋ซํ ์๋ค : ๊ธฐ์กด์ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ ๋์์ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๋ค.
// ๋์ ์
class Rectangle {
var width: Double = 0.0
var height: Double = 0.0
}
class AreaCalculator {
fun calculateRectangleArea(rectangle: Rectangle): Double {
return rectangle.width * rectangle.height
}
}
-------------------------------------------------------------
// ์ข์ ์
interface Shape {
fun area(): Double
}
class Rectangle(private val width: Double, private val height: Double) : Shape {
override fun area() = width * height
}
class Circle(private val radius: Double) : Shape {
override fun area() = Math.PI * radius * radius
}
class AreaCalculator {
fun calculateArea(shape: Shape): Double {
return shape.area()
}
}
๋ถ๋ชจ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ ํด๋์ค์ ์ธ์คํด์ค๋ก ๋์ฒดํ ์ ์์ด์ผ ํ๋ค๋ ์์น
ํด๋น ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ ์์ ํ์
์ด ํ์ ํ์
์ผ๋ก ๋ณ๊ฒฝ๋์ด๋ ์ฐจ์ด์ ์ ์ธ์ํ์ง ๋ชปํ ์ฑ ์์ ํ์
์ ํผ๋ธ๋ฆญ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์๋ธ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
// ๋์ ์
open class Bird {
open fun fly() {}
}
class Duck : Bird()
class Ostrich : Bird() {
// ํ์กฐ๋ ๋ ์ ์์ง๋ง Bird ํด๋์ค๋ฅผ ์์๋ฐ์๊ธฐ ๋๋ฌธ์ flay ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
override fun fly() {
throw UnsupportedOperationException("Cannot fly")
}
}
-------------------------------------------------------------
// ์ข์ ์
interface FlyingBird {
fun fly()
}
interface NonFlyingBird {}
class Duck : FlyingBird {
override fun fly() {
// ๊ตฌํ
}
}
class Ostrich : NonFlyingBird {
// ๋นํํ์ง ์๋ ์ ๊ด๋ จ ๊ตฌํ
}
-> ๋ ์ ์๋ ์๋ผ๋ Bird ํด๋์ค๋ฅผ ์์๋ฐ์ผ๋ฉด fly ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
๊ทธ๋์ ๋ ์ ์๋ ์์ ๋ ์ง ๋ชปํ๋ ์๊ฐ ๋ค๋ฅธ ๋์์ ํ๋๋ก ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ๋ถํ๋ค.
๊ฐ์ฒด๋ ์์ ์ด ํธ์ถํ์ง ์๋ ๋ฉ์๋์ ์์กดํ์ง ์์์ผ ํ๋ค๋ ์์น
๋ฌด์๋ฏธํ ๋ฉ์๋์ ๊ตฌํ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฐ๋์ ํ์ํ ๋ฉ์๋๋ง์ ์์/๊ตฌํํ๋๋ก ๊ถ๊ณ ํ๋ค.
// ๋์ ์
interface Worker {
fun work()
fun eat()
}
class HumanWorker : Worker {
override fun work() {
// ์์
}
override fun eat() {
// ์์ฌ
}
}
-------------------------------------------------------------
// ์ข์ ์
interface Workable {
fun work()
}
interface Eatable {
fun eat()
}
class HumanWorker : Workable, Eatable {
override fun work() {
// ์์
}
override fun eat() {
// ์์ฌ
}
}
work, eat ๋ฉ์๋๋ฅผ Worker ์ธํฐํ์ด์ค์ ํ๊บผ๋ฒ์ ๋ฃ์ด๋ฒ๋ฆฌ๋ฉด ๋ ์ค ํ๋๋ง ์ฐ๊ณ ์ถ๋๋ผ๋ ๋ชจ๋ ๊ตฌํํด์ผ ํ๋ค.
์ ์์ค ๋ชจ๋์ด ๊ณ ์์ค ๋ชจ๋์ ์์กดํด์ผ ํ๋ค๋ ์์น
๊ณ ์์ค ๋ชจ๋ : ๋น์ฆ๋์ค ๊ท์น์ด๋ ๋ก์ง์ ์ํํ๋ ํด๋์ค
์ ์์ค ๋ชจ๋ : ์ด๋ฌํ ๋ก์ง์ ์คํํ๋๋ฐ ํ์ํ ์ธ๋ถ์ ์ธ ๊ตฌํ(๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ, I/O ์์
๋ฑ)์ ๋ด๋นํ๋ ํด๋์ค
// ๋์ ์
class LightBulb {
fun turnOn() {}
fun turnOff() {}
}
class Switch(val bulb: LightBulb) {
fun operate() {
bulb.turnOn()
bulb.turnOff()
}
}
-------------------------------------------------------------
// ์ข์ ์
interface Switchable {
fun turnOn()
fun turnOff()
}
class LightBulb : Switchable {
override fun turnOn() {}
override fun turnOff() {}
}
class Switch(val device: Switchable) {
fun operate() {
device.turnOn()
device.turnOff()
}
}
๊ฐ ํ์์ ์ฝ๋ ์ง๋ ๋ฐฉ์์ ๋ดค์ ๋ ์์น์ ์ง์ผฐ์ผ๋ฉด ๋ฌด์กฐ๊ฑด ์ง์ผ์ผ ํ๋ ๊ฒ ๋ง๊ณ ์๋๋ผ๋ฉด ํ๋ ํ๊ตฌ๋ ์๊ฐํ์!