๐Ÿš€ ์Šค์œ„ํ”„ํŠธ vs ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C: iOS ์•ฑ์˜ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ๋Œ€๊ฒฐ! ๐Ÿ

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ ์Šค์œ„ํ”„ํŠธ vs ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C: iOS ์•ฑ์˜ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ๋Œ€๊ฒฐ! ๐Ÿ

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ iOS ์•ฑ ๊ฐœ๋ฐœ์˜ ๋‘ ๊ฑฐ์ธ, ์Šค์œ„ํ”„ํŠธ์™€ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C์˜ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์— ๋Œ€ํ•ด ๊นŠ์ด ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ์˜ˆ์š”. ์ด ๋‘ ์–ธ์–ด์˜ ์„ฑ๋Šฅ ์ฐจ์ด๋ฅผ ์•Œ๋ฉด ์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ ๊ฐœ๋ฐœ ์‹ค๋ ฅ์ด ํ•œ ๋‹จ๊ณ„ ์—…๊ทธ๋ ˆ์ด๋“œ๋  ๊ฑฐ์˜ˆ์š”! ๐Ÿ˜Ž

๊ทธ๋Ÿผ ์ด์ œ๋ถ€ํ„ฐ ์Šค์œ„ํ”„ํŠธ์™€ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C์˜ ์„ธ๊ณ„๋กœ ๋น ์ ธ๋ณผ๊นŒ์š”? ์ค€๋น„๋˜์…จ๋‚˜์š”? 3, 2, 1... ์ถœ๋ฐœ! ๐ŸŽ๏ธ๐Ÿ’จ

๐Ÿง  ์Šค์œ„ํ”„ํŠธ์™€ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C: ๊ธฐ๋ณธ ๊ฐœ๋… ์ดํ•ดํ•˜๊ธฐ

๋จผ์ €, ์šฐ๋ฆฌ์˜ ์ฃผ์ธ๊ณต๋“ค์„ ๊ฐ„๋‹จํžˆ ์†Œ๊ฐœํ•ด๋ณผ๊ฒŒ์š”!

์Šค์œ„ํ”„ํŠธ (Swift) ๐Ÿฆ…

์• ํ”Œ์ด 2014๋…„์— ์„ ๋ณด์ธ ํ˜„๋Œ€์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ˆ์š”. ์•ˆ์ „์„ฑ, ์†๋„, ํ‘œํ˜„๋ ฅ์„ ๋ชจํ† ๋กœ ์‚ผ๊ณ  ์žˆ์ฃ .

์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C (Objective-C) ๐Ÿข

1980๋…„๋Œ€์— ํƒ„์ƒํ•œ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ, iOS์™€ macOS ๊ฐœ๋ฐœ์˜ ๊ธฐ๋ฐ˜์ด ๋˜์—ˆ์–ด์š”.

๋‘ ์–ธ์–ด ๋ชจ๋‘ iOS ์•ฑ ๊ฐœ๋ฐœ์— ์‚ฌ์šฉ๋˜์ง€๋งŒ, ๊ฐ์ž์˜ ํŠน์ง•๊ณผ ์žฅ๋‹จ์ ์ด ์žˆ์–ด์š”. ํŠนํžˆ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ๋ฉด์—์„œ๋Š” ๊ฝค๋‚˜ ํฅ๋ฏธ๋กœ์šด ์ฐจ์ด๋ฅผ ๋ณด์ด์ฃ . ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ํŒŒํ—ค์ณ๋ณผ๊นŒ์š”? ๐Ÿ•ต๏ธโ€โ™€๏ธ

์Šค์œ„ํ”„ํŠธ์™€ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C ๋น„๊ต Swift Objective-C VS

