๋ฆฌํŒฉํ† ๋ง ์ž‘์—…์ค‘, ๊ณ ๋ฏผํ–ˆ๋˜ ๊ฒƒ๋“ค์„ ์ •๋ฆฌํ•ด๋ณธ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ๋Š” ๋„์›€์ด ๋˜๊ฒ ์ง€.

๋ฌธ์ œ ์ƒํ™ฉ

์ผ๋‹จ ๋ฌธ์ œ์ƒํ™ฉ์€ ์œ„์™€ ๊ฐ™๋‹ค. ๊ฐ™์€ VC๋กœ ์ž‘์„ฑ๋˜์–ด์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์‹ค์ œ ์œ ์ €๊ฐ€ ์ง„์ž…ํ–ˆ์„ ๋•Œ ๋ณด๋Š” ํ™”๋ฉด์€ ๋‘๊ฐ€์ง€์ด๋‹ค. ํ•˜๋‚˜๋Š” ์—†๋Š” ์ƒํ’ˆ์ด๊ธฐ ๋•Œ๋ฌธ์— โ€œ๋“ฑ๋กโ€์ด ํ•„์š”ํ•˜๊ณ , ํ•˜๋‚˜๋Š” ์ด๋ฏธ ๋“ฑ๋ก๋œ ์ƒํ’ˆ์„ โ€œ์ˆ˜์ •โ€ํ•˜๋Š” ํ™”๋ฉด์ด๋‹ค.

๋‘ ํ™”๋ฉด์€ ์ƒ๋‹นํžˆ ์œ ์‚ฌํ•˜๋ฉฐ, ์•ฝ๊ฐ„์˜ ๋กœ์ง ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ์ด ๋“ฑ๋ก์˜ ๊ฒฝ์šฐ ์ถ”๊ฐ€๋งŒ ๊ฐ€๋Šฅํ•˜๊ณ , ์ˆ˜์ •์˜ ๊ฒฝ์šฐ ์‚ญ์ œ, ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด ๋ฒ„ํŠผ๋“ค์€ ๋‹จ์ˆœํžˆ hidden ์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ๋งŒ ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค.

์ƒํ’ˆ ์„ ํƒ์˜ ๊ฒฝ์šฐ โ€œ์ˆ˜์ •โ€, โ€œ๋“ฑ๋กโ€ ํ™”๋ฉด ๋ชจ๋‘์—์„œ ์‚ฌ์šฉํ•˜๋Š” method์ด์ง€๋งŒ, ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š” ๋กœ์ง์€ ๋‹ค๋ฅด๋‹ค. ์ถ”๊ฐ€ ํ•˜๊ธฐ, ์ˆ˜์ • ํ•˜๊ธฐ, ์‚ญ์ œ ํ•˜๊ธฐ์˜ ๊ฒฝ์šฐ ๋ณด์—ฌ์ง€๋Š” mode(์ˆ˜์ •, ๋“ฑ๋ก)์— ๋”ฐ๋ผ ๋‹ฌ๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

์ƒํ™ฉ ํŒ๋‹จ

๊ฐ€์žฅ ์ด์ƒ์ ์œผ๋กœ๋Š”, ๋‘ ํ™”๋ฉด์ด ๋น„์Šทํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๊ฐœ์˜ VC๋ฅผ ๋งŒ๋“ค๊ณ  ๋‘ ๊ฐœ์˜ ViewModel์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด ๋ณด๊ธฐ ์ข‹์„ ๊ฒƒ์ด๋‹ค. ์ด ๋•Œ, View code๋ฅผ componentํ™” ํ•˜์—ฌ ์žฌํ™œ์šฉ์„ ํ†ตํ•ด ์ƒ์‚ฐ์„ฑ์„ ๋†’ํžˆ๋Š” ๋ฐฉํ–ฅ์ด ๊ฐ€์žฅ ๊น”๋”ํ•  ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ, ์ด๋Ÿฌํ•œ ์ ์„ ์•Ž์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ง€๊ธˆ ์ƒํ™ฉ์—์„œ๋Š” VC ์ฝ”๋“œ๋ฅผ ๋งŒ์ง€์ง€ ์•Š์„ ์ƒ๊ฐ์ด๋‹ค. ์ผ๋‹จ Componentํ™” ๋˜์ง€๋„ ์•Š์•˜๊ณ , Storyboard๋กœ ์งœ์ ธ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹น์žฅ ์ด ๋ถ€๋ถ„์„ ๊ฑด๋“ค์ด๋Š” ๊ฑด ๋ฆฌํŒฉํ† ๋ง ์‹œ ํฐ์ผ์ด๋ผ ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ณด๋‹ค๋Š” ์ผ๋‹จ business logic ๋ถ€ํ„ฐ ๋ถ„๋ฆฌ๋ฅผ ํ•˜๊ณ , ์ถ”ํ›„์— View๋Š” ๋ฐ”๋€” ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์œผ๋‹ˆ, ๊ทธ ๋•Œ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋ณด๋‹ค ํšจ์œจ์ ์ด๋ผ ํŒ๋‹จํ–ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ€์ •์—์„œ ์ถœ๋ฐœํ•œ ํ•ด๋‹น ์ž‘์—…์˜ ์ œ์•ฝ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ œ์•ฝ ์กฐ๊ฑด

