Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Computer/Computer Science

[Software Engineering] (iOS/Swift ๊ธฐ์ค€) ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (OOP), OOP ํŠน์ง•, OOP 5์›์น™ SOLID

๊ฐ์ž ๐Ÿฅ” 2022. 9. 18. 17:09
๋ฐ˜์‘ํ˜•

์Šคํ„ฐ๋””๋ฅผ ์šด์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น repository์— ๊ฐ€๋ฉด ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!
ํŠนํžˆ close ๋œ PR์„ ๋ณด์‹œ๋ฉด, ์–ด๋–ค ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ๊ณ ๋ฏผํ•˜๊ณ  ์Šคํ„ฐ๋””์›๋“ค๊ณผ ์ด์•ผ๊ธฐ๋‚˜๋ˆด๋Š”์ง€ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค 

https://github.com/JulSaMo/CS-start

 

GitHub - JulSaMo/CS-start: ๐Ÿ“ CS ์ง€์‹ ๋Œ€๋ฐฑ๊ณผ โœจ

๐Ÿ“ CS ์ง€์‹ ๋Œ€๋ฐฑ๊ณผ โœจ. Contribute to JulSaMo/CS-start development by creating an account on GitHub.

github.com

 


๐ŸŸ  ๊ฐ์ฒด (Object)

CS์—์„œ ๊ฐ์ฒด๋Š” ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์กด์žฌํ•˜๊ฑฐ๋‚˜ ์ถ”์ƒ์ ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ์ค‘์—์„œ ์ž์‹ ์˜ ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๋‹ค๋ฅธ๊ฒƒ๊ณผ ์‹๋ณ„ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ปดํ“จํ„ฐ๋ฅผ ์˜ˆ๋กœ๋“ค๋ฉด, 'ํ‚ค๋ณด๋“œ, ๋งˆ์šฐ์Šค, ์Šคํ”ผ์ปค ๋“ฑ'์ด ๊ฐ์ฒด๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ณ , ์ด๊ฒƒ๋“ค์€ ๊ฐ๊ฐ '์ž…๋ ฅ, ์†Œ๋ฆฌ์ถœ๋ ฅ, ์ธํ„ฐํŽ˜์ด์Šค ์กฐ์ž‘ ๋“ฑ'์˜ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•œ๋‹ค.

๐ŸŸ  ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (OOP, Object Oriented Programming)

๊ฐ์ฒด๋“ค์˜ ์ƒํ˜ธ์ž‘์šฉ์œผ๋กœ ์„œ์ˆ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•
ํ˜„์‹ค์„ธ๊ณ„์˜ ๊ฐ์ฒด๋ฅผ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ฐ์ฒด๋กœ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ (ํ˜„์‹ค๊ฐ์ฒด์˜ ์†์„œ์˜ค๊ฐ€ ๋™์ž‘์„ ์ถ”๋ ค๋‚ด์„œ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ฐ์ฒด์˜ ํ•„๋“œ์™€ ๋ฉ”์„œ๋“œ๋กœ ์ •์˜ ํ•˜๋Š” ๊ณผ์ •)

์ฆ‰, ์ฝ”๋“œ๋กœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ•์ด๋‹ค. ํ”„๋กœ๊ทธ๋žจ์„ ๊ทธ์ € ๋ฐ์ดํ„ฐ์™€ ์ฒ˜๋ฆฌ๋ฐฉ๋ฒ•์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์ˆ˜์˜ '๊ฐ์ฒด'๋กœ ๋งŒ๋“ค์–ด๋†“๊ณ , ๊ฐ์ฒด๋“ค๋ผ๋ฆฌ ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉ์„ ํ†ตํ•ด์„œ ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด์ง€๋Š” ๋ฐฉ์‹์ด๋‹ค.

๊ฐ€์žฅ ์‰ฝ๊ฒŒ ์ปดํ“จํ„ฐ๋กœ ์˜ˆ๋ฅผ ๋“ค๋ฉด, ์ปดํ“จํ„ฐ ํ•œ๋Œ€๋Š” 'CPU, RAM, BOARD, SSD,,,' ์—ฌ๋Ÿฌ๊ฐ€์ง€์˜ ๋ถ€ํ’ˆ๋“ค๋กœ ๊ตฌ์„ฑ๋˜๊ณ , ๊ฐ ๋ถ€ํ’ˆ๋“ค์ด ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜์—ฌ ์ƒํ˜ธ์ž‘์šฉ์• ํ†ตํ•ด ์ปดํ“จํ„ฐ๊ฐ€ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๊ฒƒ์ฒ˜๋Ÿผ, ๋ถ€ํ’ˆ๋“ค์€ ๊ฐ์ฒด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 



๐ŸŸ  ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ 4๊ฐ€์ง€ ํŠน์„ฑ (โœจ์ค‘์š”!)