์ด ๊ทธ๋ž˜ํ”ฝ์„ ๋ณด๋ฉด ์Šค์œ„ํ”„ํŠธ์™€ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C๊ฐ€ ๋งˆ์น˜ ๊ถŒํˆฌ ๋ง ์œ„์— ์„  ๋‘ ์„ ์ˆ˜ ๊ฐ™์ฃ ? ใ…‹ใ…‹ใ…‹ ์ด์ œ๋ถ€ํ„ฐ ์ด ๋‘ ์„ ์ˆ˜์˜ ์„ฑ๋Šฅ ๋Œ€๊ฒฐ์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณผ ๊ฑฐ์˜ˆ์š”!

๐Ÿƒโ€โ™‚๏ธ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ: ์†๋„์˜ ๋Œ€๊ฒฐ

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์Šค์œ„ํ”„ํŠธ์™€ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C์˜ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”. ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์ด๋ผ๊ณ  ํ•˜๋ฉด ๋ญ”๊ฐ€ ์–ด๋ ค์›Œ ๋ณด์ด์ฃ ? ์‰ฝ๊ฒŒ ๋งํ•ด์„œ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ ์–ผ๋งˆ๋‚˜ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€๋ฅผ ๋งํ•ด์š”. ๋งˆ์น˜ F1 ๊ฒฝ์ฃผ์ฒ˜๋Ÿผ ๋ˆ„๊ฐ€ ๋” ๋นจ๋ฆฌ ๋ชฉ์ ์ง€์— ๋„์ฐฉํ•˜๋Š๋ƒ์˜ ๊ฒŒ์ž„์ด์ฃ ! ๐ŸŽ๏ธ๐Ÿ’จ

1. ์ปดํŒŒ์ผ ์‹œ๊ฐ„ โฑ๏ธ

๋จผ์ € ์ปดํŒŒ์ผ ์‹œ๊ฐ„๋ถ€ํ„ฐ ์‚ดํŽด๋ณผ๊ฒŒ์š”. ์ปดํŒŒ์ผ์ด๋ž€ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋กœ ๋ฒˆ์—ญํ•˜๋Š” ๊ณผ์ •์ด์—์š”.

์Šค์œ„ํ”„ํŠธ

์Šค์œ„ํ”„ํŠธ๋Š” ์ฒ˜์Œ ๋“ฑ์žฅํ–ˆ์„ ๋•Œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C๋ณด๋‹ค ๊ธธ๋‹ค๋Š” ํ‰๊ฐ€๋ฅผ ๋ฐ›์•˜์–ด์š”. ํ•˜์ง€๋งŒ ์• ํ”Œ์ด ์—ด์‹ฌํžˆ ๊ฐœ์„ ํ•œ ๋•๋ถ„์— ์ตœ๊ทผ ๋ฒ„์ „์—์„œ๋Š” ๋งŽ์ด ๋นจ๋ผ์กŒ๋‹ต๋‹ˆ๋‹ค!

์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C

์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C๋Š” ์˜ค๋žœ ์‹œ๊ฐ„ ์ตœ์ ํ™”๋ฅผ ๊ฑฐ์ณ์™”๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋น ๋ฅธ ํŽธ์ด์—์š”. ํŠนํžˆ ์ฆ๋ถ„ ๋นŒ๋“œ(์ผ๋ถ€๋งŒ ์ˆ˜์ •ํ–ˆ์„ ๋•Œ ์ „์ฒด๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹)์—์„œ ๊ฐ•์ ์„ ๋ณด์—ฌ์š”.

๊ฒฐ๋ก : ์ปดํŒŒ์ผ ์‹œ๊ฐ„๋งŒ ๋†“๊ณ  ๋ณด๋ฉด ์•„์ง์€ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C๊ฐ€ ์•ฝ๊ฐ„ ์•ž์„œ ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ ๊ทธ ์ฐจ์ด๋Š” ์ ์  ์ขํ˜€์ง€๊ณ  ์žˆ์ฃ !

2. ์‹คํ–‰ ์†๋„ ๐Ÿš€