โ€œ๋“ฑ๋กโ€๊ณผ โ€œ์ˆ˜์ •โ€์— ์žˆ์–ด ViewModel์„ ๋ถ„๋ฆฌํ•œ๋‹ค. โ€œ๋“ฑ๋กโ€๊ณผ โ€œ์ˆ˜์ •โ€์€ ๋ช…๋ฐฑํžˆ ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•˜๊ณ  ์žˆ๋‹ค. ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ถ”ํ›„ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด๋‹น ํ™”๋ฉด์„ ์ง„์ž…ํ•  ๋•Œ ํŽธํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์‹ค์ œ๋กœ ๋‘ ๋กœ์ง์ด ํ˜ผ์žฌ๋˜์–ด ์žˆ์–ด ํ•ด๋‹น ํ™”๋ฉด์˜ ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ์ƒ๋‹นํžˆ ์–ด๋ ค์› ๋‹ค. ๊ทผ๋ณธ์ ์œผ๋กœ ๋‘ ํ™”๋ฉด์˜ ์ง„์ž… ์‹œ์ ์—์„œ ๋ถ„๊ธฐ๊ฐ€ ๋˜์–ด์•ผ ํ•จ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค๋ฉด, ์ดํ•ด๊ฐ€ ์‰ฌ์šธ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ํ™”๋ฉด์˜ business logic์„ ๋ถ„๋ฆฌํ•œ ViewModel์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด ๋งž๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

๋‘๋ฒˆ์งธ๋กœ, ๋‹น์žฅ View๋ฅผ ๊ฑด๋“ค์ด์ง€ ์•Š๋Š”๋‹ค. View๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ๋งŽ์ด ๋ณ€๊ฒฝ๋˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. ์‹ค์ œ๋กœ ์ถ”ํ›„ ์ŠคํŽ™์—์„œ ๋ณ€๊ฒฝ๋จ์ด ํ™•์ธ๋˜์—ˆ๋‹ค. Cost ์ธก๋ฉด์—์„œ ๋ณด๋‹ค ์šฐ์„ ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

๋ชฉํ‘œ

์ด๋Ÿฌํ•œ ์ œ์•ฝ ์กฐ๊ฑด์—์„œ ๋‹ฌ์„ฑํ•˜๊ณ  ์‹ถ์€ ๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ตœ๋Œ€ํ•œ ์žฌ์‚ฌ์šฉ์„ฑ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ, ์ง๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ค‘๋ณต์„ ์ตœ์†Œํ™”ํ•œ ๋ถ„๋ฆฌ๋ฅผ ์„ฑ๊ณต์‹œํ‚จ๋‹ค.

ํ•ด๋‹น ํ™”๋ฉด์— ๋Œ€ํ•ด ์ด์ œ์•ผ ์กฐ๊ธˆ ์ดํ•ด๊ฐ€ ๋˜์—ˆ์ง€๋งŒ ์ดˆ๋ฐ˜์—๋Š” ์–ด๋–ค ์ „๋žต์„ ํ•ด์•ผํ•  ์ง€ ๋ชฐ๋ผ ๋ฐฐ์šด๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๋ชจ๋“  ์˜ต์…˜์„ ์ ์šฉํ•ด๋ณด์•˜๋‹ค. ๋‹ค์Œ์€ ๊ทธ ๊ณผ์ •์ด๋‹ค.