1๏ธโƒฃ ์ถ”์ƒํ™”

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

2๏ธโƒฃ ์บก์Šํ™”

 

- ๊ฐ์ฒด ์ˆ˜ํ–‰ ๋ชฉ์ ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ๊ฒฐํ•ฉ์‹œ์ผœ ๋ฌถ์–ด์„œ, ์™ธ๋ถ€์— ๋‚ด๋ถ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋‚ด์šฉ์„ ๊ฐ์ถ”๊ณ  ์ด์šฉ๋ฐฉ๋ฒ•๋งŒ ์•Œ๋ ค์คŒ.
- ์™ธ๋ถ€๊ฐ์ฒด๋Š” ๋‚ด๋ถ€๊ฐ์ฒด์˜ ๊ตฌ์กฐ๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๊ณ , ๊ฐ์ฒด๊ฐ€ ๋…ธ์ถœํ•ด์„œ ์ œ๊ณตํ•˜๋Š” ํ•„๋“œ์™€ ๋ฉ”์„œ๋“œ๋งŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Œ.

 

๐Ÿ“ ์ด๋ ‡๊ฒŒ ์™œ ์™ธ๋ถ€๊ฐ์ฒด๊ฐ€ ์•Œ์ง€ ๋ชปํ•˜๊ฒŒ ์บก์Šํ™”๋ฅผ ํ•˜๋Š”๊ฑด๊ฐ€์š”?

์บก์Šํ™”๋Š” ๊ด€๋ จ์žˆ๋Š” ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ ๋ฌถ๊ณ  ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์€๋‹‰ํ•˜๋Š”๊ฒŒ ํ•ต์‹ฌ์ด๋‹ค. ๊ฐ์ฒด์— ์ง์ ‘์ ์ธ ์ ‘๊ทผ์„ ๋ง‰๊ณ  ์™ธ๋ถ€์—์„œ ๋‚ด๋ถ€์˜ ์ •๋ณด์— ์ง์ ‘ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ณ , ๊ฐ์ฒด๊ฐ€ ์ ‘๊ทผํ•˜๋Š” ํ•„๋“œ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์™œ ์ด๋ ‡๊ฒŒ ํ•˜๋ƒ๋ฉด, ๋ฐ”๋กœ ์บก์Šํ™”๋ฅผ ํ•˜๋ฉด ์€๋‹‰ํ™”ํŠน์ง•์˜ ์žฅ์ ์„ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์€๋‹‰ํ™”์˜ ์žฅ์ 

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

 

 

์บก์Šํ™”๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ ‘๊ทผ์ œ์–ด์ž๋ฅผ ํ†ตํ•ด ์„ค๊ณ„๊ฐ€ ์ž˜ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค. ์ž์‹  ๋‚ด๋ถ€์˜ ๋ชจ๋“ˆ์„ ๊ฐ์ถ”๊ณ  ๋‹ค๋ฅธ ๋ชจ๋“ˆ ๋‚ด๋ถ€ ์ž‘์—…๋„ ์ง์ €์ ์œผ๋กœ ๊ฐœ์ž…ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋„๋ก ์„ค๊ณ„ํ•ด์•ผํ•œ๋‹ค. (ex. public, private, getter, setter ๋“ฑ๊ณผ ๊ฐ™์€ ์ ‘๊ทผ์ œ์–ด์ž๊ฐ€ ์กด์žฌํ•˜๋Š” ์ด์œ ์ด๊ธฐ๋„ ํ•˜๋‹ค.)\

3๏ธโƒฃ ์ƒ์† (Interitance)

์ƒ์œ„๊ฐœ๋…์˜ ํŠน์ง•์„ ํ•˜์œ„ ๊ฐœ๋…์ด ๋ฌผ๋ ค๋ฐ›์•„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ

๐Ÿ“ ์ƒ์†์€ ์™œ ํ•ด์•ผํ•˜๋‚˜์š”?

  • ์žฌ์‚ฌ์šฉ์‹ ์ธํ•ด์„œ ์ฝ”๋“œ์˜ ๊ธธ์ด๋ฅผ ์ค„์ด๊ณ , ๊ฐ€๋…์„ฑ์„ ๋†’์ธ๋‹ค.
  • ์ƒ์†์€ ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ ๊ด€์ ์ด ์•„๋‹Œ, ๊ธฐ๋Šฅ์˜ ํ™•์žฅ๊ฐœ๋…์œผ๋กœ ์ƒ๊ฐํ•ด์•ผํ•œ๋‹ค. (์ƒ์œ„ ํด๋ž˜์Šค์— ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ทธ๋Œ€๋กœ ์ƒ์†๋ฐ›๋Š”๋‹ค๊ณ !)