์ด์ œ ์‹ค์ œ๋กœ ์•ฑ์ด ๊ตฌ๋™๋  ๋•Œ์˜ ์†๋„๋ฅผ ๋น„๊ตํ•ด๋ณผ๊ฒŒ์š”. ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๊ฐ€ ์ง„์งœ ์Šน๋ถ€์ฒ˜์˜ˆ์š”!

์Šค์œ„ํ”„ํŠธ

์Šค์œ„ํ”„ํŠธ๋Š” ํ˜„๋Œ€์ ์ธ ์–ธ์–ด๋‹ต๊ฒŒ ๋‹ค์–‘ํ•œ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ์ ์šฉํ–ˆ์–ด์š”. ํŠนํžˆ ARC(Automatic Reference Counting)๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ž๋™ํ™”ํ–ˆ์ฃ . ์ด ๋•๋ถ„์— ์‹คํ–‰ ์†๋„๊ฐ€ ๊ฝค ๋น ๋ฅธ ํŽธ์ด์—์š”.

์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C

์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C๋„ ARC๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ, ๋™์  ๋””์ŠคํŒจ์น˜(์‹คํ–‰ ์‹œ๊ฐ„์— ๋ฉ”์„œ๋“œ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹) ๋•Œ๋ฌธ์— ์ผ๋ถ€ ์ƒํ™ฉ์—์„œ๋Š” ์Šค์œ„ํ”„ํŠธ๋ณด๋‹ค ๋Š๋ฆด ์ˆ˜ ์žˆ์–ด์š”.

๊ฒฐ๋ก : ์‹คํ–‰ ์†๋„๋Š” ๋Œ€์ฒด๋กœ ์Šค์œ„ํ”„ํŠธ๊ฐ€ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C๋ณด๋‹ค ๋น ๋ฅธ ํŽธ์ด์—์š”. ํŠนํžˆ ๋ณต์žกํ•œ ์—ฐ์‚ฐ์ด๋‚˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๊ทธ ์ฐจ์ด๊ฐ€ ๋‘๋“œ๋Ÿฌ์ ธ์š”.

3. ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๐Ÿ’พ

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

์Šค์œ„ํ”„ํŠธ

์Šค์œ„ํ”„ํŠธ๋Š” ๊ฐ’ ํƒ€์ž…(Value Types)์„ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์š”. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ตœ์ ํ™”๋œ ์ปฌ๋ ‰์…˜ ํƒ€์ž…๋“ค๋„ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์„ ๋†’์—ฌ์ฃผ์ฃ .

์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C

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

๊ฒฐ๋ก : ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ธก๋ฉด์—์„œ๋Š” ์Šค์œ„ํ”„ํŠธ๊ฐ€ ์กฐ๊ธˆ ๋” ํšจ์œจ์ ์ด์—์š”. ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ ๊ทธ ์ฐจ์ด๊ฐ€ ๋” ํฌ๊ฒŒ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์ฃ .

์Šค์œ„ํ”„ํŠธ์™€ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C ์„ฑ๋Šฅ ๋น„๊ต ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์‹คํ–‰ ์†๋„ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์„ฑ๋Šฅ ํ•ญ๋ชฉ Swift Objective-C

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

์—ฌ๊ธฐ์„œ ์ž ๊น! ๐Ÿค” ํ˜น์‹œ ์—ฌ๋Ÿฌ๋ถ„, ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์ด๋ผ๋Š” ์‚ฌ์ดํŠธ ์•„์„ธ์š”? ๊ฐœ๋ฐœ์ž๋“ค์˜ ์žฌ๋Šฅ์„ ๊ณต์œ ํ•˜๊ณ  ๊ฑฐ๋ž˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋žซํผ์ธ๋ฐ, ์ด๋Ÿฐ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ์ˆ ์„ ๊ฐ€์ง„ ๊ฐœ๋ฐœ์ž๋“ค์˜ ์žฌ๋Šฅ์ด ํ™œ๋ฐœํ•˜๊ฒŒ ๊ฑฐ๋ž˜๋˜๊ณ  ์žˆ๋Œ€์š”. ๋‚˜์ค‘์— ํ•œ๋ฒˆ ๋“ค์–ด๊ฐ€ ๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”! ๐Ÿ˜‰