Naiveํ•œ Protocol ์‚ฌ์šฉ

์ผ๋‹จ ๊ฐ€์žฅ ๋จผ์ € ์ƒ๊ฐํ•œ ์˜ต์…˜์€ Protocol์ด๋‹ค. ์ด์ „์— OOP์— ๋Œ€ํ•œ ๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉด์„œ, ์ƒ์†์€ ์ตœํ›„์˜ ์ˆ˜๋‹จ์ด๋ผ๊ณ  ์ •๋ฆฌํ•œ ์ ์ด ์žˆ๋‹ค. Object Oriented Programming ๊ธ€์— ์ ํ˜€์žˆ๋‹ค. Interface๋งŒ ์ ์šฉํ•ด์„œ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค. โ€œ๋“ฑ๋กโ€ ๋ฐ โ€œ์ˆ˜์ •โ€ ํ™”๋ฉด์—์„œ ์ถ”๊ฐ€ํ•˜๊ธฐ, ์ˆ˜์ •ํ•˜๊ธฐ ๋ฒ„ํŠผ์€ UI์ ์œผ๋กœ ๋™์ผํ•˜๊ฒŒ ๋˜์–ด ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ์ ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒ๊ฐ์„ ํ–ˆ๋‹ค.

๊ฐ™์€ ๋ฒ„ํŠผ์ธ๋ฐ ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•˜๋„ค? ๊ทธ๋Ÿผ ๊ฐ™์€ interface๋ฅผ ๋งŒ๋“ค๊ณ , ์‹ค์ œ ๊ตฌํ˜„๋งŒ EnrollViewModel, EditViewModel์—์„œ ๋‹ค๋ฅด๊ฒŒ ํ•˜๋ฉด ๋˜๊ฒ ๋‹ค!

์œ„๋Š” ๊ทธ๋Ÿฌํ•œ ์ƒ๊ฐ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ทธ๋ ค๋ณธ ๊ทธ๋ฆผ์ด๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” โ€œ์ˆ˜์ •โ€ ํ™”๋ฉด์—๋Š” ์‚ญ์ œ ํ•˜๊ธฐ๋„ ์žˆ์—ˆ๊ณ , ๊ธฐ์กด ์ƒ๊ฐ์„ ์ ์šฉํ•  ๊ฒฝ์šฐ ์ถ”๊ฐ€ ํ•˜๊ธฐ, ์ˆ˜์ • ํ•˜๊ธฐ, ์‚ญ์ œ ํ•˜๊ธฐ ์„ธ ๊ฐœ์˜ ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜์˜ interface๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๋”ฑ๋ด๋„ ๋ญ”๊ฐ€ ์ด์ƒํ•˜๋‹ค.

์ผ๋‹จ ์ด๊ฒŒ ๋งž๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋”๋ผ๋„ ์–ด๋–ค ์ด๋ฆ„์„ ์ง€์–ด์•ผ ํ• ์ง€๊ฐ€ ๋ถˆ๋ถ„๋ช…ํ–ˆ๋‹ค. ์ด๋ฏธ ์—ฌ๊ธฐ์„œ ์ด ๋ฐฉ๋ฒ•์— ๋ชจ์ˆœ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ํŠน์ • ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๋™์ž‘์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ช…๋ฐฑํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚˜๋Š” ์ˆœ๊ฐ„์ด๋‹ค. ๊ทธ๋ž˜๋„ ์ผ๋‹จ ํ•ด๋ดค๋‹ค.