4๏ธโƒฃ ๋‹คํ˜•์„ฑ (Polymorphism) (โœจ์ค‘์š”, ๋ฌผ์–ด๋ณด๋Š” ๋ฉด์ ‘ ์ข€ ๋งŽ์•—์Œ!)

์ƒ์†๊ณผ ์—ฐ๊ด€์žˆ๋Š” ๊ฐœ๋…์œผ๋กœ, ํ•œ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌํ˜•ํƒœ(๊ฐ์ฒด)๋กœ ์žฌ๊ตฌ์„ฑ๋˜๋Š” ๊ฒƒ

์ฆ‰, ํ•œ ๋ถ€๋ชจ ๋ฐ‘์—์„œ ์ƒ์†๋ฐ›๋Š” ์ž์‹๋“ค์ด ๋ชจ๋‘ ๋˜‘๊ฐ™์ง€๋Š” ์•Š๋‹ค๋ผ๋Š” ๊ฐœ๋…์ด๋‹ค.

์˜ค๋ฒ„๋กœ๋“œ์™€ ์˜ค๋ฒ„๋ผ์ด๋“œ๊ฐ€ ๋‹คํ˜•์„ฑ์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ์ด๋‹ค. ์˜ค๋ฒ„๋กœ๋“œ์™€ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ์ฒ˜๋Ÿผ, ์ž์‹ํด๋ž˜์Šค๊ฐ€ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ํŠน์ง•์ด ๋ฐ”๋กœ ๋‹คํ˜•์„ฑ์ด๋‹ค.

 

๐Ÿ“ ์˜ค๋ฒ„๋ผ์ด๋“œ์™€ ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ๋ญ”๊ฐ€์š”? ์ฐจ์ด์ ์„ ์•Œ์•„๋‘์ž!

์˜ค๋ฒ„๋ผ์ด๋“œ, ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ์ ์šฉํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์„ ๊ฐ๊ฐ ์˜ค๋ฒ„๋ผ์ด๋”ฉ, ์˜ค๋ฒ„๋กœ๋”ฉ ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

โœ๏ธ ์˜ค๋ฒ„๋ผ์ด๋”ฉ (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

 

[CS] ๊ฐ์ฒด์ง€ํ–ฅ์ด๋ž€?

1. ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋ž€? > ๊ฐ์ฒด ์ปดํ“จํ„ฐ ๊ณผํ•™์—์„œ ๊ฐ์ฒด(object)๋Š” ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์กด์žฌํ•˜๊ฑฐ๋‚˜ ์ถ”์ƒ์ ์œผ๋กœ ์ƒ๊ฐํ• ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ์ค‘์—์„œ ์ž์‹ ์˜ ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๋‹ค๋ฅธ๊ฒƒ๊ณผ ์‹๋ณ„ ๊ฐ€๋Šฅํ•œ๊ฒƒ์„ ๋งํ•œ๋‹ค. _

velog.io

https://bite-sized-learning.tistory.com/550

 

์Šค์œ„ํ”„ํŠธ(swift)๊ฐ€ ์ง€ํ–ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์€?

์Šค์œ„ํ”„ํŠธ(swift)๊ฐ€ ์ง€ํ–ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์€? ์• ํ”Œ์€ ์ž์‚ฌ ์ œํ’ˆ ๊ฐœ๋ฐœ์— ํ™œ์šฉํ•˜๊ณ ์ž ์ƒˆ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ธ ์Šค์œ„ํ”„ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. 2014๋…„ 9์›” ์ •์‹ ๋ฐœํ‘œ๋œ ์ดํ›„ ํ˜„์žฌ๊นŒ์ง€ ๊ณ„์† ๋ฐœ์ „ํ•˜

bite-sized-learning.tistory.com

https://radait.tistory.com/4?category=836792 

 

๊ฐ์ฒด์ง€ํ–ฅ์–ธ์–ด๋ž€? [ํŠน์ง•, ์žฅ์ , ๋‹จ์ , ์ข…๋ฅ˜]

โ˜… ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด(ๅฎข้ซ”ๆŒ‡ๅ‘่จ€่ชž ) ์‚ฌ์ „์  ์˜๋ฏธ IT๊ด€๋ จ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด๋กœ์„œ, ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์กฐ์ž‘ํ•˜๋ฉฐ ๊ฐ์ฒด๋ผ๋ฆฌ ๊ด€๊ณ„๋ฅผ ๋งบ์Œ์œผ๋กœ์จ ๋‹ค์ˆ˜์˜ ๊ฐ์ฒด๊ฐ€ ํ•จ๊ป˜ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๊ฒŒ

radait.tistory.com

https://babbab2.tistory.com/129

 

Swift) ์˜ค๋ฒ„๋กœ๋”ฉ(Overloading) vs ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding)