์ž, ์ด์ œ ์Šค์œ„ํ”„ํŠธ์™€ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C์˜ ๊ธฐ๋ณธ์ ์ธ ์„ฑ๋Šฅ ์ฐจ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด์š”. ํ•˜์ง€๋งŒ ์ด๊ฒŒ ์ „๋ถ€๊ฐ€ ์•„๋‹ˆ์—์š”! ์‹ค์ œ ์•ฑ ๊ฐœ๋ฐœ์—์„œ๋Š” ๋” ๋ณต์žกํ•œ ์š”์†Œ๋“ค์ด ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ฃ . ๋‹ค์Œ ์„น์…˜์—์„œ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๋„๋ก ํ•ด์š”! ๐Ÿš€

๐Ÿ” ์‹ฌ์ธต ๋ถ„์„: ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์š”์†Œ๋“ค

์ž, ์ด์ œ ์ข€ ๋” ๊นŠ์ด ๋“ค์–ด๊ฐ€๋ณผ๊นŒ์š”? ์Šค์œ„ํ”„ํŠธ์™€ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C์˜ ์„ฑ๋Šฅ ์ฐจ์ด๋ฅผ ๋งŒ๋“œ๋Š” ์š”์†Œ๋“ค์„ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ณ ๊ณ ! ๐Ÿš€

1. ํƒ€์ž… ์‹œ์Šคํ…œ (Type System) ๐Ÿงฉ

ํƒ€์ž… ์‹œ์Šคํ…œ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๊ทผ๊ฐ„์„ ์ด๋ฃจ๋Š” ์ค‘์š”ํ•œ ์š”์†Œ์˜ˆ์š”. ์Šค์œ„ํ”„ํŠธ์™€ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C๋Š” ์ด ๋ถ€๋ถ„์—์„œ ํฐ ์ฐจ์ด๋ฅผ ๋ณด์ž…๋‹ˆ๋‹ค.

์Šค์œ„ํ”„ํŠธ

์Šค์œ„ํ”„ํŠธ๋Š” ๊ฐ•๋ ฅํ•œ ์ •์  ํƒ€์ž… ์‹œ์Šคํ…œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์š”. ์ด๊ฒŒ ๋ฌด์Šจ ๋ง์ด๋ƒ๊ณ ์š”? ์‰ฝ๊ฒŒ ๋งํ•ด์„œ, ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ๋ฏธ๋ฆฌ ์ •ํ•ด๋‘๊ณ  ๊ทธ ํƒ€์ž…์— ๋งž๋Š” ๊ฐ’๋งŒ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ์˜ˆ์š”.

let name: String = "Swift"
let age: Int = 7
let isAwesome: Bool = true

์ด๋ ‡๊ฒŒ ํƒ€์ž…์„ ๋ช…ํ™•ํžˆ ์ง€์ •ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฏธ๋ฆฌ ๋งŽ์€ ์˜ค๋ฅ˜๋ฅผ ์žก์•„๋‚ผ ์ˆ˜ ์žˆ์–ด์š”. ๋•๋ถ„์— ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ์ค„์–ด๋“ค๊ณ , ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ผ์š”.

์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C

๋ฐ˜๋ฉด ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C๋Š” ๋™์  ํƒ€์ž… ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•ด์š”. ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ์‹คํ–‰ ์‹œ์ ์— ๊ฒฐ์ •ํ•˜๋Š” ๊ฑฐ์ฃ .

id name = @"Objective-C";
id age = @7;
id isAwesome = @YES;