tempMethod๋ผ๊ณ  ์ž„์˜๋กœ ์นญํ•œ ์ƒํƒœ์—์„œ ์ ์šฉํ•ด๋ณด์•˜๋‹ค. ํฌ๊ฒŒ 3๊ฐ€์ง€์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

  1. Protocol์€ ๊ธฐ๋ณธ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๊ตฌํ˜„์ฒด์—์„œ ์ผ์ผํ•ด Property๋ฅผ ๋งŒ๋“ค์–ด์คฌ์–ด์•ผ ํ–ˆ๋‹ค. ์ ‘๊ทผ ์ œ์–ด๋„ ๊ธฐ๋ณธ ๊ตฌํ˜„๊ณผ ๋‹ฌ๋ฆฌ internal๋กœ๋งŒ ์ ์šฉ์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค.
  2. ๋ถ„๋ช… ์ค‘๋ณต๋˜๋Š” Method, ๋’ค๋กœ ๊ฐ€๊ธฐ, ์ƒ์„ธ ๋ณด๊ธฐ์˜ ๊ฒฝ์šฐ ๊ฐ™์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‘ ๊ตฌํ˜„์ฒด์—์„œ ๊ฐ™์€ ๋‚ด์šฉ์„ ๊ตฌํ˜„ํ•ด์ฃผ์–ด์•ผ ํ–ˆ๋‹ค. extension์„ ํ™œ์šฉํ•œ ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•ด๋‹น ๊ตฌํ˜„์ด ๋ช‡ ๊ฐœ์˜ ์ƒํƒœ๊ฐ’๊ณผ ์—ฐ๊ด€์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋Š” Protocol์—์„œ ๊ตฌํ˜„์ด ๋ถˆ๊ฐ€ํ–ˆ๋‹ค.
  3. ์ถ”๊ฐ€์ ์œผ๋กœ ํ•˜๋‚˜์˜ interface๋กœ ํ‰์น˜๋Š” ์ˆœ๊ฐ„, โ€œ์ˆ˜์ •โ€ํ™”๋ฉด์—์„œ๋Š” ๋ถ„๊ธฐ๊ฐ€ ํ•„์š”ํ–ˆ๋‹ค.

์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ๋Š” ์•ˆ๋˜๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•˜๊ณ  ๋‹ค์Œ ๋ฐฉ์‹์„ ์‹œ๋„ํ•˜๊ฒŒ ๋œ๋‹ค.

๋‹จ์ˆœ Inherence

ํ•˜์ง€๋ง๋ผ๋˜ ์ƒ์†์„ ํ•œ๋ฒˆ ์ ์šฉํ•ด๋ณด์•˜๋‹ค. ๋ง๋งŒ ํ•˜๋ฉด ๋จธ๋ฆฌ์— ์•ˆ๋‚จ์œผ๋‹ˆ๊นŒ. ์ผ๋‹จ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ฐฉ์‹์€ ViewController์—์„œ ๋‘ ๊ตฌํ˜„์ฒด๋ฅผ ๋ชจ๋ฅด๋”๋ผ๋„ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋™์ž‘์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. (๋‚˜์ค‘์— ๊ฐ€๋ณด๋‹ˆ ์ด ์ƒ๊ฐ ์ž์ฒด๊ฐ€ ์ž˜๋ชป๋๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค)

class ViewController: UIViewController {
    let viewModel: AncesterViewModel
 
    private productSelected() {
        self.viewModel.selectProduct()
    }
 
    private saveButtonTouched() {
        if self.viewModel is EnrollViewModel {
            self.viewModel.add()
        } else {
            self.viewModel.update()
        }
    }
}
 
class EnrollViewModel: AncesterViewModel {
    override func selectProduct() {
        // Enroll์‹œ ์ƒํ’ˆ ์„ ํƒํ–ˆ์„ ๋•Œ ๋™์ž‘
    }
 
    override func add() {
        // ์ถ”๊ฐ€ํ•˜์ž
    }
}
 
class EditlViewModel: AncesterViewModel {
    override func selectProduct() {
        // Edit์‹œ ์ƒํ’ˆ ์„ ํƒํ–ˆ์„ ๋•Œ ๋™์ž‘
    }
 
    override func update() {
 
    }
}
 
// ์‚ฌ์šฉํ•˜๋Š” ๊ณณ: ๋“ฑ๋ก
let viewController = ViewController(viewModel: EnrollViewModel)
 
// ์‚ฌ์šฉํ•˜๋Š” ๊ณณ: ์ˆ˜์ •
let viewController = ViewController(viewModel: EditViewModel)
 