์•ˆ๋…•ํ•˜์„ธ์š” :)))) ์†Œ๋“ค์ž…๋‹ˆ๋‹ค ์˜ค๋Š˜์€ ์Œ... ๊ฐ€๋ณ๊ฒŒ?? ๊ฐ€๋” ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‰ฌ์šด ์šฉ์–ด์ธ ์˜ค๋ฒ„๋กœ๋”ฉ(Overloading) ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding) ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ณ  ๊ฐ€๋ ค๊ณ  ํ•ด์š”!!! ์šฉ์–ด๊ฐ€ ๋น„์Šทํ•˜๋‹ค๊ณ  ํ•ด์„œ ๊ฐœ๋…๋„ ๋น„์Šท

babbab2.tistory.com

https://sjh836.tistory.com/159

 

๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ 5์›์น™ SOLID (SRP, OCP, LSP, ISP, DIP)

์ฐธ์กฐ๋ฌธ์„œ http://www.nextree.co.kr/p6960/ http://slenderankle.tistory.com/162 1. SOLID๋ž€? ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„๋Š” ๊ธด ์„ธ์›”๊ณผ ์ˆ˜๋งŽ์€ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ฑฐ์น˜๋ฉฐ 5๊ฐ€์ง€ ์›์น™์ด ์ •๋ฆฌ๋˜์—ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ 5์›์น™์ด๋ผ..

sjh836.tistory.com

https://becomereal.tistory.com/121

 

๋ฆฌํŒฉํ† ๋ง - ๊ธฐ์ดˆ ๋‹จ๊ณ„, ๋‹จ๊ณ„์™€ ๋ถ„๋ฆฌ, ๋‹คํ˜•์„ฑ

๊ธฐ์ดˆ๋‹จ๊ณ„ ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์—์„œ ๋ฆฌํŒฉํ† ๋ง์€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค. ํ”„๋กœ๊ทธ๋žจ์€ ์ฃผ์–ด์ง„ ์ƒํ™ฉ๊ณผ ์ •๋ณด๋ฅผ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ž๋™ํ™”ํ•œ๋‹ค. ์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ ํ•˜๋“  ๊ทธ๋ ‡์ง€ ์•Š๋“  ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐœ์ด์น˜ ์•Š์ง€๋งŒ ์‚ฌ๋žŒ์€ ์ฝ”๋“œ

becomereal.tistory.com

https://jisoo.net/2018/11/24/why-mvc-destroyed.html

 

iOS์—์„œ MVC๋Š” ์™œ ๋ง๊ฐ€์งˆ๊นŒ

ํ•œ๋•Œ ๋Œ€ํ‘œ์ ์ธ ์•„ํ‚คํ…์ณ๋กœ ์นญ์†ก๋ฐ›๋˜ MVCํŒจํ„ด์ด ์ง€๊ธˆ์€ Massive ViewController๋กœ ์กฐ๋กฑ๋ฐ›๊ณ , ๊ธˆ๊ธฐ์‹œ ๋˜๋Š” ํŒจํ„ด์œผ๋กœ ์—ฌ๊ฒจ์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ Massive ํ•ด์ง€๋Š”์ง€ ์ดํ•ด๊ฐ€ ์—†๋Š” ์ƒํƒœ์—์„œ MVP, MVVM, RIBs๋“ฑ ์œ ํ–‰ํ•˜๊ณ 

jisoo.net

https://sourcemaking.com/refactoring/replace-conditional-with-polymorphism

 

Design Patterns and Refactoring

Design Patterns and Refactoring articles and guides. Design Patterns video tutorials for newbies. Simple descriptions and full source code examples in Java, C++, C#, PHP and Delphi.

sourcemaking.com

https://soojin.ro/blog/solid-principles-in-swift

 

์Šค์œ„ํ”„ํŠธ๋กœ ๋‹ค์‹œ๋ณด๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ํ”ผํ•ด์•ผํ•  ์ฝ”๋”ฉ ์Šต๊ด€ · Soojin Ro

๋ฐฐ๊ฒฝ ์ปดํ“จํ„ฐ์™€ ํšŒํ™”(painting)๋ฅผ ์ „๊ณตํ–ˆ๊ณ  ๊ฝค ์„ฑ๊ณตํ•œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๊ณผํ•™์ž๋ณด๋‹ค ํ™”๊ฐ€์™€ ๊ณตํ†ต์ ์ด ๋” ๋งŽ๋‹ค๊ณ  ํ–ˆ๋‹ค. ์ •๋ง๋กœ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ž˜ํ•˜๋ ค๋Š” ๋…ธ๋ ฅ์„ ํ•˜๋‹ค๋ณด๋ฉด ๊ณผํ•™๋ณด๋‹ค๋Š” ๊ฒฝํ—˜์ ์œผ

soojin.ro

 

๋ฐ˜์‘ํ˜•