์ด ๋ฐฉ์‹์€ ์œ ์—ฐํ•˜์ง€๋งŒ, ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ์˜ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง€๊ณ  ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ์ œํ•œ์ด ์žˆ์„ ์ˆ˜ ์žˆ์–ด์š”.

๊ฒฐ๋ก : ํƒ€์ž… ์‹œ์Šคํ…œ ์ธก๋ฉด์—์„œ๋Š” ์Šค์œ„ํ”„ํŠธ๊ฐ€ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ ๋ฉด์—์„œ ์šฐ์œ„๋ฅผ ์ ํ•˜๊ณ  ์žˆ์–ด์š”.

2. ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ (Memory Management) ๐Ÿง 

๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” ์•ฑ์˜ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ค‘์š”ํ•œ ์š”์†Œ์˜ˆ์š”. ๋‘ ์–ธ์–ด ๋ชจ๋‘ ARC๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์„ธ๋ถ€์ ์ธ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ต๋‹ˆ๋‹ค.

์Šค์œ„ํ”„ํŠธ

์Šค์œ„ํ”„ํŠธ์˜ ARC๋Š” ์ปดํŒŒ์ผ ์‹œ์ ์— ๋Œ€๋ถ€๋ถ„์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์š”. ์ด๋Š” ๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

class Person {
    var name: String
    
    init(name: String) {
        self.name = name
        print("\(name) is being initialized")
    }
    
    deinit {
        print("\(name) is being deinitialized")
    }
}

var reference1: Person?
var reference2: Person?
var reference3: Person?

reference1 = Person(name: "John Appleseed")
reference2 = reference1
reference3 = reference1

reference1 = nil
reference2 = nil
reference3 = nil  // ์—ฌ๊ธฐ์„œ Person ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ์—์„œ ๋งˆ์ง€๋ง‰ ์ค„์—์„œ Person ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ž๋™์œผ๋กœ ํ•ด์ œ๋˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋ฅผ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„ ๋˜์ฃ !

์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C

์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C์˜ ARC๋„ ๋น„์Šทํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ, ๋Ÿฐํƒ€์ž„์— ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์š”. ์ด๋Š” ์•ฝ๊ฐ„์˜ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์ฃ .

@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@end

@implementation Person

- (instancetype)initWithName:(NSString *)name {
    self = [super init];
    if (self) {
        _name = name;
        NSLog(@"%@ is being initialized", name);
    }
    return self;
}

- (void)dealloc {
    NSLog(@"%@ is being deinitialized", _name);
}

@end

Person *reference1 = nil;
Person *reference2 = nil;
Person *reference3 = nil;

reference1 = [[Person alloc] initWithName:@"John Appleseed"];
reference2 = reference1;
reference3 = reference1;

reference1 = nil;
reference2 = nil;
reference3 = nil;  // ์—ฌ๊ธฐ์„œ Person ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€๋งŒ, ๋Ÿฐํƒ€์ž„์— ๋” ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•ด์š”.

๊ฒฐ๋ก : ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ๋Š” ์Šค์œ„ํ”„ํŠธ๊ฐ€ ์กฐ๊ธˆ ๋” ํšจ์œจ์ ์ด์—์š”. ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ ๊ทธ ์ฐจ์ด๊ฐ€ ๋” ํฌ๊ฒŒ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์ฃ .

3. ์ตœ์ ํ™” ๊ธฐ๋ฒ• (Optimization Techniques) ๐Ÿ› ๏ธ

์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ตœ์ ํ™” ๊ธฐ๋ฒ•๋„ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์ณ์š”. ์Šค์œ„ํ”„ํŠธ์™€ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C๋Š” ์ด ๋ถ€๋ถ„์—์„œ๋„ ์ฐจ์ด๋ฅผ ๋ณด์ž…๋‹ˆ๋‹ค.

์Šค์œ„ํ”„ํŠธ