์ด๋Ÿฐ ๋ฐฉ์‹์„ ์ƒ๊ฐํ–ˆ๋‹ค. ์ƒํ’ˆ ์„ ํƒ์˜ ๊ฒฝ์šฐ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค. ๋‘ ๊ตฌํ˜„์ฒด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜ ์ž์ฒด๋Š” ๊ฐ™์œผ๋‚˜ ์‹ค์ œ ๊ตฌํ˜„๋งŒ ๋‹ฌ๋ผ์ง€๋‹ˆ๊นŒ. ๊ทธ๋Ÿฐ๋ฐ ์ถ”๊ฐ€ํ•˜๊ธฐ, ์ˆ˜์ •ํ•˜๊ธฐ์˜ ๊ฒฝ์šฐ๋Š” ๊ทธ๋ ‡์ง€ ๋ชปํ–ˆ๋‹ค. ๊ฒฐ๊ตญ์—๋Š” ๋„ฃ์–ด์ค€ ViewModel์ด ์–ด๋–ค ๋…€์„์ธ์ง€ ํŒŒ์•…ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ–ˆ๋‹ค.

๋ถ„๊ธฐ๋ฅผ ์—†์•จ ์ˆ˜ ์žˆ๋Š”๊ฐ€?

๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‚˜๋Š” ๋ถ„๊ธฐ๋ฅผ ์—†์•จ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋˜ ๊ฒƒ์ด ์˜คํŒ์ด๋ผ๋Š” ๊ฒฐ๋ก ์— ์ด๋ฅด๋ €๋‹ค. ๋ถ„๊ธฐ๋ฅผ ์—†์•จ ์ˆ˜ ์žˆ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‘ ๊ตฌํ˜„์ฒด์—์„œ ์‚ฌ์šฉํ•˜๋Š” interface์ž์ฒด๊ฐ€ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์™„์ „ํžˆ ์˜คํŒํ–ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€? ๊ทธ ๋ถ„๊ธฐ๋Š” ํ˜„์žฌ ๋ˆ„๊ฐ€ ๊ฐ€์ ธ๊ฐ€์•ผ ํ•˜๋Š”๊ฐ€?

์ผ๋‹จ ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์ด๋ผ๋ฉด ๋ถ„๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณณ์€ ํ•œ์ชฝ์œผ๋กœ ๋ชจ๋Š” ๊ฒƒ์ด ๋ณด๋‹ค ๋งž๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ViewModel์„ ๋ถ„๋ฆฌํ•˜๊ฒ ๋‹ค๋Š” ์˜๋„ ์ž์ฒด๋Š” ๊ฒฐ๊ตญ ์ด ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ์˜ ์ฑ…์ž„์„ ViewController๋กœ ์˜ฎ๊ธฐ๊ฒ ๋‹ค๋Š” ๋ง์ด๋‹ค. ๊ทธ๋ž˜์„œ VC๊ฐ€ ์ด ๋ถ„๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒ ๋‹ค๊ณ  ์•ฝ๊ฐ„์˜ ๋ฐฉํ–ฅ์„ ์กฐ์ •ํ–ˆ๋‹ค.

์ข‹์€ ์ฝ”๋“œ์˜ ์กฐ๊ฑด

์—ฌ๊ธฐ๊นŒ์ง€ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ฒช์œผ๋ฉด์„œ ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ์ข‹์€์ง€์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ณ  ๋ณด๋‹ˆ ์ด์ „์— ๊ณต๋ถ€ํ–ˆ๋˜ ๋‚ด์šฉ์ด์—ˆ๋‹ค. 04. OOP Implement Pattern ๋ถ€๊ทผ์˜ ๊ตฌํ˜„์— ์žˆ์–ด ํ•„์š”ํ•œ ๊ฐ€์น˜ 3๊ฐ€์ง€๋ฅผ ์ฝ์–ด๋ณด์ž. ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์•ž์—์„œ ๋‚˜์™”๋˜ ๋ฐฉ์‹๋“ค์„ ์‚ดํŽด๋ณด๊ณ  ๋ฌธ์ œ๋ฅผ ์งš์–ด๋ณด๋ ค ํ•œ๋‹ค.

๊ธฐ์กด์˜ ๊ฒฝ์šฐ

