<div align="center"> <h1>๐Ÿงƒ JuiceMaker</h1> </div> ## ๐Ÿ‘€ Preview ![](https://i.imgur.com/TRcCYML.gif) ## ๐Ÿ”‘ Key Experience * ํƒ€์ž…์˜ ์บก์Аํ™”/์€๋‹‰ํ™” * ๋งค์„œ๋“œ์˜ ๊ธฐ๋Šฅ๋‹จ์œ„ ๋ถ„๋ฆฌ * Alert Controller ํ™œ์šฉ * Stepper ํ™œ์šฉ * Modality ํ™œ์šฉ * ํ™”๋ฉด ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ๊ณต์œ  * Auto Layout ## โœ๏ธ ์„ค๋ช… | name | type | ์—ญํ• ๊ณผ ์ฑ…์ž„ | |:------------------------- | ----------- |:----------------------------------- | | JuiceMaker | struct | ๊ณผ์ผ์˜ ์žฌ๊ณ ๋ฅผ ๊ฐ€์ง€๊ณ  ์ฅฌ์Šค ์ œ์กฐ | | Juice | enum | ์ฅฌ์Šค ์ข…๋ฅ˜, ์ข…๋ฅ˜์— ๋”ฐ๋ฅธ ๋ ˆ์‹œํ”ผ | | FruitStore | final class | ๊ณผ์ผ์˜ ์žฌ๊ณ  ๊ด€๋ฆฌ | | JuiceMakerError | enum: Error | ์žฌ๊ณ  ๊ด€๋ จ Error | | JuiceMakerViewController | final class | ์ฃผ๋ฌธ ๋ฒ„ํŠผ์œผ๋กœ ์ฃผ๋ฌธ์„ ๋ฐ›์•„ ์ฃผ์Šค ์ œ์กฐ, ์žฌ๊ณ  ์ˆ˜์ • | | UpdateStockViewController | final class | ๊ณผ์ผ์˜ ์žฌ๊ณ ๋ฅผ ์ˆ˜์ • | ## ๐Ÿค” STEP 1์˜ ๊ณ ๋ฏผ 1. FruitStore๋ฅผ `final class` VS `struct`? - ์žฌ๊ณ ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์†์„ฑ์˜ ํŠน์„ฑ์ƒ ์ถ”ํ›„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ JuiceMaker๊ฐ€ ์ƒ๊ธด๋‹ค๋ฉด ์žฌ๊ณ  ๊ด€๋ฆฌ๋ฅผ ํ•จ๊ป˜ ํ•  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„ Singleton ๊ตฌํ˜„๋„ ๊ณ ๋ คํ•˜์˜€์Šต๋‹ˆ๋‹ค. - final class์™€ struct๋ฅผ ๊ณ„์† ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ๊ฒฐ๊ตญ ๊ฒฐ๋ก ์„ ๋‚ด๋ฆฌ์ง€ ๋ชปํ–ˆ๋Š”๋ฐ์š”, ์–ด๋–ค ๊ฑธ๋กœ ๊ตฌํ˜„ํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ๋˜์ง„ ์•Š์„ ๊ฒƒ ๊ฐ™์•„์„œ์š”. ํ˜น์‹œ ์ด ์ค‘์— ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์„ ํƒ์ง€๊ฐ€ ์žˆ๋Š”์ง€, ํ˜น์€ ๋” ๋‚˜์€ ์„ ํƒ์ง€๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค! ```swift ๐Ÿถ๐Ÿถ๐Ÿถ ๊ฒฐ๋ก ์ง€์œผ์‹  ๊ฒƒ ์ฒ˜๋Ÿผ ํ˜„์žฌ ์Šคํ… ๋‹จ๊ณ„์—์„œ๋Š” ๋‘๊ฐ€์ง€ ๋ชจ๋‘ ์‚ฌ์šฉํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค :) ์ผ๋‹จ ์œ ์ง€ํ•˜๊ณ , ๋‹ค์Œ ์Šคํ…์—์„œ ๋ณ€๊ฒฝํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค๋ฉด ๊ทธ ๋•Œ ๋ฐ”๊ฟ”๋„ ๋  ๊ฒƒ ๊ฐ™์•„์š”. ๋‚˜์ค‘์— ์‹ฑ๊ธ€ํ†ค์€ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ์žฅ๋‹จ์ ์„ ์ž˜ ๊ณ ๋ คํ•ด๋ณด์‹œ๊ณ  ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค. ``` 2. '๊ฐฏ์ˆ˜'๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜๋ช… ์ง“๊ธฐ - JuiceMaker์—์„œ requiredQuantity, FruitStore์—์„œ ๊ณผ์ผ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•  ๋•Œ quantity๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ๋” ์ข‹์€ ๋ณ€์ˆ˜๋ช… ์žˆ์„๊นŒ์š” ~? ```swift ๐Ÿถ๐Ÿถ๐Ÿถ quantity๋Š” ์–‘์„ ์˜๋ฏธํ•ด์„œ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ์—๋Š” ์• ๋งคํ•œ ๊ฒƒ ๊ฐ™๋„ค์š”. ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ช…์œผ๋กœ ๊ฐœ์„ ํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! ``` ## ๐Ÿค” STEP 2์˜ ๊ณ ๋ฏผ ### 1. IBOutlet Collection ๊ฐ ๊ณผ์ผ์˜ ์žฌ๊ณ ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Label 5๊ฐœ๋ฅผ ํ•˜๋‚˜์”ฉ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์—ฌ๋Ÿฌ Button์„ ํ•˜๋‚˜์˜ action์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜์—ˆ์–ด์š”! * IBOutlet Collection๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ฐฐ์—ด๋กœ ๋ฌถ์ธ ๋ ˆ์ด๋ธ”๋“ค์˜ ๊ฐ ์ธ๋ฑ์Šค์™€ `FruitStore`์˜ `enum Fruit` `raw value`๋ฅผ ์ผ์น˜์‹œ์ผœ ๊ฐ ๊ณผ์ผ์˜ ๋ ˆ์ด๋ธ”์— ๋ณ€๊ฒฝ๋œ ์žฌ๊ณ ๋ฅผ ํ‘œ์‹œํ•˜์˜€์Šต๋‹ˆ๋‹ค. * ๊ณ ๋ฏผ๋˜๋Š” ๊ฒƒ์€ ๋ ˆ์ด๋ธ”์˜ ์ธ๋ฑ์Šค๊ฐ€ ์–ด๋””์—๋„ ์ •ํ™•ํžˆ ํ‘œ์‹œ๋˜์ง€ ์•Š์•„ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ ์ €ํฌ๋งŒ ์ˆœ์„œ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ถ”ํ›„ ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์šธ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์šฐ๋ ค๊ฐ€ ๋˜์—ˆ์–ด์š”. * Label์— enum Fruit์˜ raw value์™€ ๊ฐ™์€ ๊ฐ’์œผ๋กœ tag๋ฅผ ์ฃผ๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ๊ณ ๋ คํ•ด๋ณด์•˜๋Š”๋ฐ, ์ง€๊ธˆ ์ด ์ฝ”๋“œ๋กœ๋„ ๊ดœ์ฐฎ์€์ง€, tag๋ฅผ ์ฃผ๋Š” ๊ฒƒ์ด ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜ ์žˆ์„์ง€, ๋˜ ๋‹ค๋ฅธ ์˜๊ฒฌ์ด ์žˆ์œผ์‹ ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค! ```swift ๐Ÿถ๐Ÿถ๐Ÿถ ๋ง์”€ํ•ด์ฃผ์‹  ๊ฒƒ ์ฒ˜๋Ÿผ ์œ ์ง€/๋ณด์ˆ˜์— ์ทจ์•ฝํ•ด์ง‘๋‹ˆ๋‹ค. tag๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ƒ enum์˜ Int rawValue๊ฐ’์„ UIView์—๊ฒŒ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ ๋ฟ์ด๋ผ ๋˜‘๊ฐ™์€ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•ด์š”.๐Ÿฅฒ IBOutlet Collection์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ณผ์ผ ๋ฐ์ดํ„ฐ collection์„ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ์ž๋ฃŒ์˜ index๋ฅผ ์ด์šฉํ•˜๋Š”๊ฒŒ ํ˜„์žฌ ๋ฏธ์…˜์—์„œ๋Š” ์ ํ•ฉํ•œ ๊ฒƒ ๊ฐ™์•„์š”. ํ˜„์žฌ ๋ฏธ์…˜์—์„œ๋Š” ์Šคํ† ๋ฆฌ๋ณด๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๊ณ  ์ฃผ๋ฌธ ๋ฒ„ํŠผ์ด ๋”ฑ ๋งž๊ฒŒ ๋–จ์–ด์ ธ ์žˆ์–ด์„œ, IBOutlet Collection์„ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฑฐ๋‹ˆ ๋„ˆ๋ฌด ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค! ``` ### 2. Modally vs Show ํ™”๋ฉด ์ด๋™ ๋ฐฉ์‹์— ๋Œ€ํ•ด ๊ณ ๋ฏผ์„ ํ–ˆ๋Š”๋ฐ์š”, ์ฒ˜์Œ์—” ์žฌ๊ณ ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ๋งŒ ์ž ์‹œ ๋ณด์ด๋Š” ํ™”๋ฉด์œผ๋กœ ์ƒ๊ฐํ•˜์—ฌ Modally ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ ค๋‹ค๊ฐ€ * ์ด ํ”„๋กœ์ ํŠธ์˜ ์Šคํ† ๋ฆฌ๋ณด๋“œ๋Š” ๊ฐ€๋กœ๋กœ ๊ณ ์ •์ด ๋˜์–ด ์žˆ๊ณ , ๊ฐ€๋กœ ํ™”๋ฉด์—์„œ์˜ Modally ๋ฐฉ์‹์€ ์›๋ž˜ ํ™”๋ฉด์œผ๋กœ ๋Œ์•„๊ฐ€๋„๋ก ํ„ฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋นˆ ๊ณต๊ฐ„์ด ์ œ๊ณต๋˜์ง€ ์•Š์•„์„œ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ backButton์ด ์ œ๊ณต๋˜๋Š” Show ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. STPE 3์—์„œ '๋‹ซ๊ธฐ' ๋ฒ„ํŠผ์„ ๊ตฌํ˜„์„ ํ•ด์•ผ ํ•ด์„œ ๋‹ค์‹œ Modally ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ์„ ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋Š”๋ฐ * ์ €ํฌ๋Š” ๊ฐ€๋กœ ํ™”๋ฉด ๊ณ ์ •๊ณผ ๋ฒ„ํŠผ ์ƒ์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐฉ์‹์„ ๋‚˜๋ˆ  ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ์‹ค์ œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ๋ฐฉ์‹์„ ์„ ํƒํ•˜๋Š” ๊ฒŒ ์ข‹์„์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค! ```swift ๐Ÿถ๐Ÿถ๐Ÿถ ์•„๋ฌด๋ž˜๋„ ๋‹ซ๊ธฐ ๋ฒ„ํŠผ์ด ์žˆ์–ด์„œ UX๋ฅผ ๊ณ ๋ คํ–ˆ์„ ๋•Œ์—๋Š” Modally๊ฐ€ ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋А๊ปด์ง€๋Š” ๊ฒƒ ๊ฐ™์•„์š”. ํ•˜์ง€๋งŒ ํฌ๊ฒŒ ์ƒ๊ด€์—†์œผ๋‹ˆ ๋‘๊ฐœ ๋‹ค ํ•ด๋ด์„œ ์ฐจ์ด์ ์„ ์•Œ์•„๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋„ค์š” ๐Ÿ˜Š ``` ### 3. ๊ณ ์ฐจํ•จ์ˆ˜ FruitStore์—์„œ ๊ณผ์ผ์˜ ์žฌ๊ณ ๋ฅผ [Fruit: UInt] ํ˜•ํƒœ์˜ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๊ด€๋ฆฌํ–ˆ์—ˆ๋Š”๋ฐ์š”, ์ฒ˜์Œ์—๋Š” guard๋ฌธ์„ ํ™œ์šฉํ•˜์—ฌ Optional binding์— ์‹คํŒจํ–ˆ์„ ๋•Œ throw notExistFruit๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๋ฐœ์ƒํ•  ์ผ์ด ์—†๋Š” ์—๋Ÿฌ๋ผ์„œ ์กฐ๊ธˆ ๋ถˆํ•„์š”ํ•˜๋‹ค๊ณ  ๋А๊ปด์„œ ๊ณ ์ฐจํ•จ์ˆ˜์ธ filter๋กœ ๋ณ€๊ฒฝํ–ˆ์–ด์š”. #### filter * ์žฅ์ : ๋ถˆํ•„์š”ํ•œ Error๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ๋จ * ๋‹จ์ : ์‹œ๊ฐ„๋ณต์žก๋„ O(๊ณผ์ผ์˜ ๊ฐœ์ˆ˜) #### guard๋ฌธ * ์žฅ์ : ์‹œ๊ฐ„๋ณต์žก๋„ O(1) * ๋‹จ์ : Optional ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•œ Error๋ฅผ ๋งŒ๋“ค์–ด ๋˜์ ธ์ค˜์•ผํ•จ ๊ณผ์ผ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์ง€ ์•Š์€ ์ . ๋ถˆํ•„์š”ํ•œ Error๋ฅผ ์œ„ํ•ด ์ฒ˜๋ฆฌํ•ด์ฃผ์ง€ ์•Š๊ณ , ์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ ๋” ๊น”๋”ํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ . ๋•Œ๋ฌธ์— filter๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ์š”. guard๋ฌธ์ด ๋” ์ข‹์„์ง€. ์•„๋‹ˆ๋ฉด ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€. ์ฝ”๋ฆฌ์˜ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค ๐Ÿถ ```swift ๐Ÿถ๐Ÿถ๐Ÿถ ๋ง์”€ํ•˜์‹  ๋Œ€๋กœ ํ˜„์žฌ ๊ตฌ์กฐ์—์„œ๋Š” guard๊ฐ€ ๋ถˆํ•„์š”ํ•ด๋ณด์ด๋„ค์š”! ํ˜„์žฌ ๋ฏธ์…˜ ์กฐ๊ฑด์„ ๊ณ ๋ คํ•˜๋ฉด filter ์‚ฌ์šฉ์€ ์ข‹์Šต๋‹ˆ๋‹ค! ๋‹ค๋งŒ ๊ฐ€๋…์„ฑ์ด ์กฐ๊ธˆ ๋–จ์–ด์ ธ์„œ $0.key ๋‚˜ $0.value๊ฐ€ ๋ฌด์—‡์„ ๋œปํ•˜๋Š”์ง€ ์ •๋ฆฌํ•ด์ฃผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋„ค์š” :) ``` ## ๐Ÿค” STEP 3์˜ ๊ณ ๋ฏผ ### 1. `IBOutlet` vs `IBOutlet Collection` STEP2์—์„œ๋Š” ์ฅฌ์Šค์ œ์กฐ ํ™”๋ฉด์—์„œ ๊ณผ์ผ ์žฌ๊ณ ์— ๋Œ€ํ•ด IBOutlet์˜ ๋ฐฐ์—ด์ธ IBOutlet Collection์„ ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ์š”, * ์‹ค์ œ ๊ณผ์ผ ์žฌ๊ณ ์™€ ์žฌ๊ณ  ๋ ˆ์ด๋ธ”๊ณผ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ ํž˜๋“  ์  * ์ถ”ํ›„ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์ƒ๊ฐํ–ˆ์„ ๋–„, tag๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ์  ์„ ์ด์œ ๋กœ JuiceMakerViewController, UpdateJuiceViewController์—์„œ ๊ฐ ์žฌ๊ณ  ๊ด€๋ จ ๋ ˆ์ด๋ธ”๋“ค์„ IBOutlet ์—ฌ๋Ÿฌ๊ฐœ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ๊ตฌํ˜„ํ–ˆ๊ณ  ๊ธฐ์กด์— IBOutlet Collection๋„ IBOutlet์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. `*์ฅฌ์Šค ์ฃผ๋ฌธ` ๋ฒ„ํŠผ์€ ์Šคํ† ๋ฆฌ๋ณด๋“œ์— ์ ํ˜€์žˆ๋Š” ๋ฒ„ํŠผ text์— ์˜์กด์ ์ด๋ผ๋Š” ๋‹จ์ ์ด ์žˆ์ง€๋งŒ ์ผ๋‹จ์€ IBOutlet Collection์—์„œ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์Šคํ† ๋ฆฌ๋ณด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ฐ€์žฅ ํž˜๋“ค์—ˆ๋˜ ๋ถ€๋ถ„์ด ์ฝ”๋“œ๊ฐ€ ์Šคํ† ๋ฆฌ๋ณด๋“œ์— ์˜์กด์ ์ด ๋œ๋‹ค๋Š” ๋ถ€๋ถ„์ด์—ˆ๋Š”๋ฐ์š”, ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋– ํ•œ ๋ฐฉ๋ฒ•๋“ค์ด ์žˆ๋Š”์ง€ ๊ฐ€์ด๋“œ๋ผ์ธ์ด๋ผ๋„ ์ฃผ์‹ค ์ˆ˜ ์žˆ์œผ์‹ค๊นŒ์š”? ```swift ๐Ÿถ๐Ÿถ๐Ÿถ ์ด๋ฒˆ์— UpdateJuiceVC์—์„œ IBOutlet์œผ๋กœ ๋‹ค ๋ถ„๋ฆฌํ•˜์‹  ๋ถ€๋ถ„ ์ž˜ ๊ตฌํ˜„ํ•˜์…จ์Šต๋‹ˆ๋‹ค! ๐Ÿ‘ ์ฅฌ์Šค ์ฃผ๋ฌธ ๋ฒ„ํŠผ๊ฐ™์€ ๊ฒฝ์šฐ์—๋„ ํ˜„์žฌ๋Š” ์Šคํ† ๋ฆฌ๋ณด๋“œ ์˜์กด๋„๊ฐ€ ๋†’๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋‘ ๋ถ„๋ฆฌํ•˜๋Š”๊ฒŒ ์ €๋Š” ์ข‹์•„๋ณด์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ทฐ๋‹จ์„ ์ฝ”๋“œ๋กœ ๋งŒ๋“ค์–ด์„œ ์ฒ˜๋ฆฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘ ์ฝ”๋“œ๋กœ ์ž‘์„ฑ ์ฝ”๋“œ + XIB ์Šคํ† ๋ฆฌ๋ณด๋“œ + ์ฝ”๋“œ ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์˜์กด๋„๋ฅผ ๋‚ฎ์ถฐ์„œ ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ๋กœ ์—ฌ๋Ÿฌ ๋ฒ„ํŠผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•  ์ˆ˜๋Š” ์žˆ์–ด๋ณด์ž…๋‹ˆ๋‹ค! ``` ### 2. ์žฌ๊ณ  ์ถ”๊ฐ€ ํ™”๋ฉด์—์„œ ๋‹ซ๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ, ์ดˆ๊ธฐ ํ™”๋ฉด์— ๋ณ€๊ฒฝ๋œ ์žฌ๊ณ ๊ฐ€ ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ์  * ์žฌ๊ณ  ์ถ”๊ฐ€ ํ™”๋ฉด์—์„œ ๋‹ซ๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด `fruitStore`์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์žฌ๊ณ ๊ฐ€ ์ดˆ๊ธฐ ํ™”๋ฉด์— ๋ฐ˜์˜์ด ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ•˜์—ฌ ์•„๋ž˜ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ํ•ด๊ฒฐ์„ ํ•˜๊ธด ํ–ˆ๋Š”๋ฐ, ํ˜น์‹œ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์„๊นŒ์š”? ```swift override func viewWillAppear(_ animated: Bool) ``` ```swift updateStockViewController.modalPresentationStyle = .fullScreen ``` ```swift ๐Ÿถ๐Ÿถ๐Ÿถ ์ง€๊ธˆ viewWillAppear์—์„œ ๊ตฌํ˜„ํ•œ ๋ถ€๋ถ„๋„ ๊น”๋”ํ•˜๊ฒŒ ์ž˜ ๊ตฌํ˜„ํ•˜์…จ์Šต๋‹ˆ๋‹ค! protocol๋กœ ์‹ ํ˜ธ๋‚˜ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค :) ``` ## โญ๏ธ ๋ฐฐ์šฐ๊ณ  ๋А๋‚€ ์  ### โœจ iyeah [๋ชฉํ‘œ] - [x] GIt๊ณผ ์นœํ•ด์ง€๊ธฐ -> Xcode์—์„œ Git์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ๋‹ค - [x] Access Control, Nested Types, Type casting, Error Handling ์ฒ˜์Œ ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ -> ์‚ฌ์šฉ์€ ํ–ˆ์ง€๋งŒ ๋” ๋งŽ์€ ๊ณต๋ถ€๊ฐ€ ํ•„์š”ํ•˜๋‹ค - [ ] ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํ˜ผ์ž์„œ๋„ ๊ณ ๋ฏผํ•ด ๋ณด๊ธฐ - [x] June์—๊ฒŒ ๋งŽ์ด ๋ฐฐ์šฐ๊ณ  ๋„์›€์ด ๋˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ธฐ -> ๋งŽ์ด ๋ฐฐ์šด ๊ฑด ํ™•์‹คํ•œ๋ฐ ๋„์›€์€ ๋˜์ง€ ๋ชปํ–ˆ๋˜ ๊ฒƒ ๊ฐ™โ€ฆ ๐Ÿฅน [๋ฐฐ์šด ๊ฒƒ] * ๋งค์„œ๋“œ์˜ ๊ธฐ๋Šฅ๋‹จ์œ„ ๋ถ„๋ฆฌ * ์—๋Ÿฌ ์ฒ˜๋ฆฌ * self ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ ์ผ€์ด์Šค * Modality * Alert Controller [๋” ๊ณต๋ถ€ํ•ด์•ผ ํ•  ๊ฒƒ] * Unit Test * Naming * Access Control * ViewController Life Cycle [๋А๋‚€ ์ ] * ์ผ๋‹จ ์•„์ฃผ ๋ฉ‹์ง„ ํŒ€์› `june`์„ ๋งŒ๋‚ฌ๋‹ค. ์ž˜ ํ’€์–ด ํ‘œํ˜„ํ•ด๋‚ด์ง€ ๋ชปํ•œ ๋‚˜์˜ ์ƒ๊ฐ๊ณผ ์˜๊ฒฌ์„ ๊ฒฝ์ฒญํ•ด์ฃผ๊ณ  ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์—์„œ ๋งŽ์€ ๊ฐ€๋ฅด์นจ์„ ๋ฐ›์•˜๋‹ค. ์ฝ”๋“œ ์ปจ๋ฒค์…˜, ์—๋Ÿฌ ์ฒ˜๋ฆฌ, ์œ ๋‹› ํ…Œ์ŠคํŠธ, git ์‚ฌ์šฉ๋ฒ•, ์—„์ฒญ๋‚œ ์–‘์˜ ๋‹จ์ถ•ํ‚ค๊นŒ์ง€! ๋‚ด๊ฐ€ ๋” ์ •์‹  ๋ฐ”์ง ์ฐจ๋ฆฌ๊ณ  ํก์ˆ˜ํ–ˆ๋‹ค๋ฉด ์ข‹์•˜์„ ๊ฑธ ํ•˜๋Š” ์•„์‰ฌ์›€๋„ ๋‚จ๋Š”๋‹ค....โ€จ * ๋” ๊ณต๋ถ€ํ•˜๊ณ  ๋” ๋‹ฌ๋ ค๋“ค์—ˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค. ๋š๋”ฑ ๋š๋”ฑ ์ž˜ํ•˜๋Š” ํŒ€์›์—๊ฒŒ ์˜์ง€ํ•˜์—ฌ ์™„์„ฑํ•˜์ง„ ์•Š์•˜๋Š”๊ฐ€ ํ•˜๋Š” ์ฃ„์ฑ…๊ฐ์„ ๋–จ์น˜๊ธฐ ์–ด๋ ต๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์„ธ์…˜๋“ค์€ ํ”„๋กœ์ ํŠธ ์ง„๋„์— ๋งž์ถฐ ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ์„ธ์…˜์—์„œ ๋ฐฐ์šด ๊ฒƒ์„ ์ ์šฉํ•˜๋ฉฐ ๋‚˜์•„๊ฐ€์•ผ ํ•œ๋‹ค. ์ด๋ฏธ ๋†“์ณ๋ฒ„๋ฆฐ ๋ถ€๋ถ„๋“ค์€ ๊ผญ ์‹œ๊ฐ„๋‚ด์„œ ๋ณต์Šตํ•˜๋„๋ก ํ•˜๊ณ , ์•ž์œผ๋กœ๋Š” ์ง„๋„์— ์ž˜ ๋งž์ถฐ ์˜ˆ์Šต๊ณผ ์ ์šฉ์„ ํ•ด์•ผ๊ฒ ๋‹ค. ### ๐Ÿ’ก june * Swift์—์„œ ์ถ”๊ตฌํ•˜๋Š” ๋ช…๋ฃŒ์„ฑ๊ณผ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•œ ๊ฐ„๊ฒฐ์„ฑ์„ ๋™์‹œ์— ๋งŒ์กฑ์‹œํ‚ค๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ์–ด๋ ค์šด ์ผ์ด๊ณ  Swift ๊ทธ๋งŒ๋‘๋Š” ๋‚ ๊นŒ์ง€ ๊ฐ€์žฅ ํฐ ์ˆ™์ œ๊ฐ€ ๋˜์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค. * IBAction, property, method ๊ฐ๊ฐ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์ด ์žˆ์œผ๋ฉฐ ๋”ฐ๋กœ ์‹œ๊ฐ„์„ ๋‚ด์–ด ์ด์— ๋Œ€ํ•œ ์ •๋ฆฌ๋ฅผ ํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ๋А๊ผˆ๋‹ค. (๋ง‰์ƒ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์„ ๋•Œ๋Š” ๊ตฌํ˜„ํ•˜๊ธฐ ๋ฐ”์ ํ…Œ๋‹ˆ ๐Ÿฅฒ) * ์Šคํ† ๋ฆฌ๋ณด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜‘์—… ๋ฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํž˜๋“ค์–ด์ง„๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ง‰์—ฐํ•˜๊ฒŒ ์•Œ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ทธ ์ด์œ ๋ฅผ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ์ฒด๊ฐํ•ด๋ณธ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค. ์ฝ”๋“œ๊ฐ€ ์Šคํ† ๋ฆฌ๋ณด๋“œ์— ์˜์กด์ ์ด ๋œ๋‹ค๋˜๊ฐ€... ๋ฐฐ์—ด(IBOutlet Collection)๋กœ ์„ ์–ธํ•ด๋„ ์ธ๋ฑ์Šค ์ˆœ์„œ๋ฅผ ์ •ํ•˜๊ธฐ ํž˜๋“ค๋‹ค๋˜๊ฐ€... ์ฝ”๋“œ๋Š” ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜๋„๋ฅผ ๋“œ๋Ÿฌ๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์Šคํ† ๋ฆฌ๋ณด๋“œ๋Š” ๊ทธ๋Ÿด ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ๋‹จ์ ์ด์ง€ ์•Š์„๊นŒํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.