์Šค์œ„ํ”„ํŠธ๋Š” LLVM ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ์ ์šฉํ•ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด:

  • ํ•จ์ˆ˜ ์ธ๋ผ์ด๋‹ (Function Inlining)
  • ๋ฃจํ”„ ์–ธ๋กค๋ง (Loop Unrolling)
  • ์ƒ์ˆ˜ ํด๋”ฉ (Constant Folding)

์ด๋Ÿฐ ๊ธฐ๋ฒ•๋“ค์€ ์ฝ”๋“œ์˜ ์‹คํ–‰ ์†๋„๋ฅผ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”.

// ํ•จ์ˆ˜ ์ธ๋ผ์ด๋‹ ์˜ˆ์‹œ
@inline(__always) func add(_ a: Int, _ b: Int) -> Int {
    return a + b
}

let result = add(5, 3)  // ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด ๋ถ€๋ถ„์„ 'let result = 5 + 3'์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์–ด์š”.

์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C

์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C๋„ LLVM์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์–ธ์–ด์˜ ๋™์  ํŠน์„ฑ ๋•Œ๋ฌธ์— ์ผ๋ถ€ ์ตœ์ ํ™”๊ฐ€ ์ œํ•œ๋  ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋ž˜๋„ ์—ฌ์ „ํžˆ ๊ฐ•๋ ฅํ•œ ์ตœ์ ํ™” ๊ธฐ๋ฒ•๋“ค์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค.

// ๋ฉ”์„œ๋“œ ์ธ๋ผ์ด๋‹ ์˜ˆ์‹œ
__attribute__((always_inline)) static inline int add(int a, int b) {
    return a + b;
}

int result = add(5, 3);  // ์ด ๋ถ€๋ถ„๋„ ์ธ๋ผ์ธ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ด์š”.

๊ฒฐ๋ก : ์ตœ์ ํ™” ๊ธฐ๋ฒ• ์ธก๋ฉด์—์„œ๋Š” ์Šค์œ„ํ”„ํŠธ๊ฐ€ ์•ฝ๊ฐ„ ์šฐ์œ„์— ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ ์‹ค์ œ ์„ฑ๋Šฅ ์ฐจ์ด๋Š” ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ๊ณผ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์ฃ .

4. ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ (Concurrency Handling) ๐Ÿ”„

ํ˜„๋Œ€์˜ ์•ฑ๋“ค์€ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์š”. ์ด๋Ÿฐ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ๋„ ์•ฑ์˜ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ฃ .

์Šค์œ„ํ”„ํŠธ

์Šค์œ„ํ”„ํŠธ๋Š” ์ตœ๊ทผ async/await ๋ฌธ๋ฒ•์„ ๋„์ž…ํ•˜์—ฌ ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋”์šฑ ์‰ฝ๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์–ด์š”.

func fetchUserData() async throws -> UserData {
    let (data, _) = try await URLSession.shared.data(from: URL(string: "https://api.example.com/user")!)
    return try JSONDecoder().decode(UserData.self, from: data)
}

Task {
    do {
        let userData = try await fetchUserData()
        print("User name: \(userData.name)")
    } catch {
        print("Error: \(error)")
    }
}

์ด ์ฝ”๋“œ๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์š”. async/await ๋ฌธ๋ฒ• ๋•๋ถ„์— ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์กŒ์ฃ !

์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C

์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C๋Š” GCD(Grand Central Dispatch)๋‚˜ NSOperation์„ ์‚ฌ์šฉํ•ด ๋™์‹œ์„ฑ์„ ์ฒ˜๋ฆฌํ•ด์š”. ์ตœ๊ทผ์—๋Š” ๋ธ”๋ก(Blocks)์„ ์ด์šฉํ•œ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋„ ๊ฐ€๋Šฅํ•ด์กŒ์ฃ .

