์คํฐ๋๋ฅผ ์ด์ํ๊ณ ์์ต๋๋ค. ํด๋น repository์ ๊ฐ๋ฉด ๋ ๋ง์ ์ ๋ณด๋ฅผ ๋ณด์ค ์ ์์ต๋๋ค!
ํนํ close ๋ PR์ ๋ณด์๋ฉด, ์ด๋ค ๋ถ๋ถ์ ๋ํด์ ๊ณ ๋ฏผํ๊ณ ์คํฐ๋์๋ค๊ณผ ์ด์ผ๊ธฐ๋๋ด๋์ง ๋ณด์ค ์ ์์ต๋๋ค
https://github.com/JulSaMo/CS-start
๐ ๊ฐ์ฒด (Object)
CS์์ ๊ฐ์ฒด๋ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์กด์ฌํ๊ฑฐ๋ ์ถ์์ ์ผ๋ก ์๊ฐํ ์ ์๋ ๊ฒ ์ค์์ ์์ ์ ์์ฑ์ ๊ฐ์ง๊ณ ์๊ณ ๋ค๋ฅธ๊ฒ๊ณผ ์๋ณ ๊ฐ๋ฅํ ๊ฒ์ ๋งํ๋ค. ์ปดํจํฐ๋ฅผ ์๋ก๋ค๋ฉด, 'ํค๋ณด๋, ๋ง์ฐ์ค, ์คํผ์ปค ๋ฑ'์ด ๊ฐ์ฒด๊ฐ ๋ ์ ์๊ณ , ์ด๊ฒ๋ค์ ๊ฐ๊ฐ '์ ๋ ฅ, ์๋ฆฌ์ถ๋ ฅ, ์ธํฐํ์ด์ค ์กฐ์ ๋ฑ'์ ๊ธฐ๋ฅ์ ํฌํจํ๋ค.
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ (OOP, Object Oriented Programming)
๐๊ฐ์ฒด๋ค์ ์ํธ์์ฉ์ผ๋ก ์์ ํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ
ํ์ค์ธ๊ณ์ ๊ฐ์ฒด๋ฅผ ์ํํธ์จ์ด์ ๊ฐ์ฒด๋ก ์ค๊ณํ๋ ๊ฒ (ํ์ค๊ฐ์ฒด์ ์์์ค๊ฐ ๋์์ ์ถ๋ ค๋ด์ ์ํํธ์จ์ด์ ๊ฐ์ฒด์ ํ๋์ ๋ฉ์๋๋ก ์ ์ ํ๋ ๊ณผ์ )
์ฆ, ์ฝ๋๋ก ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ๋ฒ์ด๋ค. ํ๋ก๊ทธ๋จ์ ๊ทธ์ ๋ฐ์ดํฐ์ ์ฒ๋ฆฌ๋ฐฉ๋ฒ์ผ๋ก ๋๋๋ ๊ฒ์ด ์๋, ํ๋ก๊ทธ๋จ์ ๋ค์์ '๊ฐ์ฒด'๋ก ๋ง๋ค์ด๋๊ณ , ๊ฐ์ฒด๋ค๋ผ๋ฆฌ ์๋ก ์ํธ์์ฉ์ ํตํด์ ํ๋์ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด์ง๋ ๋ฐฉ์์ด๋ค.
๊ฐ์ฅ ์ฝ๊ฒ ์ปดํจํฐ๋ก ์๋ฅผ ๋ค๋ฉด, ์ปดํจํฐ ํ๋๋ 'CPU, RAM, BOARD, SSD,,,' ์ฌ๋ฌ๊ฐ์ง์ ๋ถํ๋ค๋ก ๊ตฌ์ฑ๋๊ณ , ๊ฐ ๋ถํ๋ค์ด ๊ฐ๊ฐ์ ๊ธฐ๋ฅ์ ๋ด๋นํ์ฌ ์ํธ์์ฉ์ ํตํด ์ปดํจํฐ๊ฐ ๋์ํ๊ฒ ๋๋ค. ์ด๊ฒ์ฒ๋ผ, ๋ถํ๋ค์ ๊ฐ์ฒด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
๐ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ 4๊ฐ์ง ํน์ฑ (โจ์ค์!)
1๏ธโฃ ์ถ์ํ
๊ฐ์ฒด์ ๊ณตํต์ ์ธ ์์ฑ๊ณผ ๊ธฐ๋ฅ์ ์ถ์ถํ์ฌ ์ ์ํ๋ ๊ฒ
- ์ฆ, ํ์ค์ธ๊ณ์ ์ฌ๋ฌผ์ ๊ฐ์ฒด๋ก ๋ณด๊ณ , ํ์ํ ๊ณตํตํน์ฑ๋ง ๋ค๋ฃจ์ด ํ์ค์ ๋ณต์ก์ฑ์ ์ ๊ฑฐํ๊ณ ๋ชฉ์ ์ ์ง์คํ ์ ์๋๋ก ํ๋ค.
- ์๋ฅผ๋ค์ด ํ ๋ผ, ๊ฐ์์ง, ์ฌ์๋ผ๋ ๊ฐ์ฒด๋ค์ ํ๋์ ๊ณตํต๋ ํน์ง์ ๋ฐํ์ผ๋ก ํฌ์ ๋ฅ ๋ก ์ถ์ํ ํ ์ ์๋ค.
์บก์ํ
2๏ธโฃ
- ๊ฐ์ฒด ์ํ ๋ชฉ์ ์ ๋ฐ๋ผ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ฐ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๊ฒฐํฉ์์ผ ๋ฌถ์ด์, ์ธ๋ถ์ ๋ด๋ถ ๊ธฐ๋ฅ ๊ตฌํ ๋ด์ฉ์ ๊ฐ์ถ๊ณ ์ด์ฉ๋ฐฉ๋ฒ๋ง ์๋ ค์ค.
- ์ธ๋ถ๊ฐ์ฒด๋ ๋ด๋ถ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ฅผ ์์ง ๋ชปํ๊ณ , ๊ฐ์ฒด๊ฐ ๋
ธ์ถํด์ ์ ๊ณตํ๋ ํ๋์ ๋ฉ์๋๋ง ์ด์ฉํ ์ ์์.
์ด๋ ๊ฒ ์ ์ธ๋ถ๊ฐ์ฒด๊ฐ ์์ง ๋ชปํ๊ฒ ์บก์ํ๋ฅผ ํ๋๊ฑด๊ฐ์?
๐์บก์ํ๋ ๊ด๋ จ์๋ ๋ณ์์ ํจ์๋ฅผ ํ๋์ ํด๋์ค๋ก ๋ฌถ๊ณ ์ธ๋ถ์์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ์๋ํ๋๊ฒ ํต์ฌ์ด๋ค. ๊ฐ์ฒด์ ์ง์ ์ ์ธ ์ ๊ทผ์ ๋ง๊ณ ์ธ๋ถ์์ ๋ด๋ถ์ ์ ๋ณด์ ์ง์ ์ ๊ทผํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๊ณ , ๊ฐ์ฒด๊ฐ ์ ๊ทผํ๋ ํ๋์ ๋ฉ์๋๋ฅผ ํตํด์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
์ ์ด๋ ๊ฒ ํ๋๋ฉด, ๋ฐ๋ก ์บก์ํ๋ฅผ ํ๋ฉด ์๋ํํน์ง์ ์ฅ์ ์ ๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ํ์ ์ฅ์
- ์ธ๋ถ์์ ํน์ ๊ฐ์ฒด์ ๋ฐ์ดํฐ ๋ฐ ํจ์์ ์ง์ ์ ๊ทผ์ ๋ง์์ผ๋ก์จ ๋ณ๊ฒฝ์ ๋ชปํ๊ฒ ํ์ฌ, ์ ์ง๋ณด์๋ ํ์ฅ์ ์ค๋ฅ์ ๋ฒ์๋ฅผ ์ต์ํํ ์ ์๋ค. (๊ฐ์ฒด ๋ด ์ ๋ณด ์์, ์ค์ฉ์ ๋ฐฉ์งํ๊ณ , ์กฐ์๋ฒ์ด ๋ฐ๋์ด๋ ์ฌ์ฉ๋ฐฉ๋ฒ ์์ฒด๋ ๋ฐ๋์ง ์์์ ์ค๋ฅ์ ๋ฒ์๋ฅผ ์ต์ํํ๋ค๋ ๊ฒ์ด๋ค.)
- ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ด๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ํฅ์ ์ฃผ์ง ์๋, ๋ ๋ฆฝ์ฑ์ ๊ฐ๋๋ค.
- ์ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก, ์ด์์ฑ์ด ์ข๊ณ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ํ ํ ์ ์์ด์ ์๋ก์ด ์์คํ ์ ๊ตฌ์ฑ์ ํ๋์ ๋ชจ๋์ฒ๋ผ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
์บก์ํ๋ฅผ ์ํด์๋ ์ ๊ทผ์ ์ด์๋ฅผ ํตํด ์ค๊ณ๊ฐ ์ ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค. ์์ ๋ด๋ถ์ ๋ชจ๋์ ๊ฐ์ถ๊ณ ๋ค๋ฅธ ๋ชจ๋ ๋ด๋ถ ์์ ๋ ์ง์ ์ ์ผ๋ก ๊ฐ์ ํ์ง ๋ชปํ๊ฒ ํ๋๋ก ์ค๊ณํด์ผํ๋ค. (ex. public, private, getter, setter ๋ฑ๊ณผ ๊ฐ์ ์ ๊ทผ์ ์ด์๊ฐ ์กด์ฌํ๋ ์ด์ ์ด๊ธฐ๋ ํ๋ค.)\
์์ (Interitance)
3๏ธโฃ์์๊ฐ๋
์ ํน์ง์ ํ์ ๊ฐ๋
์ด ๋ฌผ๋ ค๋ฐ์ ์ฌ์ฉํ๋ ๊ฒ
์์์ ์ ํด์ผํ๋์?
๐- ์ฌ์ฌ์ฉ์ ์ธํด์ ์ฝ๋์ ๊ธธ์ด๋ฅผ ์ค์ด๊ณ , ๊ฐ๋ ์ฑ์ ๋์ธ๋ค.
- ์์์ ์ฝ๋์ ์ฌ์ฌ์ฉ ๊ด์ ์ด ์๋, ๊ธฐ๋ฅ์ ํ์ฅ๊ฐ๋ ์ผ๋ก ์๊ฐํด์ผํ๋ค. (์์ ํด๋์ค์ ์๋ ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ์์๋ฐ๋๋ค๊ณ !)
๋คํ์ฑ (Polymorphism) (โจ์ค์, ๋ฌผ์ด๋ณด๋ ๋ฉด์ ์ข ๋ง์์!)
4๏ธโฃ์์๊ณผ ์ฐ๊ด์๋ ๊ฐ๋
์ผ๋ก, ํ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ์ฌ๋ฌํํ(๊ฐ์ฒด)๋ก ์ฌ๊ตฌ์ฑ๋๋ ๊ฒ
์ฆ, ํ ๋ถ๋ชจ ๋ฐ์์ ์์๋ฐ๋ ์์๋ค์ด ๋ชจ๋ ๋๊ฐ์ง๋ ์๋ค๋ผ๋ ๊ฐ๋ ์ด๋ค.
์ค๋ฒ๋ก๋์ ์ค๋ฒ๋ผ์ด๋๊ฐ ๋คํ์ฑ์ ๋ํ์ ์ธ ์์์ด๋ค. ์ค๋ฒ๋ก๋์ ์ค๋ฒ๋ผ์ด๋ฉ ์ฒ๋ผ, ์์ํด๋์ค๊ฐ ๋ค์ํ ํํ๋ก ์กด์ฌํ ์ ์๊ฒ ํ๋ ํน์ง์ด ๋ฐ๋ก ๋คํ์ฑ์ด๋ค.
๐ ์ค๋ฒ๋ผ์ด๋์ ์ค๋ฒ๋ก๋๊ฐ ๋ญ๊ฐ์? ์ฐจ์ด์ ์ ์์๋์!
์ค๋ฒ๋ผ์ด๋, ์ค๋ฒ๋ก๋๋ฅผ ์ ์ฉํ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ๊ฐ๊ฐ ์ค๋ฒ๋ผ์ด๋ฉ, ์ค๋ฒ๋ก๋ฉ ์ด๋ผ๊ณ ํ๋ค.
์ค๋ฒ๋ผ์ด๋ฉ (Overriding) (Swift ๊ธฐ์ค!)
โ๏ธ์๋ธํด๋์ค๋ ์ํผํด๋์ค์์ ์์ํ ๋ฉ์๋, ํ๋กํผํฐ, ์๋ธ์คํฌ๋ฆฝํธ๋ฅผ ์๋ธํด๋์ค์์ ์ํ๋๋๋ก ๊ตฌํ(์ฌ์ ์)ํ ์ ์๋๋ฐ, ์ด๊ฒ์ ์ค๋ฒ๋ผ์ด๋ฉ ์ด๋ผ๊ณ ํจ.
(โ ๏ธ swift์์์ ์ค๋ฒ๋ผ์ด๋ฉ์ ์ ์ฝ์กฐ๊ฑด์ด ์กฐ๊ธ ์กด์ฌํจ. ํ๋กํผํฐ์ ๊ฒฝ์ฐ ์ ์ฅ์์ฑ๋ง ์ถ๊ฐํ ์ ์๊ณ , ์ด๋ฆ๊ณผ ํ์ ์ ๋ฐ๋์ ๋ช ์ํด์ผํ๊ณ , final์ ๋ถ์ด๋ฉด ๋ ์ด์ ์์์ด ๋ถ๊ฐ๋ฅํ๊ฑฐ๋ ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค.. ๋ฑ ๋ค์ํ ์ ํ ์กฐ๊ฑด์ด ์๋๋ฐ ๋์ค์ ๋ ์์๋ณด์.)
class Human {
func description {
print("๋๋ ์ฌ๋")
{
}
class Teacher: Human { }
์์์ Teacher์ด๋ ํด๋์ค๊ฐ Human์ด๋ผ๋ ํด๋์ค๋ฅผ ์์๋ฐ์๊ธฐ ๋๋ฌธ์ ์๋์ฒ๋ผ description์ด๋ ๋ฉ์๋์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
let brown: Teacher = .init()
brown.description() // Human์ func์ ์ ๊ทผ ๊ฐ๋ฅ!
์ด๋ ๊ฒ ๊ทธ๋ฅ ์ ๊ทผํ๊ฒ ๋๋ฉด, ๋ถ๋ชจํด๋์ค์ Human์ ๊ทธ๋๋ก ์ ๊ทผ๊ฐ๋ฅํ๊ฑด๋ฐ, override๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์๋ฅผ '์ฌ์ ์'ํ ์ ์๋ค.
class Teacher: Human {
override func description() {
print("๋๋ ๋ณด๋ผ์จ!")
}
}
let brown: Teacher = .init()
brown.description()
// ๋๋ ๋ณด๋ผ์จ! ์ด๋ผ๊ณ ์ถ๋ ฅ๋๋ค.
์ด๋ ๊ฒ ํ๋ค๋ฉด, ์ฌ์ ์๋ Teacher์ ์ ๊ทผํ ํ๋กํผํฐ๋ค์ ๋ชจ๋ override ๋ ํจ์๊ฐ ์คํ๋๋ค! ์ด๊ฒ์ด ๋ฐ๋ก ์ค๋ฒ๋ผ์ด๋ฉ์ ๋ํ ๊ฐ๋ ์ด๋ค.
์ค๋ฒ๋ก๋ฉ (Overloading) (Swift ๊ธฐ์ค!)
โ๏ธํจ์์ ์ด๋ฆ์ ๊ฐ์ผ๋, ๋งค๊ฐ๋ณ์, ๋ฆฌํดํ์ ๋ฑ์ผ๋ก ๋ค๋ฅด๊ฒ ์ค์ ํ์ฌ ํจ์๋ฅผ ์ค๋ณต์ผ๋ก ์ ์ธํ ์ ์๋ค๋ ๊ฐ๋ ์ด๋ค. Swift๋ ์ค๋ฒ๋ก๋ฉ์ ํ์ฉํ๊ณ , ํจ์, ์๋ธ์คํฌ๋ฆฝํธ, ์์ฑ์์์ ์ฌ์ฉํ ์ ์๋ค.
์ด ๊ฐ๋ ์, ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ์ฐ์ด๋ ๊ฐ๋ ์ด๋ผ๊ณ ์ ์์๋์!
func sum() { }
func sum() { }
์ด๋ ๊ฒ ํ๊ฒ ๋๋ฉด, Invalid redclaration of "sum()" ์ด๋ผ๋ ์๋ฌ๊ฐ ๋จ๊ฒ๋๋ค. ํจ์๊ฐ ์ฌ์ ์ธ๋๋ค๋ ์๋ฌ์ด๋ค. Swift๋ ์ค๋ฒ๋ก๋ฉ์ ์ง์ํ๊ธฐ ๋๋ฌธ์, ์๋์ ๊ฐ์ด ํ๋ผ๋ฏธํฐ๋ ๋ฆฌํด๊ฐ์ ๋ค๋ฅด๊ฒ ํ์ฌ ํจ์๋ฅผ ์ฌ์ ์ํ๋ฉด ์๋ฌ๊ฐ ๋์ง ์๋๋ค.
func sum() { }
func sum(_a: Int, _ b: Int) { }
func sum() -> Int { return 0 }
์ด๋ ๊ฒ ์ธ ํจ์๋ sum()์ด๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง๋ง ๊ฐ๊ฐ ๊ฐ๊ณ ์๋ ๋งค๊ฐ๋ณ์, ๋ฆฌํด๊ฐ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ฌ์ ์ธ๋๋ค๋ ์๋ฌ๊ฐ ๋์ง ์๋๋ค. ์ด๋ ์ค๋ฒ๋ก๋ฉ ๊ฐ๋ ์ ์ง์ํ๋ ํน์ฑ ๋๋ฌธ์ด๋ค.
์ฆ, ํจ์๋ฅผ ์๋ณํ ๋ ํจ์ ์ด๋ฆ ๋ฟ๋ง ์๋๋ผ, ํจ์ ์ด๋ฆ, ํ๋ผ๋ฏธํฐ(ํ์ , ๊ฐ์, argument label), ๋ฆฌํดํ์ ๋ชจ๋๋ฅผ ๊ณ ๋ คํด์ ํจ์๋ฅผ ์๋ณํ๋ค๊ณ ์ ์ ์๋ค. ์ค๋ฒ๋ก๋ฉ์ ์ฅ์ ์, ํ์ ์ด๋ ๋ฆฌํด๊ฐ์ด ๋ค๋ฅด์ง๋ง, ๋์ผํ ๊ธฐ๋ฅ์ ํ๋ ํจ์๋ฅผ ํ๋๋ก ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ด๋ค.
// โ ์ค๋ฒ๋ก๋ฉ์ ์ง์ํ์ง ์๋๋ค๋ฉด
func sumString(_ a: String, _ b: String) -> String {
return a + b
}
func sumInt(_ a: Int, _ b: Int) -> Int {
return a + b
}
sumInt(1, 2)
sumString("ABC","DEF")
// โ
์ค๋ฒ๋ก๋ฉ์ ์ง์ํ๋ ๊ฒฝ์ฐ
func sum(_ a: Stirng, _ b: String) -> String {
return a + b
}
func sum(_ a: Int, _ b: Int) -> Int {
return a + b
}
sum(1,2)
sum("ABC","DEF")
์ ๋๊ฐ์ ํจ์๋ ๋ชจ๋ sum ๊ธฐ๋ฅ์ ํ๋ค. ํ์ง๋ง ์ค๋ฒ๋ก๋ฉ์ ์ง์ํ์ง ์๋ ๊ฒฝ์ฐ์๋ sumString sumInt๋ก ๋ฐ๋ก ๊ตฌ๋ถํด์ ํ์ ๋ณ๋ก ํจ์๋ฅผ ์์ฑํด์ฃผ์ด์ผํ๋ค. ํ์ง๋ง, ์ค๋ฒ๋ก๋ฉ์ด ๊ฐ๋ฅํ๋ค๋ฉด, ์๋์ ๊ฒฝ์ฐ์ฒ๋ผ sum ํ๋์ ํจ์์ด๋ฆ์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. (๊ฒฐ๊ตญ ๋ค๋ฅธํจ์๊ธด ํ์ง๋ง, ์ฝ๋๋ฅผ ์์ฑํ๋ ์ ์ฅ์์๋ ๋งค์ฐ ํธ๋ฆฌํ๊ณ , ๊ฐ๋ ์ฑ ๋ํ ์ข์์ง๋ค.)
OOP์ ์ฅ์
๐ธ- ์ฌ์ฌ์ฉ์ฑ: ์์์ ํตํด ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ผ ์ ์๋ค.
- ์์ฐ์ฑ ํฅ์: ์ ์ค๊ณ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ ๋ ๋ฆฝ์ ์ธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์ ์์ฐ์ฑ์ ํฅ์์ํฌ ์ ์๋ค.
- ์์ฐ์ ์ธ ๋ชจ๋ธ๋ง: ์ผ์์ํ์์ ๋ชจ์ต์ ๊ตฌ์กฐ๊ฐ ๊ฐ์ฒด์ ์์ฐ์ค๋ฝ๊ฒ ๋ น์๋ค์๊ธฐ ๋๋ฌธ์ ์๊ฐํ๊ณ ์๋ ๊ฒ์ ๊ทธ๋๋ก ์์ฐ์ค๋ฝ๊ฒ ๊ตฌํํ ์ ์๋ค. (๊ธฐ๋ฅ๋ณ๋ก ๋๋ ์ ๊ตฌํํ๋ค๊ฑฐ๋,,)
- ์ ์ง๋ณด์์ ์ฐ์์ฑ: ๊ธฐ์กด ๊ธฐ๋ฅ์ ์์ ์ ํจ์๋ฅผ ์๋กญ๊ฒ ๋ฐ๊พธ๋๋ผ๋ ์บก์ํ ๋์ด ๊ทธ ํจ์์ ์ธ๋ถ ์ ๋ณด๊ฐ ์๋๋์ด ์๊ธฐ ๋๋ฌธ์ ์ฃผ๋ณ์ ๋ฏธ์น๋ ์ํฅ์ ์ต์ํ ํ๊ธฐ ๋๋ฌธ์ ์ ์ง๋ณด์์ ์ฐ์์ฑ์ ๊ฐ๋๋ค. ์๋ก์ด ๊ฐ์ฒด์ ์ข ๋ฅ๋ฅผ ์ถ๊ฐ ์์๋ ์์์ ํตํด์ ๊ธฐ์กด์ ๊ธฐ๋ฅ์ ํ์ฉํ๊ณ , ์กด์ฌํ์ง ์์ ์๋ก์ด ์์ฑ๋ง ์ถ๊ฐํ๋ฉด ๋๋ฏ๋ก ๋งค์ฐ ๊ฒฝ์ ์ ์ด๋ค.
OOP์ ๋จ์
๐ธ- ๋ง์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋ค. (๊ฐ์ฒด๊ฐ์ ์ ๋ณด๊ตํ์ด ๋ชจ๋ ๋ฉ์์ง ๊ตํ์ ํตํด์ ์ผ์ด๋๊ธฐ ๋๋ฌธ์ด๋ค.)
์ค๋ฒํค๋๋, ์ด๋ค ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด์ ์๋ชจ๋๋ ๊ฐ์ ์ ์ธ ์ฒ๋ฆฌ ์๊ฐ, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ฏธํ๋ค.
- ์ํ๋ฅผ ๊ฐ์ง๋ ๊ฐ์ฒด๋ก ์ธํ ๋ฒ๊ทธ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํจ: ๋ด๋ถ ๋ณ์๋ก ์ธํด ๊ฐ์ฒด๊ฐ ์์ธกํ ์ ์๋ ์ํ๋ฅผ ๊ฐ๊ฒ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
OOP์ 5๋ ์์น SOLID์ SWIFT
๐์ค์ํํธ๋ ๊ฐ์ฒด์งํฅ? ํจ์์งํฅ? ๋ฌด์จ ํจ๋ฌ๋ค์ ์ธ์ด์??
๐ธ์ค์ํํธ์ ๋ํ์ ์ธ ํน์ง์ ์๋์ ๊ฐ๋ค.
- ARC (Automatic Reference Counting, ์๋ ์ฐธ์กฐ ์นด์ดํ
) ์ง์
- Objective-C์ ๋์ ๊ฐ์ฒด ๋ชจ๋ธ๊ณผ ๋งค๊ฐ๋ณ์ ํ์ ๋์
- ์ปดํ์ผ ์ธ์ด
๊ทธ๋ฆฌ๊ณ , Swift๋ ๋ค์ค ํจ๋ฌ๋ค์ ์ธ์ด์ด๋ค. ์ค์ํํธ๋ ๋ค์๊ณผ ๊ฐ์ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ์ฐจ์ฉํด์ ๋ง๋ค์ด์ก๋ค.
- ๋ช
๋ นํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์
- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์
- ํ๋กํ ์ฝ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์
์ ํํ๊ฒ๋, ๋ช ๋ นํ๊ณผ ๊ฐ์ฒด์งํฅ์ ๊ธฐ๋ฐ์ผ๋ก, ํจ์ํ, ํ๋กํ ์ฝ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ์งํฅํ๋ค. (์ง์ง ์งฌ๋ฝ์ด์์?๐)
- ์ ํ์ ํ๋ ์์ํฌ ๋๋ถ๋ถ์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ๋ ์๋ง์ ํด๋์ค๋ก ๊ตฌ์ฑ๋์ด์์.
- ์ ํ์ ํ๋ ์์ํฌ์์ ์ฌ์ฉ๋ ์ธ์ด๋ผ๋ฉด, ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ์์ฉํด์ผ๋ง ํ ๊ฒ์ด๋ค.
- ๋, ์ค์ํํธ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๊ฐ์กฐํ๋ค. ์ ํ ํ๋ ์์ํฌ๋ฅผ ๋ฒ์ด๋ ๋ค๋ฅธ ์์ญ์์ ์ค์ํํธ๋ฅผ ์ฌ์ฉํ์ ๋, ์์ํ๊ฒ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ผ๋ก ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.)
๋ฐ๋ผ์ ์ค์ํํธ๋, ํจ์ํ๊ณผ ๊ฐ์ฒด์งํฅ ๋๋ค ์ฐจ์ฉํ๊ณ ์์ผ๋ฏ๋ก, ๋๊ฐ์ ํจ๋ฌ๋ค์์ ์ ์์ด์ ์ฝ๋ฉ์ ํ๋ค๋ฉด, ํ์ํ ๊ธฐ๋ฅ์ ๋ง๊ฒ ์ต์ ์ ์ฑ๋ฅ์ ๋ฐํํ๊ณ , ์์ฐ์ฑ๋ ๊ทน๋ํ ํ ์ ์์ ๋ฏ?!
์ค์ํํธ์ SOLID โจ
๐ธSOLID๋
๐- ๋ก๋ฒํธ ๋งํด์ด๋ผ๋ ์ฌ๋์ด ๋ช
๋ช
ํ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋จ ๋ฐ ์ค๊ณ์ ๊ธฐ๋ณธ ์์น ๋ค์ฏ๊ฐ์ง S, O, L, I, D
SOLID ๊ฐ๊ฐ์ ์ํ๋ฒณ์ด ๋ญ ์๋ฏธํ๋์ง๋ ์๋์ ์ค๋ช ํ๊ฒ ๋ค.
์ค์ํํธ์ SOLID
๐swift๋ ์์์ ๋ฐฐ์ ๋ฏ, ๋ฉํฐํจ๋ฌ๋ค์ ์ธ์ด์ด๋ค. ํ์ง๋ง, ์ ํ์ ๋๋ถ๋ถ์ ํ๋ ์์ํฌ๋ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ๋ ์๋ง์ ํด๋์ค๋ก ๊ตฌ์ฑ๋์๋ค๊ณ ํ์์ด?
์ค์ํํธ์์ ์ง์ํ๋ Foudnation, UIKit, ์ฝ์ฝ์ ํฐ์น ๋ฑ ์ด๋ฌํ ํ๋ ์์ํฌ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก OOP์ ๊ทผ๊ฐ์ ๋๊ณ ์๋ค๊ณ ํ๋ค. SOLID์ ์์น๋ค๊ณผ iOS๋ฅผ ์ฐ๊ด์ง์ด ์ดํด๋ณด๊ณ , ์ ๋ง์ ํด๋์ค๋ค์ด ๊ทธ๋ฐ์์ผ๋ก ๋ง๋ค์ด์ก๋์ง ์์๋ณด์.
๋์์ ์ค์ํํธ๋ OOP์ ๊ทผ๊ฐ์ ๋๊ณ ์์ง๋ง SOLID์์น์ ์๋ฐํ๋ ๊ฒฝ์ฐ๋ ์๋ค๊ณ ํ๋๋ฐ ์ด ์์๋ค์ ์ดํด๋ณด๊ณ , ์๋ชป๋ ์ฝ๋๋ ๋ฌด์์ธ์ง ์์๋ณด์!
1. SRP (Single Responsibility Principle): ๋จ์ผ ์ฑ ์ ์์น
ํด๋์ค๋ ๋จ ํ๋์ ์ฑ
์์ ๊ฐ์ ธ์ผ ํ๋ฉฐ, ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ ์ด์ ๋ ๋จ ํ๋์ฌ์ผํ๋ค๋ ์์น
- ๋ณํ์ ๋ํ ์ ์ฐ์ฑ ํ๋ณดํ๊ธฐ ์ํด์ ์ด ์์น์ ์ง์ผ์ผ ํจ.
- ๋ฎ์ ๊ฒฐํฉ๋, ๋์ ์์ง๋๋ฅผ ์ถ๊ตฌํ๊ธฐ ์ํด์ ์ด ์์น์ ์ง์ผ์ผ ํจ.
์ค์ํํธ์์ SRP๋ฅผ ์๋ฐํ ์์
๐๊ฐ์ฅ ๋ํ์ ์ธ ์๋ฐ ์ฌ๋ก๋ MVC ํจํด์ด ๊ฐ์ง ๋ฌธ์ Massive View ํ์์ด๋ค.
๐ก Massive View ๋?
MVC์ flow๋ Model -> Controller -> View ๊ฐ ๋์ด์ผ ํ๋๋ฐ, ์ด flow๊ฐ ์๋,
View๊ฐ Model๊ณผ Controller์ ๋์ ์์ด ๋ชจ๋ ๊ฒ์ ๋ค ํด๋ด๋ ์ผ์ด์ค, ์ด๋ฅผ ๋ฐ๋ก Massive View ํ์์ด๋ผ๊ณ ํ๋ค.
MVCํจํด์ ๋จ์ ์ ๊ทน๋ณตํ๊ธฐ ์ํด์ ์ฌ๋ฌ ๋ค๋ฅธ ํจํด๋ค์ด ์๊ฒจ๋๊ณ ์๋๋๊ณ ์๋ค. ์๋กญ๊ฒ ์๋๋๋ ํจํด๋ค์ ๋๋ฌด ๋ง์ ์ญํ ์ ํ๊ณ ์๋ VC๋ฅผ ์ชผ๊ฐ์ ๋จ์ผ ์ฑ ์๋ง์ ๊ฐ์ง๋ ์ฌ๋ฌ ํด๋์ค๋ฅผ ๋ง๋ค๋ ค๊ณ ํ๋ค๋ ์ ์ด ๊ณตํต์ ์ด๋ค. ์ด๋ ๊ฒ ์๋กญ๊ฒ ์๋๋๋ ํจํด๋ค์ ๊ฒฝ์ฐ SRP๋ฅผ ์๋ฐํ์ง ์์๋ค๊ณ ํ ์ ์๋ค. (๋จ์ผ ์ฑ ์์ ๊ฐ๋๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ฏ๋ก!)
SRP๋ฅผ ์งํค๊ธฐ ์ํด์๋ ์ด๋ป๊ฒ ํด์ผํ ๊น (feat. swift)
๐ค- ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์, ํด๋์ค๋ฅผ ์๊ฒ ๋ง๋๋ ๊ฒ
'ํจ์๋ 10์ค', 'ํด๋์ค๋ 100~200์ค'๋ก ์ ํ์ฌํญ์ ๋๊ณ ํ๋ก๊ทธ๋๋ฐ์ ํด๋ณด๋ฉด ์ข๋ค. ํด๋์ค์ ํจ์๋ฅผ ์๊ฒ ๋ง๋๋ ๊ฒ์ด ๋ฌด์กฐ๊ฑด์ ์ธ SRP๋ฅผ ์ถฉ์กฑ์ํค๊ธฐ ์ํ ์ถฉ๋ถ์กฐ๊ฑด์ ์๋์ง๋ง, ํ์์กฐ๊ฑด์ด๋ผ๊ณ ํ ์ ์๋ค.
ํจ์ 10์ค ๋ฃฐ์ ์งํค๊ธฐ ์ํด์๋, ํจ์๊ฐ ์งง์์ผ ํ๋ฏ๋ก, ํ๋์ ์ญํ ์ ๊ฐ์ง ํจ์๊ฐ ๋ ์ ๋ฐ์ ์๊ณ , '์ถ์ํ ๋ ๋ฒจ'์ ๋ํด์ ๊ณ ๋ฏผํ ์ ๋ฐ์ ์๋ค. ์ถ์ํ ๋ ๋ฒจ์ด๋, ์ผ๋งํผ์ ์ ๋ณด๋ฅผ ํด๋น ํจ์์์ ๋ ธ์ถํด์ ๋ณด์ฌ์ค ๊ฒ์ธ๊ฐ ํ๋ ๊ฒ์ด๋ค.
- ์ถ์ํ ๋ ๋ฒจ์ ๋ํ ์์
- ๋ผ๋ฉด ์กฐ๋ฆฌ๋ฒ์ ์ดํด๋ณด์.
- ๋ฌผ 550ml๋ฅผ ๋์ธ๋ค -> ๋ฉด๊ณผ ์คํ, ํ๋ ์ดํฌ๋ฅผ ๋ฃ๋๋ค -> 4๋ถ 30์ด๋ฅด ๋์ธ๋ค.
- ๋ฌผ ๋์ด๋ ๋จ๊ณ๋ฅผ ๋ ์ชผ๊ฐ๋ณด๋ฉด, ๋๋น๋ฅผ ๊บผ๋ธ๋ค, ์ ์๊ธฐ๋ก ๋ฌผ์ ๋ฐ๋๋ค, ๋ฌผ์ ๋ด๋๋ค,,, ๋ฑ ์ฌ๋ฌ ๋์์ด ์๋ค. ํ์ง๋ง ์ด๋ฅผ ์กฐ๋ฆฌ๋ฒ์ ํฌํจ์ํค์ง๋ ์์๋ค.
- "๋ฌผ 550ml๋ฅผ ๋์ธ๋ค"์ ๋ชจ๋ ๋ด์ฉ์ ๋ฌถ์ด์ ํํ (์ด๊ฒ์ด ํจ์)ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ ๋ผ๋ฉด์ ์์์ฒ๋ผ, ์์ (ํจ์)๋ฅผ ์ด๋ ์์ค๊น์ง ์ชผ๊ฐ์ ์ค๋ช (์ถ์ํ)ํ ๊ฑด์ง ์ง์์ ์ผ๋ก ๊ณ ๋ฏผํ๊ฒ ๋๋ฏ๋ก, ํจ์๋ฅผ ์งง๊ฒ ๋ง๋๋ ๊ฒ์ SRP์ ํ์์กฐ๊ฑด์ด๋ค.
ํด๋์ค 200์ค ๋ฃฐ์ ์งํค๊ธฐ ์ํด์๋, ํ๋กํผํฐ๋ ํจ์, ๋ฉ์๋๋ฅผ ๊ทธ๋ฅ ์๋ฌด๋ฐ๋ ๋ง๋ค์ด์ ์ธ์ ์๋ค. ๊ผญ ์ด ํ๋กํผํฐ๊ฐ ํ์ํ์ง, ํจ์๊ฐ ํ์ํ์ง ๋ฑ์ ๋ํ ๊ณ ๋ฏผ์ด ์ง์์ ์ผ๋ก ํ์ํ๋ค. ํด๋น ํด๋์ค์ ์์ ์ด์ ๊ฐ ์๋๋ฐ ์กด์ฌํ๊ฒ ๋๋ค๋ฉด, SRP ์๋ฐ์ด๋ค. ๋ํ, ํจ์ ๋ด๋ถ์์ self์ ํธ์ถ ๋น๋๊ฐ ์ ์ ์๋ก ํด๋์ค์ ์ฐ๊ด์ฑ์ด ์๋ค๋ ๋ป์ด๋ฏ๋ก, ๋์ค์ ํด๋์ค๋ฅผ ๋ฆฌํฉํ ๋ง ์์ผ์ผํ ์ํฉ์ด ์ค๋ฉด ์ฐ์ ์ ์ผ๋ก ๋ด์ซ์ ํ๋ณด๊ฐ ๋๋ค!
2. OCP (Open-Closed Principle): ๊ฐ๋ฐฉ-ํ์ ์์น
- ๋ชจ๋์ ํ์ฅ์๋ ์ด๋ ค์์ด์ผ ํ๊ณ , ๋ณ๊ฒฝ์๋ ๋ซํ์์ด์ผ ํ๋ค.
- ๊ธฐ๋ฅ์ ๋ณ๊ฒฝ ๋๋ ํ์ฅํ ์ ์์ผ๋ฉด์, ๊ทธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ์ฝ๋๋ ์์ ํ์ง ์์์ผํ๋ค.
๐ค ์ด๋ ค์๊ณ ๋ซํ์๋๊ฒ ๋ญ๋ฐ?
- ์ด๋ ค์๋ค?: ๊ธฐ๋ฅ ์ถ๊ฐ๋ ๋ณ๊ฒฝ์ ํ ์ ์์ด์ผ ํ๋ค๋ ๋ป
- ๋ซํ์๋ค?: ๊ธฐ๋ฅ ์ถ๊ฐ๋ฅผ ํ ๋ ๊ทธ ๋ชจ๋์ ์ค๊ณ ์๋ ์ฝ๋๋ค์ ์์ ํ์ง ์์์ผํ๋ค๋ ๋ป
์ค์ํํธ์์ OCP๋ฅผ ์๋ฐํ ์์
๐์ด๋ค ํ์ ์ ๋ํ ๋ฐ๋ณต์ ์ธ ๋ถ๊ธฐ๋ฌธ์ด OCP๋ฅผ ์๋ฐํ ๋ํ์ ์ธ ์์์ด๋ค.
- ์ฆ, ํ๋์ enum์ ์ฌ๋ฌ ๊ตฐ๋ฐ์์ ๋ฐ๋ณต์ ์ผ๋ก if/switch๋ฌธ์ ์ฐ๊ณ ์๋ค๋ฉด ๊ณ ๋ฏผ์ ํด๋ด์ผํ ํ์๊ฐ ์๋ค.
- ์๋ํ๋ฉด, ์ด๋ฐ ๊ฒฝ์ฐ ๊ธฐ๋ฅ ์ถ๊ฐ๋ case๋ฌธ์ผ๋ก ์ถ๊ฐํ๋ฉด๋์ด ๊ฐํธํ์ง๋ง, ์ด๋ ๊ฒ ์ถ๊ฐํ๋ ์๊ฐ ํด๋น enum์ ์ค์์นญํ๊ณ ์๋ ๋ชจ๋ ์ฝ๋๋ฅผ ์ฐพ์์ ์์ ํด์ฃผ์ด์ผํ๋ค๋ ์น๋ช ์ ์ธ ๋จ์ ์ด ์กด์ฌํ๋ค. (OCP ์๋ฐ!!)
OCP์์น์ ์งํค๊ธฐ ์ํด์๋ ์ด๋ป๊ฒ ํด์ผํ ๊น (feat. swift)
๐ค์ต๋ํ if/switch๋ฌธ์ ์์ฐ๋ ์ฐ์ต์ ํ๋ ๊ฒ์ด๋ค. ๋ถ๊ธฐ๋ฌธ์ ๋ชจ๋ ์์ ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋๊น, enum ๊ฐ์ด ํ์ ์ ๋ถ๊ธฐํ๋ ์ง์ ์ ๋ํด์ ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ์ํ๋ ๊ฒ์ ์ฐ์ตํด๋ณด๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋์ ๋ SRP๋ฅผ ์งํค๊ธฐ์ํด์ ๋ ธ๋ ฅํ๋, ํจ์ 100์ค, ํด๋์ค 200์ค ๋ฃฐ์ ์ ์ฉ์ํค๋ฉด, ์ด๋์ ๋ ์์ฐ์ค๋ฝ๊ฒ OCP์์น์ ๊ณ ๋ คํ๊ฒ ๋๋ค. ์๋๋ฉด ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ํ๋ ๊ฒ์ ๋ง์ ์ฝ๋๋ผ์ธ์ ์ฐจ์งํ๊ธฐ ๋๋ฌธ์ด๋ค!
if/switch๋ฅผ ๋์ฒดํ ์ ์๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
1. protocol ์ฌ์ฉํ๊ธฐ
ํ๋กํ ์ฝ์ ์์๋ฐ์์ ์ฐ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด๋ ์ง์ ์ ์ผ๋ก OCP๋ฅผ ์งํค๋ ๊ตฌ์กฐ์ด๋ค.
// โ enum์ ์ด์ฉํ ๋ถ๊ธฐ์ฒ๋ฆฌ
enum Animal {
enum Size {
case small
case medium
case large
}
case dog
case cat
case cow
var noise: String {
switch self {
case .dog:
return "woof"
case .cat:
return "meow"
case .cow:
return "moo"
}
}
var size: Size {
switch self {
case .dog:
return .medium
case .cat:
return .small
case .cow:
return .large
}
}
}
// โ
ํ๋กํ ์ฝ๋ก ๋ถ๊ธฐ๋ฌธ ๋์ฒดํด๋ณด๊ธฐ
enum AnimalSize {
case small
case medium
case large
}
protocol Animal {
var noise: String { get }
var size: AnimalSize { get }
}
struct Dog: Animal {
var noise = "woof"
var size = AnimalSize.medium
}
struct Cat: Animal {
var noise = "meow"
var size = AnimalSize.small
}
struct Cow: Animal {
var noise = "moo"
var size = AnimalSize.large
}
ํ๋กํ ์ฝ๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ๋ณด์. ์ฌ๊ธฐ์ ์ด์ ์๋ก์ด ์ ํ์ ์ถ๊ฐํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ๋๊ฐ? ๊ทธ๋ฅ ๋ฐ์๋ค๊ฐ Animal ํ๋กํ ์ฝ์ ์ค์ํ๋ ์๋ก์ด Struct๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด๋๋ค. ๋ฌด์ธ๊ฐ ์๋กญ๊ฒ ์ถ๊ฐ๋์๋ค๊ณ ์ฝ๋๊ฐ ์์ ๋๊ฑฐ๋ ํ๋ ์ผ์ด ๋ฐ์ํ์ง ์๋๋ค. ์ฆ, OCP์์น์ ์ ๋๋ก!์ ๋๋ก! ์งํค๋ ๋ฐฉ์์ด๋ค.
// โ
์๋ก์ด ์ ํ ์ถ๊ฐํ๊ธฐ -> ๋ค๋ฅธ ์ด๋ ํ ์ฝ๋์๋ ์ํฅ์ ์ฃผ์ง ์์ (OCP ์ค์)
struct Fox: Animal {
var noise = "wa-pa-pa-pa-pa-pa-pow"
var size = AnimalSize.medium
}
์ค์ ๋ก, ์ด๋ ๊ฒ ๊ตณ์ด ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์๋ ๋๋ ์ฝ๋๋ฅผ protocol๋ก ๋ฐ๊พธ๋ ๋ฆฌํฉํ ๋ง ๊ธฐ์ ์, '์กฐ๊ฑด๋ถ๋ฅผ ๋คํ์ฑ์ผ๋ก ๋ฐ๊พผ๋ค.'๋ผ๊ณ ๋งํ๋ค๊ณ ํ๋ค. ์กฐ๊ฑด์ ๋ถ๊ธฐ์ ์ผ์นํ๋ ํ์ ํด๋์ค๋ฅผ ๋ง๋ค์ด์, ๊ฐ์ฒด ํด๋์ค์ ๋ฐ๋ผ ๋คํ์ฑ์ ํตํด ์ ์ ํ ๊ตฌํ์ด ๋ฌ๋ผ์ง๊ฒ ํ๋ ๋ฐฉ์์ด๋ผ๊ณ ํ๋ค. ๋คํ์ฑ์ ์์์ ๋ฐฐ์ ๋ฏ, ํ์์์๋ค์ด ๋ชจ๋ ๊ฐ์ ์์์ ์๋๋ค ๋ผ๋ ๊ฐ๋ ์ผ๋ก ๋ฐฐ์ ๋ค. ์์๋ค์ด ๋ชจ๋ ๋ค๋ฅด๋ค? ์๋ธ ํด๋์ค์์ ๊ฐ์์ ๊ตฌ์ฒด์ ์ธ ๊ณ์ฐ ๋ก์ง์ ์ ์ํ๋ ๋ฐฉ์์ผ๋ก ์กฐ๊ฑด๋ถ๋ฅผ ๋คํ์ฑ์ผ๋ก ๋ฐ๊พผ๋ค ๋ผ๊ณ ๋งํ๋ ๊ฒ์ด๋ค.
์ด์จ๋ , ์ด๋ ๊ฒ ๋คํ์ฑ์ผ๋ก ๋ฐ๊พธ๊ฒ๋๋ฉด, ๊น๋ํ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์๋ค. ์ด๋ ๊ฒ ๋ฐ๊ฟ ์ ์๋ ์ค์ํํธ ์ธ์ด๋ 'ํ๋กํ ์ฝ ์งํฅ ํ๋ก๋ฅด๋๋ฐ'์ด๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๋ค. โจ
๐ฌ ์ฌ๊ธฐ์ ์ ๊น, ๊ทธ๋ผ enum์ ์ด๋จ๋ ์ฌ์ฉํ๋๊ฒ ์ ์ ํ ๊ฑฐ์?
enum์ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ? ๋์ผํ ์์ฑ์ ๊ฐ์ง ๊ฒ๋ค์ ๊ทธ๋ฃนํํ๋ ์ฉ๋๋ก๋ง ์ฌ์ฉํ๋๊ฐ? ์ด๋ด๋๋ ์ฌ์ค ํ๋กํ ์ฝ๋ก๋ ์์ ๋ฐฉ๋ฒ์ฒ๋ผ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
๊ทธ๋์ enum ๋ํ ์ํฉ์ ๋ฐ๋ผ ์ ์ฌ์ฉํด์ผํ๋ค. ํนํ enum ์๋ฃํ์, ์ ์ฐ์ฑ์ ์ํ์ง ์๋ ์๋๋ฆฌ์ค์์๋, ADT์ ๊ฐ์ ์๋๋ฆฌ์ค์์ ์ ํฉํ๋ค. ์์์ ๋ฆฌํฉํ ๋งํ ์ฌ๋ก๋ฅผ ๋ณด๋ฉด, ์ธ ๊ฐ์ง์ ์ ํ๋ง ์ํ๋ฏ๋ก, enum ํํ๋ก ๋ฌถ์ด๋จ๊ณ , ์ด๋ ์ข์ ์ฌ๋ก๋ผ๊ณ ํ ์ ์๋ค.
2. dictionary ์๋ฃํ ์ฌ์ฉํ๊ธฐ
์ด๋ ์ง์ ์ ์ผ๋ก ocp ๋ฅผ ์งํค๋ ๊ตฌ์กฐ๋ ์๋๋ค. ์ด์ฐจํผ default ์ ์ด ์๋ switch๋ฌธ๊ณผ ๋์ผํ ์ฝ์ ์ ๊ฐ๋๋ค. ๋๋ฌธ์ case ๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋ ๊ฒ ๊ฐ์๋๋ ํผํด์ผํ๊ณ , ๋ถ๊ธฐ๋ฌธ์ ์์ ๊ณ ์ถ์ ๋๋ง ์ ํ์ ์ผ๋ก ์ฌ์ฉํด๋ณด์.
// โ switch ๋ฌธ์ผ๋ก ๋ถ๊ธฐ์ฒ๋ฆฌํ ์ฝ๋
switch reason {
case .initializing:
self.instructionMessage = "Move your phone".localized
case .excessiveMotion:
self.instructionMessage = "Slow down".localized
case .insufficientFeatures:
self.instructionMessage = "Keep moving your phone".localized
case .relocalizing:
self.instructionMessage = "Move your phone".localized
}
// โ
dictionary๋ฅผ ์ด์ฉํ์ฌ ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ์์ค ์ฝ๋
let trackingStateMessages: [TrackingState.Reason : String]
= [.initializing. : "Move your phone".localized,
.excessiveMotion : "Slow down".localized,
.insufficientFeatures : "Keep moving your phone".localized,
.relocalizing : "Move your phone".localized]
//switch๋ฌธ ๋์ฒด
self.instructionMessage = trackingStateMessages[reason]
3. LSP (Liskov Substitution Principle): ๋ฆฌ์ค์ฝํ ์นํ ์์น
์์ ํ์
๊ฐ์ฒด๋ฅผ ํ์ ํ์
์ ๊ฐ์ฒด๋ก ์นํํด๋ ์์ ํ์
์ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ์ ์ ์์ ์ผ๋ก ๋์ํด์ผํ๋ค๋ ์์น
- B๊ฐ A์ ์์ํ์ ์ด๋ฉด, ๋ถ๋ชจ ํ์ ์ธ A๊ฐ์ฒด๋ ์์ํ์ ์ธ B๋ก ์นํํด๋, ์๋์ ๋ฌธ์ ๊ฐ ์์ด์ผํ๋ค.
- ๋ถ๋ชจํด๋์ค ํ์ ์ธ A๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ์กด์ ํ๋ก๊ทธ๋จ ์ฝ๋๊ฐ ์์ ํด๋์ค B๋ก ๋์ ์์ผฐ์ ๋๋ ๋ฌธ์ ์์ด ์๋ํ๊ฒ ๋ง๋ค๊ธฐ ์ํด์, ์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค๊ฐ ๋ฐ๋ฅด๋ ์ ์ฝ์ฌํญ์ ๋ชจ๋ ๋ฐ๋ผ์ผํ๋ค.
- ์ฆ, ์์์ด ๋ถ๋ชจ์ ๋์์ ๋ฐฉํดํด์๋ ์๋๋ค๋ผ๋ ์๋ฏธ์ด๋ค.
์ค์ํํธ์์ LSP๋ฅผ ์๋ฐํ ์์
๐์ง์ฌ๊ฐํ์ ์์๋ฐ์์ ๋ง๋ ์ ์ฌ๊ฐํ ํด๋์ค๋ฅผ ์๊ฐํด๋ณด์. ์ ์ฌ๊ฐํ์ ๋๋น์ ๋์ด๊ฐ ๊ฐ์์ผํ๊ธฐ ๋๋ฌธ์ ๋๋น์ ๋์ด๋ฅผ ์์ ๋กญ๊ฒ ๋ฐ๊ฟ ์ ์๋ ์ง์ฌ๊ฐํ ๋ถ๋ชจ ํด๋์ค์ ๋์์ ์ ํํด์ผ๋ง ์ํ๋ ๋์์ ํ ์ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ๊ฐ LSP ์๋ฐ์ด๋ค.
LSP์์น์ ์งํค๊ธฐ ์ํด์๋ ์ด๋ป๊ฒ ํด์ผํ ๊น (feat. swift)
๐คLSP๋ฅผ ์งํค๊ธฐ ์ํด์๋, ์ง์ฌ๊ฐํ์ด ์ ์ฌ๊ฐํ์ ์์๋ฐ๊ฑฐ๋, ๋๋น์ ๋์ด๋ฅผ ์์ let์ผ๋ก ๋ง๋ค์ด๋ฒ๋ฆฌ๋ฉด ๋๋ค. let์ผ๋ก ์ ์ธํ๋ฉด ๋๋ ์ด์ ๋, ๊ฐ์ ๋ฐ๊พธ๋ ๋์์ ์์ ์์ ๋ฒ๋ฆฌ๋ฉด ์ ํํ ๋์์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. (let์ ํญ์ ๊ณ ์ ๊ฐ์ด๋ผ๋ ํน์ฑ์ ์ด์ฉํ ๊ฒ)
์์ 1.
var label = UILabel(frame: .zero)
var button = UIButton(frame: .zero)
var segmentedControl = UISegmentedControl(frame: .zero)
var textField = UITextField(frame: .zero)
var slider = UISlider(frame: .zero)
var switchButton = UISwitch(frame: .zero)
var activityIndicator = UIActivityIndicatorView(frame: .zero)
var progressView = UIProgressView(frame: .zero)
var stepper = UIStepper(frame: .zero)
var imageView = UIImageView(frame: .zero)
let views: [UIView] = [...] //์ ๋ทฐ๋ค์ UIView ์ด๋ ์ด์ ์ ์ฅ
views.forEach { $0.frame.size.height = 30 } //๋ทฐ๋ค์ height๋ฅผ 30์ผ๋ก ๋ณ๊ฒฝ
let height = views.reduce(0) { $0 + $1.frame.height } // ๋์ด๋ค์ ์ ๋ถ ๋ํด์ฃผ์
print(height) //๊ณผ์ฐ ๊ฒฐ๊ณผ๋?
- 10๊ฐ์ UIView์ ๋์ด๋ฅผ 30์ผ๋ก ๋ฐ๊ฟง์ผ๋๊น, ๋์ด๋ฅผ ์ ๋ถ ํฉ์น๋ฉด 300์ด ๋ ๊ฒ์ด๋ผ๊ณ ์์ํ ์ ์๋ค.
- ์ค์ ๊ฒฐ๊ณผ๋ 272 ์ด๋ค. ์ด์ ๋???
- ์ผ๋ถ ๋ทฐ๋ค์ intrinsicSize๋ฅผ ๋ง์๋๋ก ๋ฐ๊ฟ ์ ์๊ฒ ๋์ด์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ๊ฒ UIView(๋ถ๋ชจ)์ ๋์(๋์ด๋ฅผ ๋ฐ๊พธ๋๊ฒ)์ ์ ํํ๋ ์ผ๋ถ ๋ทฐ๋ค (UIProgressView, UISwitch)์ด ๋ฐ๋ก LSP ์๋ฐ์ด๋ค. (ํ์ ๋ทฐ๋ค์ ์ ํ์ฌํญ ๋๋ฌธ์ views(๋ถ๋ชจ)์ ๋์์ด ์ ๋๋ก ์๋ํ์ง ์์์ผ๋ฏ๋ก)
์์ 2.
๋ํ UIKit์ผ๋ก ๊ฐ๋ฐํ๋ค๋ณด๋ฉด, ์๋์ ๊ฐ์ ํจ์๋ฅผ ๋ณผ ์ ๊ฐ ์๋ค.
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
์ด์ฒ๋ผ ๋ถ๋ชจ์ ํจ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํด์ ํดํ์์ผ๋ฒ๋ฆฌ๋ ํจ์๋ LSP ์๋ฐ์ด๋ค.
๊ทธ๋ผ LSP ๋ ์ด๋ป๊ฒ ์งํค๋ ค๊ณ ๋ ธ๋ ฅํด์ผํ ๊น?
๐ค์ฌ์ค ์ค์ํํธ์์๋ LSP๋ฅผ ์ ๋ ์ด๊ธฐ์ง ์๊ณ ํ๋ ๊ฒ์ ์ด๋ ค์ด ์ผ์ด๋ค. ํ์ง๋ง ๋๋ฌด ๋ง์ ๊ณณ์์ LSP์๋ฐ์ ํด๋ฒ๋ฆฌ๋ฉด, ๋ฌธ์ ๊ฐ ์๊ธด๋ค. ์์ ํด๋์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฝ๋ฉํ ์ ์์ด์ง๋๋ฐ, ์ด๋ ๊ฒ ๋๋ฉด ์์ ์์ฒด์ ์๋ฏธ๊ฐ ์์ด์ง๋ฉฐ, OCP์กฐ์ฐจ ์งํฌ ์ ์๊ฒ ๋๋ค.
์๋ฅผ๋ค์ด UITableView๋ UITableViewCell์ ๊ธฐ์ค์ผ๋ก ๋ง๋ค์ด์ ธ ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ปค์คํ ์ ์ด LSP๋ฅผ ์งํค์ง ์๋๋ค๋ฉด ํ ์ด๋ธ ๋ทฐ๋ ์ ๋๋ก ์๋ํ์ง ์์ ๊ฒ์ด๋ค. ๋ํ protocol์ ๋ง๋๋ ์ด์ ๋ ์ถ์ํ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํด์์ธ๋ฐ, ์์๋ฐ์ ํ์ ์ด protocol์ ๋ฉ์๋๋ฅผ ํดํ์ํจ๋ค๋ฉด ํ๋กํ ์ฝ์ ๊ธฐ์ค์ผ๋ก ์ฝ๋๋ค์ด ์ค์ค์ด ๋ง๊ฐ์ง ์ ์๋ค. ์ด์ฒ๋ผ ์์์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ์ค์ํ ๋ถ๋ถ์ด๊ณ , ์ ์ฐ๋ฉด ์ ์ฉํ์ง๋ง, ์์์ ์๋ชป๋ง๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ฐ๋ฉด ๋์ ๋ฐ๋ผ์๋ LSP๋ฅผ ์๋ฐํจ์ผ๋ก์จ ํธ๋ฆฌํจ๊ณผ ๋จ์ํจ์ ์ป๊ฒ ๋ ์๋ ์๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก, LSP๋ฅผ ๋ชจ๋ ๊ณณ์์ ์งํค๋ ค๊ณ ๋ง ํ๋ฉด ๋นํจ์จ์ ์ด๊ณ ๋๋ฌด ์์ฃผ ์๋ฐํ๋ฉด ์์ํ์ง ๋ชปํ ๊ฒฐ๊ณผ๋ค ๋๋ฌธ์ ์์ ์ฑ์ ํด์น๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์์์ ๋ง๋ค๋๋ LSP ์๋ฐ์ธ์ง ์๋์ง๋ฅผ ์์งํ๊ณ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๊ฒ ๋ค.
4. ISP (Interface Segregation Principle): ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
- ์ด๋ค ํด๋์ค๋ฅผ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋, ์ฌ์ฉํ์ง ์๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ธํฐํ์ด์ค์ ์์กดํ๊ฒ ํ์ง ์์์ผ ํ๋ค.
- ํด๋์ค๊ฐ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ๋ง ์ ๊ณตํ๋๋ก ์ธํฐํ์ด์ค๋ฅผ ๋ถ๋ฆฌํด์ผํ๋ค.
- ์ฆ, ํด๋ผ์ด์ธํธ๋ ์์ ์ด ์ฌ์ฉํ์ง ์๋ ๋ฉ์๋์ ์์กด๊ด๊ณ๋ฅผ ๋งบ์ผ๋ฉด ์๋๋ค๋ ๋ป์ด๋ค.
- ISP๋ SRP์ ๋น์ทํ์ง๋ง, ์ธํฐํ์ด์ค๋ฅผ ํตํ ๋ค๋ฅธ ํด๊ฒฐ์ฑ
์ ์ ์ํ๋ค๋ ์ ์์ ์กฐ๊ธ ์ฐจ์ด๊ฐ ์๋ค.
- ์์) class ์ฌ๋ implements ๊ตฐ์ธ ์ด๋ฉด ๊ตฐ์ธ ํ๊ธธ๋ = new ์ฌ๋() ์ ํตํด ๊ตฐ์ธ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ง์ ์ฌ์ฉํ๋๋ก ์ ํํ๋ ๊ฒ์ด๋ค. SRP์๋ค๋ฉด class๋ฅผ ๋๋ ๋ฒ๋ ธ๊ฒ ์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ISP๋ณด๋ค SRP ํ ๊ฒ์ด ๊ถ์ฅ๋๋ค.
5. DIP (Dependency Inversion Principle): ์์กด ์ญ์ ์์น
- ์์กด ๊ด๊ณ๋ฅผ ๋งบ์ ๋ ๋ณํํ๊ธฐ ์ฌ์ด ๊ฒ ๋๋ ์์ฃผ ๋ณํํ๋ ๊ฒ ๋ณด๋ค๋ ๋ณํํ๊ธฐ ์ด๋ ค์ด๊ฒ, ๊ฑฐ์ ๋ณํ๊ฐ ์๋ ๊ฒ์ ์์กดํ๋ผ๋ ์์น
- ์์ํด๋์ค์ผ์๋ก, ์ธํฐํ์ด์ค์ผ์๋ก, ์ถ์ ํด๋์ค์ผ์๋ก ๋ณํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ์ ํ์ ํด๋์ค๋ ๊ตฌ์ฒด ํด๋์ค๊ฐ ์๋ ์์ํด๋์ค, ์ธํฐํ์ด์ค, ์ถ์ํด๋์ค๋ฅผ ํตํด ์์กดํ๋ผ๋ ์์น
- DIP ๋ฅผ ์ด๊ฒผ์ ๋์ ํด๊ฒฐ ๋ฐฉ๋ฒ์, OCP์ ๋น์ทํ๋ค. ๊ตฌ์ฒด์ ์ธ ํด๋์ค๊ฐ ์๋, ์ธํฐํ์ด์ค์ ์์กดํจ์ผ๋ก์จ DIP๋ฅผ ํด๊ฒฐํ ์ ์์ ๊ฒ์ด๋ค.
๐ Reference
https://velog.io/@dolarge/CS-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%EC%9D%B4%EB%9E%80
https://bite-sized-learning.tistory.com/550
https://radait.tistory.com/4?category=836792
https://babbab2.tistory.com/129
https://sjh836.tistory.com/159
https://becomereal.tistory.com/121
https://jisoo.net/2018/11/24/why-mvc-destroyed.html
https://sourcemaking.com/refactoring/replace-conditional-with-polymorphism
https://soojin.ro/blog/solid-principles-in-swift