์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๊ด€์ ์—์„œ ์–ด๋Š์ •๋„๋Š” ํƒ€ํ˜‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์‚ฌ์‹ค ์ง€๊ธˆ์˜ ๊ฒฝ์šฐ Method๊ฐ€ ๋งŽ์ง€๋„ ์•Š๊ณ , ์„œ๋กœ ์†Œํ†ตํ•˜๋Š”๋ฐ ํฌ๊ฒŒ ๋ฌธ์ œ๋Š” ์—†๋‹ค. ๋‹ค๋งŒ, ํ˜„์žฌ์˜ ๊ฒฝ์šฐ ๊ฐ™์€ ๋™์ž‘์„ ํ•˜๋”๋ผ๋„ enrollMode์ธ์ง€ ๊ทธ๋ ‡์ง€ ์•Š์€์ง€์— ๋Œ€ํ•ด ํŒ๋‹จํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํŽธํ•  ์ˆ˜ ์žˆ๋‹ค.

์–ด๋Š ์†Œ์Šค ํŒŒ์ผ ๊ด€์ ์—์„œ ๋ณด๋Š๋ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ๊ฒƒ ๊ฐ™๋‹ค. ๋‹จ์ˆœํ•จ์ด ์ฝ๊ธฐ ์‰ฌ์›€์— ๊ฐ€๊น๋‹ค๋Š” ์ ์— ๊ทผ๊ฑฐํ•ด์„œ ๋ณธ๋‹ค๋ฉด ์–ด๋Š์ •๋„๋Š” ๋งž๋Š” ๋“ฏ ํ•˜๋‹ค.

ํ™•์žฅ์„ฑ์˜ ๊ด€์ ์—์„œ๋Š” ์ข‹์ง€ ์•Š์„ ๋“ฏํ•˜๋‹ค. ํ™•์žฅ์‹œ ๊ฒฐ๊ตญ์—๋Š” ๋™์ž‘์ด ์ค‘์ฒฉ๋˜๋Š” ์นœ๊ตฌ์— ๊ณ„์†ํ•ด์„œ ๊ตฌํ˜„์ด ๋Š˜์–ด๊ฐ€๊ฒŒ ๋˜๋Š”๋ฐ, ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์–ด๋Š ์ˆœ๊ฐ„ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ์ˆœ๊ฐ„์ด ์˜จ๋‹ค. ์ˆ˜์ •์ž๊ฐ€ ๋ณธ์ธ์ด๋ผ ์ดํ•ดํ•˜๋Š” ๊ฑฐ์ง€ ์‹ค์ œ๋กœ ๋ณด๋ฉด ๋ญ”๊ฐ€ ๋ถ„๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๋ƒ„์ƒˆ๊ฐ€ ๋‚œ๋‹ค.

Naive Protocol ์‚ฌ์šฉ์˜ ๊ฒฝ์šฐ

์ด๊ฑด ์„ธ ์›์น™์— ๊ทผ๊ฑฐํ•ด์„œ ์•Œ์•„๋ณผ ํ•„์š”๋„ ์—†๋‹ค. ์ด ๋ฐฉ์‹์€ ์•„์˜ˆ ์ž˜๋ชป ์‚ฌ์šฉํ•œ ๋ฐฉ์‹์ด๋‹ค. ํ™•์žฅ์„ฑ์ด ์žˆ์ง€๋„ ์•Š๊ณ  ๊ทธ๋ƒฅ ์†์ด ์›€์ง์—ฌ์„œ ์ ์šฉํ•œ ์ˆ˜์ค€์ด๋‹ค. ์‹ฌ์ง€์–ด ๋‹จ์ˆœํ•˜์ง€๋„ ์•Š๋‹ค.

๋‹จ์ˆœ Inherence์˜ ๊ฒฝ์šฐ

์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ์ธก๋ฉด๊ณผ ๋‹จ์ˆœํ•จ ์ธก๋ฉด์—์„œ ์ข‹์ง€ ์•Š๋‹ค ์ƒ๊ฐํ•œ๋‹ค. ์ผ๋‹จ ๋ถ€๋ชจ class๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์‚ดํŽด๋ณด์•„์•ผ ํ•œ๋‹ค. ์ง๊ด€์„ฑ์ด ๋–จ์–ด์ง„๋‹ค. ์ƒ์†๋ฐ›์€ ๊ตฌํ˜„์ฒด๋งŒ ๋ฐ”๋ผ๋ณธ๋‹ค๋ฉด ์ผ์‹œ์ ์œผ๋กœ ๋‹จ์ˆœํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” VC์—์„œ ์กฐ์ƒ class์˜ method๋„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ๊ธฐ ์‰ฝ์ง€ ์•Š๋‹ค.