- (void)fetchUserData:(void (^)(UserData *userData, NSError *error))completion {
    NSURL *url = [NSURL URLWithString:@"https://api.example.com/user"];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (error) {
            completion(nil, error);
            return;
        }
        
        NSError *jsonError = nil;
        UserData *userData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
        
        if (jsonError) {
            completion(nil, jsonError);
        } else {
            completion(userData, nil);
        }
    }];
    [task resume];
}

[self fetchUserData:^(UserData *userData, NSError *error) {
    if (error) {
        NSLog(@"Error: %@", error);
    } else {
        NSLog(@"User name: %@", userData.name);
    }
}];

์ด ์ฝ”๋“œ๋„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์š”. ํ•˜์ง€๋งŒ ์Šค์œ„ํ”„ํŠธ์˜ async/await์— ๋น„ํ•ด ์ข€ ๋” ๋ณต์žกํ•ด ๋ณด์ด์ฃ ?

๊ฒฐ๋ก : ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ ์ธก๋ฉด์—์„œ๋Š” ์Šค์œ„ํ”„ํŠธ์˜ ์ตœ์‹  ๋ฌธ๋ฒ•์ด ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์•ˆ์ „ํ•ด ๋ณด์—ฌ์š”. ํ•˜์ง€๋งŒ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C๋„ ์—ฌ์ „ํžˆ ๊ฐ•๋ ฅํ•œ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ต๋‹ˆ๋‹ค.

์Šค์œ„ํ”„ํŠธ์™€ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C ํŠน์„ฑ ๋น„๊ต Swift Objective-C ํƒ€์ž… ์•ˆ์ •์„ฑ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํ˜„๋Œ€์  ๋ฌธ๋ฒ• ๋น ๋ฅธ ๊ฐœ๋ฐœ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ ๋ ˆ๊ฑฐ์‹œ ์ง€์› C ํ˜ธํ™˜์„ฑ ๋™์  ํŠน์„ฑ ์„ฑ์ˆ™๋„ ๋Ÿฐํƒ€์ž„ ์œ ์—ฐ์„ฑ

์ด ๊ทธ๋ฆผ์€ ์Šค์œ„ํ”„ํŠธ์™€ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C์˜ ์ฃผ์š” ํŠน์„ฑ์„ ๋น„๊ตํ•œ ๊ฑฐ์˜ˆ์š”. ๊ฐ ์–ธ์–ด์˜ ๊ฐ•์ ์ด ์ž˜ ๋“œ๋Ÿฌ๋‚˜ ์žˆ์ฃ ? ์Šค์œ„ํ”„ํŠธ๋Š” ํ˜„๋Œ€์ ์ด๊ณ  ์•ˆ์ „ํ•œ ํŠน์„ฑ์ด ๊ฐ•์กฐ๋˜๊ณ , ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C๋Š” ์„ฑ์ˆ™๋„์™€ ์œ ์—ฐ์„ฑ์ด ๋‹๋ณด์ด๋„ค์š”.

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ์‚ดํŽด๋ณธ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋ณผ๊นŒ์š”? ๐Ÿค”

๐Ÿ ๊ฒฐ๋ก : ์Šน์ž๋Š” ๋ˆ„๊ตฌ?

์ž, ์ด์ œ ์Šค์œ„ํ”„ํŠธ์™€ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C์˜ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์— ๋Œ€ํ•ด ๊ฝค๋‚˜ ๊นŠ์ด ์žˆ๊ฒŒ ์‚ดํŽด๋ดค์–ด์š”. ๊ทธ๋ ‡๋‹ค๋ฉด ์ตœ์ข… ์Šน์ž๋Š” ๋ˆ„๊ตฌ์ผ๊นŒ์š”? ๐Ÿค”

