์ด์ ๊ธ๋ค์ ์ฌ์ค ์ด ์์น์ ์ํด ๋ฌ๋ ค์จ ๊ฒ์ด ์๋๊ฐํ๋ ์๊ฐ์ด ๋ ๋ค. OOP์ ์ ์๋ก ๋ถ๋ฆฌ์ฐ๋ SOLID์์น์ ๋ํด์ ๊น๊ฒ ์์๋ณด๊ณ , ์ค์ iOS Framework์ ์ค๊ณ ๋ฐฉํฅ์ ๋์ ํ๋ฉด์ ๋ณด๋ค ์ฐํ ์ดํด๋ฅผ ๊ฒฝํํด๋ณด์.
Single Respoinsibility Principle (๋จ์ผ ์ฑ ์ ์์น)
- SRP
- ํ์ค ์ค๋ช
- ํ๋์ ํด๋์ค๋ ๋จ์ผ ์ฑ ์์ ๊ฐ์ ธ์ผ ํ๋ค.
- ๋จ์ผ
- ๋งค์ฐ ์๋์
- ๋๋๋ก ์์ ๋ฒ์
- ์ฑ
์
- ๋ณ๊ฒฝ์ ์ํ ์ด์
- ํน์ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์์ ํ๋๋ฐ, ํด๋์ค์ ๋๋ถ๋ถ์ด ์์ ๋์ง ์์ ๊ฒฝ์ฐ
- ํด๋์ค๊ฐ ์ง๋์น๊ฒ ๋ง์ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์๋๊ฐ?
- ๊ธฐ๋ฅ ํ ๊ฐ์ ํ๋์ ํด๋์ค๋ผ๊ณ ๊ฐ์ ํ๋ค๋ฉด, ํ๋์ ๊ธฐ๋ฅ ์์ ํ ๊ฒฝ์ฐ ๋ง์ ๋ถ๋ถ ์์ ์ด ๊ฐํด์ ธ์ผ ํจ
- ๋ ผ๋ฆฌ์ ๊ด์ ์์ ํ๋์ ๊ธฐ๋ฅ์ด๋ผ ์๊ฐ๋์ง๋ง, ์ฐจํ ๋ณ๊ฒฝ ๊ด์ ์์ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ๋๊ฑฐ๋ ๋ง๋ค๋ฉด ๋ณ๊ฒฝ๋ถ๋ง ๋ณ๋์ ํด๋์ค๋ก ๋ถ๋ฆฌํ์ฌ์ผ ํจ
- ํน์ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์์ ํ๋๋ฐ, ์ฌ๋ฌ ํด๋์ค๊ฐ ์์ ๋ ๊ฒฝ์ฐ
- ํ๋์ ๊ธฐ๋ฅ์ ํ๋์ ํด๋์ค๋ก ๋ฌถ์ ์ ์๋๋ก ํด์ผ ํจ
- ๋ณ๊ฒฝ์ ๊ด์ ์์ ๋ถ๋ฆฌ๋ ์ด์ ๊ฐ ์๋๋ฐ ๋ถ๋ฆฌ๊ฐ ๋ ๊ฒฝ์ฐ, ๋ถํ์ํ ๋ณต์ก์ฑ์ ๊ฐ์ง ์ ์์
- SRP ์ค์ ํด๋์ค์ ํน์ง
- ์์ง๋๊ฐ ๋์
- ๊ฒฐํฉ๋๊ฐ ๋ฎ์
- ํน์ ๊ธฐ๋ฅ ๋ณ๊ฒฝ์ ์ํ ์์ ์ด ํ ๊ณณ์ ์ง์ค๋์ด ์์
- SRP ์ค์ ํด๋์ค ์์ฉ
- Design Pattern
- Abstract Factory
- Bridge
- State
- Strategy
- Command
- (S)OLID ์์น๋ค
- Design Pattern
- SRP ์๋ฐ ์ฌ๋ก
- ViewController
- Massive ViewController
- ํด๊ฒฐ์ฑ : MVP, MVVM, VIPER
- ์๋ฐ ๊ทผ๊ฑฐ
- VC ์ ์: Provides the infrastructure for managing the views of your UIKit app
- ์ด๋ฏธ view๋ฅผ ๊ด๋ฆฌํ๋ค๊ณ ๋ช ์๋์ด ์์
- ํ์ง๋ง ์ค์ ๋ง๋ค๋ค๋ณด๋ฉด view๋ง ๊ด๋ฆฌํ์ง ์๋ ๋ถ๋ถ์ด ์๋น์ด ๋ง์ (์: network ์ฒ๋ฆฌ)
- Apple MVC
- ๊ธฐ์กด MVC์์ Controller๋ View์ Model์ ์ด์ด์ฃผ๋ ์ญํ
- ํ์ง๋ง VC๋ View๋ฅผ ๊ด๋ฆฌํ๋ ์ญํ ์ ํ๊ณ ์์
- ๋ํ Model์ ์ฒ๋ฆฌํ๋ ๋ก์ง๊น์ง ๋ค์ด๊ฐ ์์
- MVP, MVVM, VIPER๋ ๋ชจ๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ์๋จ
- VC๋ฅผ View๋ก ๋ฐ๋ผ๋ด
- ViewController
Open / Closed Principle (๊ฐ๋ฐฉ ํ์ ์์น)
- OCP
- Bertrand Meyer, 1988๋ ์ ์ ์
- ํ์ค ์ค๋ช
- ์ํํธ์จ์ด ๊ฐ์ฒด (Class, function, etc)๋ ํ์ฅ์ ๋ํด ์ด๋ ค์๊ณ ์์ ์ ๋ํด์๋ ๋ซํ์์ด์ผ ํ๋ค.
- ํ์ฅ์ ๋ํด ์ด๋ ค์๋ค.
- ์๋ก์ด ๊ธฐ๋ฅ ํ์ฅ์ ์ํด ๊ธฐ์กด ์ฝ๋๋ฅผ ์๋์ง ์๊ณ ์๋ก์ด ์ฝ๋ ์ถ๊ฐ๋ง์ผ๋ก ๊ฐ๋ฅํด์ผ ํ๋ค.
- ์์ ์ ๋ํด ๋ซํ์๋ค.
- ์๋ก ์ถ๊ฐ๋๋ ์ฝ๋ ํน์ ์์ ๋๋ ์ฝ๋๋ ๊ธฐ์กด ์ฝ๋์ ๋ณ๊ฒฝ์ ์ผ์ผํค์ง ์๋๋ค.
- OCP ์ค์ ํจ๊ณผ
- ๊ฒฝ์ง์ฑ์ด ์ค์ด๋ฆ
- ๊ฒฝ์์ฑ
- ์ฝ๋๋ฅผ ์์ ํ๊ธฐ ์ด๋ ต๊ฒ ํ๊ณ , ์์ ํ๋๋ผ๋ ๋ถ์์ฉ์ ์ผ์ผํค๊ธฐ ์ฌ์ด ์์ฑ์ ๋งํจ
- ๊ฒฝ์์ฑ
- ๋น ๋ฅด๊ณ ์์ ์ ์ธ ์์
- ๋ถ์์ฉ์ ์ต์ํ
- ๊ฒฝ์ง์ฑ์ด ์ค์ด๋ฆ
- ๋ฐฉ๋ฒ
- OCP๋ ์ถ์ํ์ ํฌ๊ฒ ์์กด
- ์ถ์ํ๋ ์ธํฐํ์ด์ค ์ ์ธ
- ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ๊ตฌ์ฒด์ ์ธ ํ์ ๊ตฌํ
- ํด๋น ๋ชจ๋์ ์ฌ์ฉํ๋ ์ฝ๋๋ ๊ตฌ์ฒดํ๋ ํด๋์ค์ ์์กดํ์ง ์๊ณ ์ถ์ํ๋ ์ธํฐํ์ด์ค๋ง์ ์ฌ์ฉํด์ ๋์
- ์๋ก์ด ํด๋์ค๊ฐ ์ถ๊ฐ๋์ด๋ ๊ธฐ์กด ์ฝ๋ ์๋ ์ด์ ๊ฐ ์์
- OCP๋ ์ถ์ํ์ ํฌ๊ฒ ์์กด
- OCP ์ ์ฉํ์ง ์์์ ๋ Code Smell
- ์ด๋ค ํ์
์ ๋ํ ๋ฐ๋ณต์ ์ธ ๋ถ๊ธฐ๋ฌธ
- Enum ๊ฐ์ switch๋ if๋ฌธ์ผ๋ก ๋ฐ๋ณต์ ์ผ๋ก ํ๋จํ๋ ๊ฒฝ์ฐ
- ์๋ก์ด case ์ถ๊ฐ๋ ์ฌ์ฐ๋ ๋ชจ๋ ๋ถ๊ธฐ๋ฌธ๋ค์ ํ์ธํด์ผ ํจ
- ์์ ์ ๋ซํ์์ง ์์
- ๋ถ๊ธฐ๋ฌธ ๊ฐ์ ๊ฒฝ์ฐ ์๋ก์ด ํด๋์ค ์ถ๊ฐ์ ์๋ก ์์ฑํด์ฃผ์ด์ผ ํจ
- ์ด๋ค ํ์
์ ๋ํ ๋ฐ๋ณต์ ์ธ ๋ถ๊ธฐ๋ฌธ
- ์ค์ ์
- switch ๋ฌธ์ ์ฌ์ฉํ์ง ์๊ณ , protocol์ ์ ์ธํ ๋ค, ๊ฐ ํด๋์ค์์ ์ด๋ฅผ ์ฑํํ๋ค์, ๋คํ์ฑ์ผ๋ก ๋์ํ๊ฒ ๋ง๋ ๋ค.
- OCP๋ ๋ง๋ฅ์ธ๊ฐ?
- ๋ง๋ฅ์ธ ๊ฒ์ ์๋ค.
- ์๋ก์ด case, ๊ธฐ๋ฅ ์ถ๊ฐ๊ฐ ์๋ ๊ฒฝ์ฐ์ ๋จ์ฉ๋๋ฉด ๋ถํ์ํ ๋ณต์กํจ์ ๊ฐ์ง๊ฒ ๋จ
- greedyํ๊ฒ ํด๋น ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋, ๋น ๋ฅด๊ฒ ๋์ํ๋ ๊ฒ์ด ๋ณด๋ค ์ข์ง ์์๊น?
- ์ธ์ ์ฌ์ฉํ ๊น?
- Type์ ์๋ก์ด ๋ฉค๋ฒ๋ค์ด ๊ณ์ ์ถ๊ฐ๋ ๊ฐ๋ฅ์ฑ์ด ํด ๋
- Type์ ๋ฉค๋ฒ๋ก ๋ถ๊ธฐ์ฒ๋ฆฌ๋๋ ๊ณณ์ด ๋งค์ฐ ๋ง์๋
- ๋ ์๊ฐํด๋ณด์์ผ ํ ๊ฒ๋ค
- ์ด๋ค ๋ถ๋ถ์ Open, ์ด๋ค ๋ถ๋ถ์ Closeํ ๊ฒ์ธ๊ฐ?
- == ์ด๋ค ๋ถ๋ถ์ ์ถ์ํํ ๊ฒ์ด๊ณ ์ด๋ค ๋ถ๋ถ์ ๊ตฌ์ฒดํํ ๊ฒ์ธ๊ฐ?
- ํ๋จ์ด ์ด๋ ค์ด ๊ฒฝ์ฐ, ๋ณ๊ฒฝ์ด ์์ ๊ฒ์ด๋ค ๊ฐ์ ํ๊ณ ๊ฐ๋ฐํ๋ค.
- ์ ์ฐํจ๋ณด๋ค ๋จ์ํจ์ด ์ฐ์
- ๋ณ๊ฒฝ์ด ๋ฐ์ํ ๋
- ์ด ๋ณ๊ฒฝ์ด ์ ๋ฐ์ํ๋๊ฐ?
- ์ด๋ค ๊ณณ์ ์ํฅ์ ๋ฏธ์น๋๊ฐ?
- ๋ณ๊ฒฝ์ผ์ด๋ ๋ถ๋ถ์ด ์์ผ๋ก๋ ๋ณ๊ฒฝ์ ์ ๋ฐํ ๊ฒ ๊ฐ๋ค โ ๋ฆฌํฉํ ๋ง
- ์ข
๋ฅ์ ์ถ๊ฐ๋ณด๋ค ์ธํฐํ์ด์ค ๋ณํ๊ฐ ๋ ์์ฃผ ์ผ์ด๋๋ค๋ฉด
- ์ถ์ํ๋ฅผ ์๋ชปํ ๊ฒ.
- ์ ์ถ์ํํ๋ฉด interface๋ ๊ฐ๋งํ ์๊ณ ๊ตฌํ๋ถ๋ง ์ถ๊ฐํ๋ ๊ฒ์ผ๋ก ํด๊ฒฐ๋๋ค.
- ์ด๋ค ๋ถ๋ถ์ Open, ์ด๋ค ๋ถ๋ถ์ Closeํ ๊ฒ์ธ๊ฐ?
- ์ฐ์ต ๋ฐฉ๋ฒ
- ์๋์ ์ฌ์ฉ
- if/switch๋ฅผ ๊ทน๋๋ก ์ ํํ๋ ์ฝ๋ฉ
Liskov Subsitution Principle (๋ฆฌ์ค์ฝํ ์นํ ์์น)
- LSP
- Babara Liskov, 1988
- ํ์ค ์ค๋ช
- ์๋ฃํ S๊ฐ ์๋ฃํ T์ ํ์ํ์ด๋ผ๋ฉด, ํ๋ก๊ทธ๋จ์ ์์ฑ์ ๋ณ๊ฒฝ์์ด T ๊ฐ์ฒด๋ฅผ S ๊ฐ์ฒด๋ก ๊ต์ฒดํ ์ ์์ด์ผ ํ๋ค.
- ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๊นจ๋จ๋ฆฌ์ง ์์ผ๋ฉด์ ํ์ ํ์ ์ ์ธ์คํด์ค๋ก ๋ฐ๊ฟ ์ ์์ด์ผ ํ๋ค.
- ์์
- ์์์ ์์ด์ ๊ฐ์ฅ ์ค์ํ ๊ธฐ๋ณธ ์์น ์ ์
- OCP๋ฅผ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ์์น
- ์์ํ ๋ ํด์๋ ์๋๋ ํ์
- ๋ถ๋ชจ์ ํ์๋ฅผ ์์์ด ๊ฑฐ๋ถ
- ํดํ ํจ์
- ๋ํดํ ์์
- ์ง์ฌ๊ฐํ์ ์์๋ฐ์ ์ ์ฌ๊ฐํ?
- ์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์๊ฐํ๋ ์งํฉ ๊ด๊ณ
- ์ ์ฌ๊ฐํ์ ์์๋ฐ์ ์ง์ฌ๊ฐํ?
- ๋ ์ฌ์ด์๋ ์์๊ด๊ณ๊ฐ ์์ผ๋ฉด ์๋จ
- ์ผ๋ฐ์ ์ธ ๊ด๋ ๊ณผ ์์ถฉ๋จ
- ์ง์ฌ๊ฐํ์ ์์๋ฐ์ ์ ์ฌ๊ฐํ์ ๋๋ฌด๋ ๋น์ฐํด ๋ณด์. ํ์ง๋ง..
- ๋ง์ผ
setWidth()
ํจ์๊ฐ ์๋ค๋ฉด- ์ ์ฌ๊ฐํ์ ๊ฒฝ์ฐ height๋ ๊ฐ์ด ๋ฐ๊ฟ์ผ ํ๋ค.
- ์ง์ฌ๊ฐํ์
setWidth()
๋ก ํญ์ 2๋ฐฐ๋ก ํ๋ฉด ๋ฉด์ ์ด 2๋ฐฐ๊ฐ ๋จ - ์ ์ฌ๊ฐํ์
setWidth()
๋ก ํญ์ 2๋ฐฐ๋ก ํ๋ฉด ๋ฉด์ ์ด 4๋ฐฐ๊ฐ ๋จ - ๋ถ๋ชจ์ ์ ํฉ์ฑ์ ๊นจ๋ฒ๋ฆผ
- ์์์ด ๊ฑฐ๋ถํ ์ ๋ฐ์ ์๋ ๊ธฐ๋ฅ์ ๋ถ๋ชจ๊ฐ ์ ๊ณตํ๊ณ ์์
- ์ง์ฌ๊ฐํ์ ์์๋ฐ์ ์ ์ฌ๊ฐํ?
- ์์์ ๊ดํด ๊น์ด ์๊ฐํด๋ณด๊ธฐ
- ๊ฐ, ๊ณ ์์ด์ โ๊ฑท๊ธฐโ, โ๋ฐ๊ธฐโ ํ์๋ฅผ ์ถ๊ฐํ๋ฉด ๊ทธ ํ์๋ฅผ ๋๋ฌผ๋ ๋ฒจ๋ก ์ฌ๋ฆด ์ ์์
- ๋ง์ฝ ๋๋ฌผ ๋ ๋ฒจ์ ํด๋น ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค๋ฉด, ์ด๋ฅ์ ๊ฒฝ์ฐ ํดํํจ์๊ฐ ๋ฐ์ (๊ฑท๊ธฐ, ๋ฐ๊ธฐ ๋ถ๊ฐ)
- ์ฆ, ๋๋ฌผ ์์ ๊ตฌ์กฐ์์ โ๊ฑท๊ธฐโ, โ๋ฐ๊ธฐโ๋ ๋ฃ์ ์ ์์
- ์์๊ณผ ๋ณ๋๋ก ์กด์ฌํด์ผ ํจ
- ๊ฐ, ๊ณ ์์ด์ โ๊ฑท๊ธฐโ, โ๋ฐ๊ธฐโ ํ์๋ฅผ ์ถ๊ฐํ๋ฉด ๊ทธ ํ์๋ฅผ ๋๋ฌผ๋ ๋ฒจ๋ก ์ฌ๋ฆด ์ ์์
- UIKit์์ LSP๋ฅผ ์๋ฐํ๋ ๊ฒฝ์ฐ
- VC์ ์ฌ๋ฌ๊ฐ์ง์ View ์์๋ฅผ ๋ณ์๋ก ๊ฐ์ง๊ณ ์๋ค๊ณ ๊ฐ์ ํ์. (10๊ฐ)
- ํด๋น view๋ค์ height๋ฅผ ๋ชจ๋ 30์ผ๋ก ๋ณ๊ฒฝํ๊ณ , ๋ชจ๋ ๋ทฐ๋ค์ height์ ํฉ๊ณ๋ฅผ ๋ณ์๋ก ๊ฐ์ง๊ณ ์๊ณ ์ถ๋ค.
- ๋น์ฐํ 300์ด๋ผ๋ ๊ฐ์ด ์ถ๋ ฅ๋ ๊ฒ์ด๋ผ ์์ํ์ง๋ง ๊ทธ๋ณด๋ค ์์ ๊ฐ์ด ๋์ถ๋๋ค.
- ๊ทธ ์ด์ ๋ UIView๋ผ๋ ํด๋์ค๋ฅผ ์์๋ฐ์ View ํด๋์ค๋ค์ด ๋ง๋ค์ด์ง๋, ํ์ ํด๋์ค์์ ๋์ด์ ์ ํ์ ๋๋ ๊ฒ๋ค์ด ์๊ธฐ ๋๋ฌธ
- ๋ถ๋ชจ์ ํ์๋ฅผ ์์์ด ๊ฑฐ๋ถํ๊ณ ์๋ ์ํฉ
- ๋ฌผ๋ก , ๊ฒฝํ์ผ๋ก ์ด๋ฌํ ๋ถ๋ถ์ ๋ํด ์ธ์งํ๊ณ ์์ผ๋, ์ด๋ฌํ ๋ถ๋ถ์ด ๋ง๋ค๋ฉด ์์ ์ด ์ด๋ ค์์ง
- LSP ์๋ฐ์ ๋ฌธ์
- ๋ชจ๋ ํด๋์ค์์ ํ์ ํด๋์ค๋ฅผ ๋ช
์์ ์ผ๋ก ์ง์ ํด์ ์ฝ๋ฉํด์ผ ํจ
- ๋ถ๋ชจ ํด๋์ค๋ก ์ฌ์ฉ์ด ๋ถ๊ฐ
- OCP๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋จ
- ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์ด๋๊ณ , ์ด ์ธํฐํ์ด์ค๋ก ํน์ ํด๋์ค์์ ์ฌ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ
- ํ์ ํด๋์ค๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ธํ์ฌ ์ฌ์ฉํ ์ ๋ฐ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ฌธ์
- ์ฝ๋์ ๋ณต์ก๋๋ฅผ ๋์
- ์ธํฐํ์ด์ค๋ฅผ ํตํ ์ถ์ํ๋ก ์ฝ๋ ์์ ์ด ๋ถ๊ฐํจ
- ๋ถ๋ชจ ํด๋์ค๊ฐ ์์ ํด๋์ค๋ฅผ ์์์ผ ํ๋ ๊ฒฝ์ฐ๋ ๋ฐ์
- ๋๋ถ๋ถ์ LSP๋ฅผ ์ค์ํ๊ธฐ ๋๋ฌธ์ ๋ฏฟ์ด๋ ๋๋ค.
- ๋ชจ๋ ํด๋์ค์์ ํ์ ํด๋์ค๋ฅผ ๋ช
์์ ์ผ๋ก ์ง์ ํด์ ์ฝ๋ฉํด์ผ ํจ
- LSP ์ค์์ ํจ๊ณผ
- ์์ ํด๋์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ฑ๋ ์ฝ๋๊ฐ ๋ฌธ์ ์์ด ๋์(๋คํ์ฑ)
- ์ถ์ํ๋ ์ธํฐํ์ด์ค ํ๋๋ก ๊ณตํต์ฝ๋ ์์ฑ ๊ฐ๋ฅ
- ์์๋ ์๋ง์ ํด๋์ค๋ฅผ ์ผ์ผ์ด ๊ณ ๋ฏผํ์ง ์์
- ํ์ฅ์ ์ํด ์ฌ์ฉ๋ ๊ฐ๋ฅํจ
- ๊ธฐ๋ฅ ํ์ฅ์ ์ํด ์์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋! ๊ฐ๋ฅํ ์ต์ ์ผ ๋ฟ
Protocol extension
์ด๋ผ๋ ๋ฐฉ๋ฒ๋ ์์
- ํ์ค์ ์ธ ์ด์ผ๊ธฐ
- ๋ชจ๋ ์ฝ๋์์ LSP ์งํค๊ธฐ๋ ์ด๋ ค์
- ์ ์ ์ ์์ Trade-Off
- LSP๋ฅผ ์ดํดํ๊ณ ๋ฐ๋ฅด๋ฉด
- ์ค๊ณ์ ๋์์ด ๋จ
- ๋ฐ์ํ ๋ฌธ์ ๋ฅผ ์ฌ์ ์ ๋ง์ ์ ์์
- ๋ณต์กํ๊ณ ์ดํดํ ์ ์๋ ์์์ ๋ง๋ค์ง ์๊ฒ ํจ
- ๋ฉ์นํฐ ์ฝ๋๋ค์์ ์ํฉ์ ๋ค๊ฐ์ ์ด๊ณ ๊น๋ํ๊ฒ ์ ์ ํ๋๋ฐ ๋์์ ์ค
Interface Sergregation Principle (์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น)
- ISP
- ํ์ค ์ค๋ช
- ํด๋ผ์ด์ธํธ๊ฐ ์์ ์ด ์ด์ฉํ์ง ์๋ ๋ฉ์๋์ ์์กดํ์ง ์์์ผ ํ๋ค.
- A๋ผ๋ ํด๋์ค๊ฐ B๋ผ๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, B ํด๋์ค์ ๋ชจ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค๋ผ๋ ์๋ฏธ
- ์๋ฌธ๊ณผ ๊ณ ๋ฏผ
- ๊ทธ๋ผ ๊ทธ๋ฅ ์ธํฐํ์ด์ค๋ฅผ ์๊ฒ ๋ง๋ค๋ฉด ๋์ง ์์๊น?
- ๋ค์ ํ์ค ์ค๋ช ์ ๋จ์ด๋ค์ ์ ์๋ฅผ ์๊ฐํด๋ณด์.
- ํด๋ผ์ด์ธํธ
- ์ด๋ค ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์ชฝ
- ์๋ฒ
- ์ฌ์ฉ๋๋ ์ชฝ
- ์์กด
- ์ฌ์ฉ๊ณผ ๊ฐ์ ๋ง
- ์๋ฒ ํด๋์ค๋ ํด๋ผ์ด์ธํธ ํด๋์ค๊ฐ ํ์๋กํ๋ ์ต์ํ์ ์ธํฐํ์ด์ค๋ง ์ ๊ณตํด์ ๋ ๊ฐ์ ์์กด๋๋ฅผ ๋ฎ์ถฐ์ผ ํจ
- ์ฌ์ฉ ๋ฐฉ์
- ์๋ฒ ํด๋์ค๋ฅผ ์์์ ํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- ํด๋ผ์ด์ธํธ ํด๋์ค๊ฐ ์ฌ์ฉํ์ง ์๋ ๋ฉ์๋์ ์ ์ธ์ ๊ฐ์ ํ๊ฒ ๋จ
- ์ด๋ ์์๋ฐ์ ๋ฉ์๋๋ฅผ ํดํ์์ผ์ผ ํ๋ค๋ ์๋ฏธ = LSP ์๋ฐ
- ๋ฉ์น๊ฐ ํฐ protocol์ ์์ ๋ฐ์ผ๋ฉด ๋ถํ์ํ ๋ฉ์๋๋ฅผ ์ ์ธํด์ผ ํ ๊ฐ๋ฅ์ฑ์ด ๋์
- Swift์์๋ Protocol์ ์์ฑ๋ ๊ฒ์ ๋ชจ๋ ๊ตฌํํด์ผ ํจ
- ๋ฌผ๋ก Optional์ด๋ผ๋ ๊ฒ์ด ์๋๋ฐ, ์ด Optional์ ๋ฐ๋ก protocol๋ก ๋ชจ์์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ํจ์ฌ ์ข์
- ๋ด๋ถ์์ ํด๋น ์๋ฒ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉ
- ์ง์ ์ ์ผ๋ก ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ํฌ๊ฒ ์ํฅ์ ์ฃผ์ง๋ ์์
- ํ์ง๋ง ์ปดํ์ผ์ ์์กด๊ด๊ณ์ ์ํด ๋ถํ์ํ ์ปดํ์ผ์ด ์๊ตฌ๋จ
- ๋ถํ์ํ ๋ชจ๋์ ์ ๋ฐ์ดํธ ์ ๋ฐ
- ์๋ฒ ํด๋์ค๋ฅผ ์์์ ํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- ์์
- Hashable
- Protocol
- String์ญ์ hashable ์ฑํํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋์์ ๊ฐ๊ฒ ํจ
- ํ์ง๋ง ๋ง์ฝ ํน์ ํจ์์์ Hashable ์ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค๊ณ ํ์ ๋, String์ผ๋ก ๋ณ์๋ฅผ ์ก๊ธฐ๋ณด๋ค Hashable๋ก ๋ฐ๋ ๊ฒ์ด ์ข์
- String๋ณด๋ค Hashable์ด ๋ ์์ Interface์ด๊ธฐ ๋๋ฌธ
- ํด๋ผ์ด์ธํธ์ String ์ฌ์ด์ ์์กด๊ด๊ณ๋ฅผ ํ๋ฒ ๋์ ์ ์์
- UITableViewDataSource & UITableViewDelegate ๋ถ๋ฆฌ
- ๋์์ด ๋ค๋ฅธ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ ๊ณต
- Swift์์ ์๊ฒ ๋ถํด๋ Protocol๋ค
- Equatable, Comparable, Hashable etc
- Hashable
- ํต์์ ์ธ ์์
๋ฐฉ์
- ๋ณดํต ํด๋ผ์ด์ธํธ ํด๋์ค ์ชฝ์ด ์๋ฒ ํด๋์ค์ ๊ฐํ๊ฒ ์ปคํ๋ง๋์ด ์์
- ๋ณ๋๋ก ๋ถ๋ฆฌ๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ง์ ์๋ฒํด๋์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ
- ์๋ฒ ํด๋์ค ๋ณ๊ฒฝ ์ฌํญ์ด ํด๋ผ์ด์ธํธ์ ๊ฐํ๊ฒ ์ํฅ์ ๋ฏธ์นจ
- ISP ์ ์ฉ
- ์๋ฒ ํด๋์ค๋ฅผ SRP ์ค์ํ๋๋ก ์๊ฒ ๋ถํด
- ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ทธ๋ฃน ๋ณ๋ก ๋๋๊ณ , ์ด๋ฅผ ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉ
- ๋จ๋ฐํ ๊ฒฝ์ฐ ๋ณต์ก๋๊ฐ ์ฆ๊ฐํจ
- Protocol๋ก ์์ ํ๋ฉด ๊ฐ๊ฒฐํจ
- ๋ณดํต ํด๋ผ์ด์ธํธ ํด๋์ค ์ชฝ์ด ์๋ฒ ํด๋์ค์ ๊ฐํ๊ฒ ์ปคํ๋ง๋์ด ์์
- Protocol Oriented Programming
- POP ์ค์ฒ์, ISP ์ดํด์ ์ต๊ด์ผ๋ก๋ถํฐ ์ถ๋ฐํจ
- ๊ณ ์ ์ ์ธ ISP๋ abstract class๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ swift์์ protocol๋ก ๋ณํํจ
- ISP์ ๋ฐ๋ผ ์๊ฒ ๋ถํด๋ Interface๋ฅผ ์ด์ฉํด ์ฝ๋ฉํ๋ ๊ฒ์ด POP
- ์์ฝ
- ํฐ ๋ฉ์ด๋ฆฌ์ ์ธํฐํ์ด์ค๋ค์ ๊ตฌ์ฒด์ ์ด๊ณ ์์ ๋จ์๋ค๋ก ๋ถ๋ฆฌ์์ผ ํด๋ผ์ด์ธํธ๋ค์ด ๊ผญ ํ์ํ ๋ฉ์๋๋ง ์ฌ์ฉํ ์ ์๊ฒ ํด์ผํ๋ค.
Dependency Inversion Principle (์์กด ๊ด๊ณ ์ญ์ ์์น)
- DIP
- ํ์ค ์ค๋ช
- ์ํํธ์จ์ด ๋ชจ๋์ ๋ถ๋ฆฌํ๋ ์์น
- ์์ ๋ชจ๋์ ํ์ ๋ชจ๋์ ์์กดํด์๋ ์๋๋ค.
- ์์ ๋ชจ๋๊ณผ ํ์๋ชจ๋ ๋ชจ๋ ์ถ์ํ์ ์์กดํด์ผ ํ๋ค.
- ์์ ๊ณ์ธต์ด ํ์ ๊ณ์ธต์ ์์กดํ๋ ์ ํต์ ์ธ ์์กด๊ด๊ณ๋ฅผ ์ญ์ ์์ผ ์์๊ณ์ธต์ด ํ์๊ณ์ธต์ ๊ตฌํ์ผ๋ก๋ถํฐ ๋ ๋ฆฝ๋๋๋ก ํ๋ค.
- ์ถ์ํ๋ ์ธ๋ถ์ฌํญ์ ์์กดํด์๋ ์๋๋ค. ์ธ๋ถ์ฌํญ์ด ์ถ์ํ์ ์์กดํด์ผ ํ๋ค.
- ํ๊ณ ์ถ์ ์ํฉ
- ์์ ์์ค ๋ชจ๋์ด ํ์ ์์ค ๋ชจ๋์ ์์กด์ฑ์ ๊ฐ์ง๋ ๊ฒฝํฅ
- ์ ์ฑ ์ด ๊ตฌ์ฒด์ ์ธ ๊ฒ์ ์์กดํ๋ ๊ฒฝํฅ
- ๋ชฉ์
- ๋ชจ๋๊ฐ์ ์์กด ๊ด๊ณ๋ฅผ ๋๋ ๋ฐฉ๋ฒ ์ ์
- ๋ณ๊ฒฝ์ ๋ค๋ฅธ ์ฝ๋์ ์ํฅ์ ์ต์ํํ ์ ์๋ ๋ฐฉ๋ฒ ์ ์
- ๋ชจ๋์ ์์กด ๊ด๊ณ
- ์ฝ๋๋ ์ด๋ป๊ฒ๋ ์์กด๊ด๊ณ๋ฅผ ๊ฐ์ง
- ์์กด ๊ด๊ณ ์์ฒด๋ฅผ ์์จ ์๋ ์์
- ํ์ง๋ง ์์กด ๊ด๊ณ๋ฅผ ์ ์ ๋ฆฌํ์ง ์์ผ๋ฉด ์ฝ๋๋ ๊ฒฝ์ง์ฑ์ ๊ฐ์ง
- ๋ฌด์์ด ๋ฌด์์ ์์กดํ๋์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด ๋
- ๋ฌธ์ ์ํฉ ์์
- ์๋ก ์์กด๊ด๊ณ๋ฅผ ๊ฐ์ง๋ ๋ชจ๋
- Class A ์ Class B๊ฐ ์๋ก๊ฐ ์์ด์ผ ์กด์ฌ ์ฑ๋ฆฝ
- ์ํคํ ์ณ ํจํด์์ ์ค๊ฐ์ ์๋ ํด๋์ค๊ฐ ์ด๋ฐ ๊ฒฝ์ฐ
- ๋ง์ฝ ์ด๋ฐ ์ํฉ์ด ์๋ค๋ฉด weak์ผ๋ก ๊ด๊ณ๋ฅผ ๋์ด์ฃผ๋ ๊ฒ์ด ์ข์
- Class B๋ง ์ฌ์ฉํ๋ค๋ฉด Class A๋ ํจ๊ป ๊ฐ์ผ๋ง ํ๋ ์ํฉ์
- ๋ ๋ฆฝ์ ์ด์ง ๋ชปํจ
- Class A ์ Class B๊ฐ ์๋ก๊ฐ ์์ด์ผ ์กด์ฌ ์ฑ๋ฆฝ
- ์์กด ๊ด๊ณ๊ฐ ์ํ์ ๋ง๋๋ ๊ฒฝ์ฐ
- Class A โ Class B โ Class C โ Class A
- ์ด๋ ํด๋์ค๋ ๋ ๋ฆฝ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์
- ๋จ๋ฐฉํฅ์ผ๋ก ํ๋ฌ๊ฐ๋ ์์กด ๊ด๊ณ
- Class A โ Class B โ Class C
- ์ต์
- ํ์ค์ ์ผ๋ก ์ด๋ ค์
- ๊ทธ๋ฐ๋ฐ ๋ง์ฝ Class C๊ฐ B ํน์ A์ ์์กดํด์ผ ํ๋ ์ํฉ์ด ์๋ค๋ฉด?
- DIP๊ฐ ํด๊ฒฐ์ฑ ์ด ๋ ์ ์์
- ์๋ก ์์กด๊ด๊ณ๋ฅผ ๊ฐ์ง๋ ๋ชจ๋
- ์์กด์ ๋ฐฉํฅ
- ์์กด ๊ด๊ณ๋ ์ด๋ค ๋ฐฉํฅ์ผ๋ก ํ๋ฌ๊ฐ์ผ ํ๋๊ฐ?
- ๊ตฌ์ฒด์ ์ธ ๋ถ๋ถ์์ ์ถ์์ ์ธ ๋ฐฉํฅ์ผ๋ก ์์กดํด์ผ ํจ
- ์ถ์์ ์ธ ๊ฒ์ด ๊ตฌ์ฒด์ ์ธ ๊ฒ์ ์์กดํ์ง ์์์ผ ํจ
- ์ ์ฑ
์ด ๊ตฌ์ฒด์ ์ธ ๊ฒ์ ์์กดํ๋ ๊ฒฝํฅ
- ์ ์ฑ ์ ์ถ์์ ์ธ ๊ฒ์
- ์์ ์์ค์ ํ์ ์์ค์ ์์กดํ๋ฉด ์๋จ
- ์์ ์์ค: ์ถ์์ ์ธ ๋ถ๋ถ
- ํ์ ์์ค: ๊ตฌ์ฒด์ ์ธ ๋ถ๋ถ
- ์์กด ๊ด๊ณ๋ ์ด๋ค ๋ฐฉํฅ์ผ๋ก ํ๋ฌ๊ฐ์ผ ํ๋๊ฐ?
- iOS ์์
- UITableView
- UITableView์ ๋์์ DataSource, Delegate์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฒด์ ์ธ ๋์์ ์ฃผ์ ๋ฐ์์ ๋์ํจ
- ์ถ์์ ์ธ ๋ถ๋ถ(UITableView)์ด ๊ตฌ์ฒด์ ์ธ ๋ถ๋ถ(DataSource, Delegate์ ๊ตฌํ๋ ์ฝ๋)์ ์์กดํ์ง ์์
- ์ง์ ์ ์ผ๋ก ์์กดํ์ง ์๊ณ ์ธํฐํ์ด์ค(DataSource, Delegate)์ ์์กดํจ
- UIViewController, CustomViewController
- UIViewController๋ View life-cycle์ ๋ํ ์ ์ฑ ๊ฒฐ์
- CustomViewController๋ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ์ํ
- UITableView
- ํจ๊ณผ
- ๋ ๋ชจ๋๊ฐ์ ์์กด๊ด๊ณ๋ฅผ ๋จ๋ฐฉํฅ์ผ๋ก ๋ง๋ค์ด์ค
- ์ถ์ํ๋ ๋ถ๋ถ์ ์ฝ๋๋ ์ฌํ์ฉ์ฑ์ด ์ฆ๊ฐํจ
- ๊ณ ๋ฏผ ์ฌํญ๋ค
- ๋ ์ด์ด์ ๊ตฌ๋ถ
- ์ถ์์ ์ธ ๋ถ๋ถ (์ ์ฑ
)
- ์์ฃผ ๋ณ๊ฒฝ๋์ง ์๋ ๋ถ๋ถ
- ํด๋น ๋ก์ง์ ๋ผ๋
- ๊ตฌ์ฒด์ ์ธ ๋ถ๋ถ (์ธ๋ถ)
- ์์ฃผ ๋ณ๊ฒฝ๋๋ ๋ถ๋ถ
- ์๊พธ ์ถ๊ฐ๋๋ ๋ถ๋ถ
- ์ถ์์ ์ธ ๋ถ๋ถ (์ ์ฑ
)
- ์์กด์ฑ์ ์ดํ
- ํน์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ฌ๋ฌ๊ฐ์ฒด๊ฐ ํ์ํ ๊ฒฝ์ฐ๋ฅผ ๋งํจ
- ์์กด์ฑ์ ์ดํ์ ์คํ๊ฒํฐ๋ฅผ ๋ง๋ฆ
- ์ ํฉํ ์์น์์ DIP๋ฅผ ์ด์ฉํด์ ์์กด์ฑ ์ดํ์ ๋ง์์ฃผ์ด์ผ ํจ
- ๊ฐ ๋ ์ด์ด์ ์ธํฐํ์ด์ค
- ์ธํฐํ์ด์ค: ๊ฐ์ฅ ๋ณํ๊ฐ ์ ์ด์ผ ํจ
- ์์ ๋ ์ด์ด์ ํ์ ๋ ์ด์ด๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ๋๋ฌธ
- ์์ ๋ ์ด์ด
- ๋ณํ๊ฐ ์ ์
- ์ฌํ์ฉ์ฑ ๋์
- ํ์ ๋ ์ด์ด
- ์์ฃผ ๋ณ๊ฒฝ๋จ
- ์ธํฐํ์ด์ค: ๊ฐ์ฅ ๋ณํ๊ฐ ์ ์ด์ผ ํจ
- ์ธํฐํ์ด์ค์ ์์
- ๋๊ฐ ์์ ํ๊ณ ์ ๊ณตํ๋๊ฐ?
- Class A - Class B๋ ์๋ก ์ฐธ์กฐ์ค
- Class A๊ฐ Class B๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ํฉ
- Class A๊ฐ interface ์ ๊ณต, Class B๊ฐ ์ฌ์ฉ
- Class B๊ฐ interface ์ ๊ณต, Class A๊ฐ ์ฌ์ฉ: iOS ์ฑํ
- ViewController(A)๊ฐ UITableView(B)๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ํฉ
- UITableView๊ฐ DataSource, Delegate๋ฅผ ์ ๊ณตํ๊ณ , ViewController๊ฐ ์ฌ์ฉ
- DIP ๊ฐ๋
์ผ๋ก ํด๋ผ์ด์ธํธ ํด๋์ค์ ์๋ฒ ํด๋์ค๋ฅผ ๋๋ ๋ณธ๋ค๋ฉด,
- UIViewController: ์๋ฒ ํด๋์ค
- ๊ตฌ์ฒด์ ์ธ ๋์ (DataSource, Delegate)๋ฅผ ์ ๊ณต
- ํด๋น ๋์์ด ์ฌ์ฉ๋จ(์๋)
- ์์ฒญ์ ๋ฐ๋ฅธ ๋์์ ์๋ตํด์ค
- UITableView: ํด๋ผ์ด์ธํธ ํด๋์ค
- ์ ๊ณต๋ ๋์์ ์ฌ์ฉํจ(๋ฅ๋)
- UIViewController: ์๋ฒ ํด๋์ค
- ์ฆ, iOS์์ ์ฑํํ๋ interface ์ ๊ณต ๋ฐฉ์์ ํด๋ผ์ด์ธํธ๊ฐ interface๋ฅผ ์์ ํ๊ณ ์๋ ๋ฐฉ์์
- ์ด์
- ์ธํฐํ์ด์ค ๋ณ๊ฒฝ์, ํด๋ผ์ด์ธํธ ์๊ตฌ์ ์ํด์ ๋ฐ์
- ๋ณ๊ฒฝ์ ์ ๋ฐํ ์ชฝ์์ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด ์ ๋ฆฌ
- ์ฆ, ์ด๋ป๊ฒ ์์ฒญ์ ์ค! ๋ผ๊ณ ํ๋ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด ๋ซ๋ค๋ ๋ง
- ์ด์
- ํด๋์ค์ ํ๋ฐ์ฑ์ ๋ฐ๋ฅธ ์ ์ฉ
- ํ๋ฐ์ฑ
- ๋ณ๊ฒฝ์ด ๊ฑฐ์ ์๋ ํด๋์ค
- String, Data etc
- ๋นํ๋ฐ์ ํด๋์ค ๊ฒฝ์ฐ ๊ฐํ๊ฒ ์ ์ฉํ ํ์ ์์
- ๋นํ๋ฐ์ ํด๋์ค์ ์์กดํ๋ ๊ฒ์ ํฐ ํด๊ฐ ๋์ง ์์
- ์ถ์ํ๋ ํด๋์ค(DataSource, Delegate)๋ ๋นํ๋ฐ์ ํด๋์ค์ ๊ฐ๊น๊ธฐ ๋๋ฌธ์, ํด๋น ํด๋์ค๋ฅผ ์ฐธ์กฐํ๊ฑฐ๋ ์์ ํ๋ ๊ฒ์ ํฐ ๋ฌธ์ ๊ฐ ์๋
- ํ๋ฐ์ฑ
- ๋ ์ด์ด์ ๊ตฌ๋ถ