ํ™•์žฅ์„ฑ์— ๋ถ€๋ถ„์—์„œ๋Š” ๊ฐ€์žฅ ์ข‹์ง€ ์•Š๋‹ค. ์ƒ์†์€ ํ•˜๋‚˜๋งŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์ ์ด ์ •๋ง ์น˜๋ช…์ ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ํŠน์ • ๋ถ€๋ถ„์ด ๋‹ค๋ฅด๋‹ค๋ฉด ์•„์˜ˆ ๊ตฌ์กฐ์ž์ฒด๋ฅผ ํ‹€์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋‚˜์˜จ๋‹ค. Object Oriented Programming์„ ๋‹ค์‹œํ•œ๋ฒˆ ์ฝ์–ด๋ณด์ž.

Interface Separation Principle

๊ทธ๋ž˜์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‚˜์˜จ ๊ฒฐ๋ก ์€ ์ด๊ฑฐ๋‹ค. ์ž˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‘ ํ™”๋ฉด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ ์ž์ฒด๊ฐ€ ๋ถ™์˜€๋‹ค ๋–ผ์—ˆ๋‹คํ•  ์ˆ˜ ์žˆ๋‹ค. ์ •ํ™•ํ•˜๊ฒŒ ํŠน์ • VC์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ๋งŒ ๋ถ™์—ฌ์„œ ์ œ๊ณตํ•˜์ž. ๊ทธ๋ฆฌ๊ณ  VC์—์„œ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ฒ ๋‹ค๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํŠน์ • ๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ์„ ๋•Œ Protocol Type Check๋ฅผ ํ†ตํ•ด ๋™์ž‘์„ ๊ตฌ๋ถ„ํ•˜์ž.

์ตœ์„ ์ธ๊ฐ€?

์ผ๋‹จ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ์ธก๋ฉด์—์„œ โ€œ์ฑ„ํƒํ•˜๊ณ  ๊ตฌํ˜„โ€์ด๋ผ๋Š” ๋‹จ์ˆœํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ˆœํ•จ ์ธก๋ฉด์—์„œ๋Š” ์‚ฌ๋žŒ๋งˆ๋‹ค ์„ฑํ–ฅ์ด ๋‹ค๋ฅผ ๋“ฏํ•˜๋‹ค. ์˜คํžˆ๋ ค protocol์„ ๋งŽ์ด ๋งŒ๋“ค์–ด์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ์˜ ํ•˜๋‚˜์˜ ViewModel์— ๋„ฃ์–ด๋‘๋Š” ๊ฒƒ๋ณด๋‹ค ๊ท€์ฐฎ์„ ์ˆ˜ ์žˆ๋‹ค.

ํ™•์žฅ์„ฑ ์ธก๋ฉด์—์„œ๋Š” ๋ณด๋‹ค ์ข‹๋‹ค. ๋งŒ์•ฝ read๋ผ๋Š” (์‚ฌ์‹ค ์—†๊ฒ ์ง€๋งŒ..) ๋…€์„์ด ์ถ”๊ฐ€๋œ๋‹ค๋ฉด protocol์ถ”๊ฐ€ํ•˜๊ณ  ์ฑ„ํƒํ•ด์„œ ๊ตฌํ˜„ํ•˜๋ฉด ๋์ด๋‹ค.

๋งˆ๋ฌด๋ฆฌ

์ด ๋ถ€๋ถ„์„ ํ•˜๋ฉด์„œ ์ •๋ง ์–ด๋ ค์› ๋‹ค. ๋‹ต์ด ์—†๋Š” ๋ถ„์•ผ์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜๋„ ๋‹ค์–‘ํ•œ ๋ถ„๋“ค๊ณผ ํ•จ๊ป˜ ์†Œํ†ตํ•˜๋ฉด์„œ ๊ฐ์ž์˜ ์ƒ๊ฐ์„ ๋งž์ถฐ๋ณผ ์ˆ˜ ์žˆ์–ด ์˜๋ฏธ์žˆ์—ˆ๋‹ค. ISP๋ฅผ ์ž˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ์Šค๋‚„์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๋!