์‚ฌ์‹ค, ์ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์€ "์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค"์˜ˆ์š”. ์™œ ๊ทธ๋Ÿด๊นŒ์š”?

  1. ํ”„๋กœ์ ํŠธ์˜ ํŠน์„ฑ: ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ์Šค์œ„ํ”„ํŠธ๊ฐ€ ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ธฐ์กด์˜ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ํฐ ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C๊ฐ€ ๋” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์–ด์š”.
  2. ๊ฐœ๋ฐœ์ž์˜ ์ˆ™๋ จ๋„: ๊ฐ ์–ธ์–ด์— ๋Œ€ํ•œ ๊ฐœ๋ฐœ์ž์˜ ๊ฒฝํ—˜๊ณผ ์ˆ™๋ จ๋„๋„ ์ค‘์š”ํ•œ ์š”์†Œ์˜ˆ์š”.
  3. ์„ฑ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ: ๊ทน๋„๋กœ ๋†’์€ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์—์„œ๋Š” ์—ฌ์ „ํžˆ ์˜ค๋ธŒ์ ํ‹ฐ๋ธŒ-C๊ฐ€ ์„ ํ˜ธ๋  ์ˆ˜ ์žˆ์–ด์š”.
  4. ์œ ์ง€๋ณด์ˆ˜์„ฑ: ์žฅ๊ธฐ์ ์ธ ๊ด€์ ์—์„œ๋Š” ์Šค์œ„ํ”„ํŠธ์˜ ์•ˆ์ „์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์ด ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ์ฃ .

๊ทธ๋ž˜๋„ ์ „๋ฐ˜์ ์ธ ํŠธ๋ Œ๋“œ๋ฅผ ๋ณด์ž๋ฉด, ์Šค์œ„ํ”„ํŠธ๊ฐ€ ์ ์  ๋” ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์˜ ์„ ํƒ์„ ๋ฐ›๊ณ  ์žˆ์–ด์š”. ์• ํ”Œ๋„ ์Šค์œ„ํ”„ํŠธ๋ฅผ ๋ฏธ๋ž˜์˜ ์ฃผ๋ ฅ ์–ธ์–ด๋กœ ๋ฐ€๊ณ  ์žˆ๊ณ , ์ง€์†์ ์ธ ๊ฐœ์„ ์ด ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ์ฃ .

ํ•˜์ง€๋งŒ ์žŠ์ง€ ๋ง์•„์•ผ ํ•  ์ ์€, ์ข‹์€ ์•ฑ์€ ์–ธ์–ด ์„ ํƒ๋ณด๋‹ค๋Š” ๊ฐœ๋ฐœ์ž์˜ ์‹ค๋ ฅ๊ณผ ๋…ธ๋ ฅ์— ๋” ๋งŽ์ด ์ขŒ์šฐ๋œ๋‹ค๋Š” ๊ฑฐ์˜ˆ์š”. ์–ด๋–ค ์–ธ์–ด๋ฅผ ์„ ํƒํ•˜๋“ , ๊ทธ ์–ธ์–ด์˜ ํŠน์„ฑ์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์ตœ์ ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋ฆฌ๊ณ  ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ์žฌ๋Šฅ๋„ท(https://www.jaenung.net) ๊ฐ™์€ ํ”Œ๋žซํผ์„ ํ™œ์šฉํ•˜๋ฉด, ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์˜ ๊ฒฝํ—˜๊ณผ ๋…ธํ•˜์šฐ๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๊ธฐํšŒ๊ฐ€ ๋  ๊ฑฐ์˜ˆ์š”. ํ•จ๊ป˜ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์ผ์›์ด ๋˜์–ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”?

์ž, ์ด์ œ ์ •๋ง ๊ธ€์„ ๋งˆ๋ฌด๋ฆฌํ•  ์‹œ๊ฐ„์ด๋„ค์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ iOS ๊ฐœ๋ฐœ ์—ฌ์ •์— ์ด ๊ธ€์ด ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋„์›€์ด ๋˜์—ˆ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ™”์ดํŒ…! ๐Ÿš€๐Ÿ‘จโ€๐Ÿ’ป๐Ÿ‘ฉโ€๐Ÿ’ป