๐Ÿ“’ Study/๐Ÿšฉ Swift

HTTP ํ”„๋กœํ† ์ฝœ์ด๋ž€? HTTP ํ”„๋กœํ† ์ฝœ์ด๋ž€ "HyperText Transfer Protocol"์˜ ์ค„์ž„๋ง๋กœ ์›น์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ทœ์•ฝ ๋˜๋Š” ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํ•˜์ดํผ ๋ฌธ์„œ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ ์‚ฌ์šฉ์ด ๋˜๋Š”๋ฐ์š”! ์ด๋•Œ, ํด๋ผ์ด์–ธํŠธ๋Š” ์›น์‚ฌ์ดํŠธ๋ฅผ, ์„œ๋ฒ„๋Š” ์„œ๋ฒ„ ์ปดํ“จํ„ฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ผ์š”! ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋ฉด, ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์„ ํ•˜๋Š” ์š”์ฒญ/์‘๋‹ต ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์ด ์ด๋ฃจ์–ด์ ธ์š”. ๋˜ํ•œ HTTP๋Š” ์ด๋ฏธ์ง€, ์˜์ƒ, ์Œ์„ฑ, ํŒŒ์ผ JSON ๋“ฑ ๋ชจ๋“  ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HTTP๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„์—ฐ๊ฒฐ์„ฑ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋น„์—ฐ๊ฒฐ์„ฑ์ด๋ผ๋Š” ๊ฒƒ์€ ์ „์— ๋ณด๋ƒˆ๋˜ ๋ฐ์ดํ„ฐ์™€ ํ›„์— ๋ณด๋ƒˆ๋˜ ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ์—ฐ๊ด€์„ฑ์ด ์ „ํ˜€ ์—†๋‹ค๋Š” ๊ฒƒ์ด์—์š”! ๊ฐ ์š”์ฒญ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ..
์˜ค๋Š˜์€ ARC ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•ด ๋ณผ๊นŒ ํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด ๋ณผ๊นŒ์š”?! โœจ ์Šค์œ„ํ”„ํŠธ๋Š” ARC ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํž™ ์˜์—ญ์—์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์Œ.. ๊ทธ๋ ‡๋‹ค๋ฉด ํž™ ์˜์—ญ์ด ๋Œ€์ฒด ๋ญ๊ธธ๋ž˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ• ๊นŒ์š”?! ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ์ค‘ Heap ์˜์—ญ Heap ์˜์—ญ์€ ๋Ÿฐํƒ€์ž„ ์ค‘ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ๋™์ ์œผ๋กœ ํ• ๋‹น๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ๋™์  ํ• ๋‹น์ด ๋ญ”๋ฐ์š”?! ๋™์  ํ• ๋‹น์ด๋ž€ ์Šคํƒ ์˜์—ญ์ฒ˜๋Ÿผ ์ •ํ•ด์ง„ ๊ณณ์— ๋ฐ์ดํ„ฐ ๋”ฑ๋”ฑ ๋“ค์–ด๊ฐ€๊ณ  ๋‚˜์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋น„์›Œ์ ธ ์žˆ๋Š” ๊ณต๊ฐ„์„ ์ฐพ์•„์„œ ํฌ๊ธฐ๋‚˜ ์ƒ์กด๊ธฐ๊ฐ„์„ ์ •ํ•˜์—ฌ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. Heap ์˜์—ญ์—๋Š” ์ฐธ์กฐ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ €์žฅ์ด ๋ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ์ค‘ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ Heap ์˜์—ญ์— ์ €์žฅ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋™์ ์œผ๋กœ ํ• ๋‹น ์ฐธ..
์•ˆ๋…•ํ•˜์„ธ์š”! ์˜ค๋Š˜์€ split๊ณผ components์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. split์™€ components๋Š” ๋ฌธ์ž์—ด์„ ํŠน์ • ๋ฌธ์ž์—ด์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž์—ด ๋ฌธ๋ฒ•์ด์—์š”. ์šฐ์„  split์™€ components์˜ ์ฐจ์ด๋ฅผ ๋น„๊ตํ•˜๊ธฐ ์ „์— ๊ฐ๊ฐ์˜ ์ •์˜์™€ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์˜ ์—ญํ• ์„ ์‚ดํŽด๋ด…์‹œ๋‹ค. Split func split( separator: String, maxSplits: Int = .max, omittingEmptySubsequences: Bool = true ) -> [Substring] split๋Š” Swift Standard Library ์— ํฌํ•จ์ด ๋˜์–ด์žˆ์–ด์„œ, import ์—†์ด๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค! split๋Š” separator, maxSplits, omittingEmptySubseque..
์˜ค๋Š˜์€ ๊ณ ์ฐจํ•จ์ˆ˜ map๊ณผ compactMap, flatMap์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค! ๊ณ ์ฐจํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•œ ํ•จ์ˆ˜๋ผ๋Š” ๋œป์ด๊ฒ ์ฃ ?!? ์šฐ์„  map์ด ์–ด๋–ค ํ•จ์ˆ˜์ธ์ง€์— ๋Œ€ํ•œ ์ดํ•ด๋ถ€ํ„ฐ ํ•ด๋ด…์‹œ๋‹ค! map map ์€ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ’๋“ค์„ ๋ฐฐ์—ด๋กœ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 1๋ถ€ํ„ฐ 10๊นŒ์ง€์˜ ์ˆ˜๋ฅผ ์ œ๊ณฑํ•œ ๊ฐ’์„ ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค. ๊ณ ์ฐจํ•จ์ˆ˜๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด, var array = [Int]() for i in 1...10 { array.append(i*i) } print(array) // ์ถœ๋ ฅ: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ๊ฒ ์ฃ ?! ์ด๋ฅผ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์ค„์—ฌ์ค„ ์ˆ˜ ์žˆ๋Š” ์นœ๊ตฌ๊ฐ€ ์ด map์ด..
์•ˆ๋…•ํ•˜์„ธ์š”! ์˜ค๋Š˜์€ ํ™•์žฅ(Extension)์— ๋Œ€ํ•œ ๊ณต๋ถ€๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค! ํ™•์žฅ์ด๋ž€? ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•, ํ”„๋กœํ† ์ฝœ ๋“ฑ์˜ ํƒ€์ž…์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด์— ์žˆ๋˜ ๊ฒƒ์„ ํ™•์žฅํ•˜์—ฌ ์ƒ์„ฑ์ž(Initialize), ๋ฉ”์„œ๋“œ(method), ํ”„๋กœํผํ‹ฐ(property)๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์š”. ํ™•์žฅ์˜ ๊ธฐ๋ณธ ๋ฌธ๋ฒ• class Object { // ํด๋ž˜์Šค ๊ตฌํ˜„ } extension Object { // ํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•  ๊ธฐ๋Šฅ ๊ตฌํ˜„ } ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ํ™•์žฅ ๋‹ต๊ฒŒ extension ์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Q : ๊ทธ๋Ÿผ ํ™•์žฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ์ƒ์„ฑํ–ˆ๋˜ ๊ธฐ์กด ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์—์„œ๋Š” ํ™•์žฅ์—์„œ ๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? A : ๋„ค! ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์žฅ์€ Static Dispatch ๋ฐฉ..
์ ‘๊ทผ์ œ์–ด์˜ ๊ธฐ๋ณธ ๊ฐœ๋… ์ ‘๊ทผ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ ์ด์œ  ์• ํ”Œ์ด ์›ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ์ถœ ์ˆ˜ ์žˆ์Œ. ์ฝ”๋“œ์˜ ์˜์—ญ์„ ๋ถ„๋ฆฌ์‹œ์ผœ์„œ, ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๊ฐ์†Œ ์ปดํŒŒ์ผ๋Ÿฌ ์ž…์žฅ์—์„œ๋Š” ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ์–ด๋Š ๋ฒ”์œ„์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋” ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. class Student { private var _name: String = "ํ™๊ธธ๋™" func setName(_ name: String) { self._name = name } } var student = Student() // student._name // ๐Ÿšจ error: Value of type 'Student' has no member 'name' // student._name = "EarthSea" // ๐Ÿšจ error: Value of type..
์†์„ฑ ๊ฐ์‹œ์ž(Property Observers)๋ž€? ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋ฉฐ, ์†์„ฑ(property)์ด ๋ณ€ํ•  ๋•Œ ํ˜ธ์ถœ์ด ๋œ๋‹ค. var myProperty: Int = 20 { didSet{ // ๋ณ€๊ฒฝ๋œ ์งํ›„์— ํ˜ธ์ถœ // oldValue๊ฐ’ ํ˜ธ์ถœ๊ฐ€๋Šฅ } willSet{ // ๋ณ€๊ฒฝ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ // newValue๊ฐ’ ํ˜ธ์ถœ๊ฐ€๋Šฅ } } didSet - ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ ์ง ํ›„์— ํ˜ธ์ถœ๋˜๊ณ , ๋ณ€ํ•˜๊ธฐ ์ „์˜ ๊ฐ’์ด oldValue๋กœ ์ž๋™ ์ €์žฅ๋จ. willSet - ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ ์ง์ „์— ํ˜ธ์ถœ๋˜๊ณ , ๋ณ€ํ•œ ํ›„์˜ ๊ฐ’์ด newValue๋กœ ์ž๋™ ์ €์žฅ ์ €์žฅ์†์„ฑ์€ var๋กœ๋งŒ ์„ ์–ธ์ด ๊ฐ€๋Šฅ let์€ ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ด€์ฐฐํ•  ํ•„์š”๊ฐ€ ์—†์Œ. ์ง€์—ฐ ์ €์žฅ ์†์„ฑ์€ ๊ด€์ฐฐ์ด ๋ถˆ๊ฐ€๋Šฅ ์ž๋ฃŒํ˜•์„ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜ ๋ณ€์ˆ˜์™€ ๋™์ผ ์ €์žฅ ์†์„ฑ์˜ ๋ณ€ํ™” ์‹œ์ ..
ํƒ€์ž…์บ์ŠคํŒ…์ด๋ž€? : ๋ณ€์ˆ˜๋‚˜ ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ is ์—ฐ์‚ฐ์ž : ํƒ€์ž…์„ ์ฒดํฌํ•˜๋Š” ์—ฐ์‚ฐ์ž๋กœ Bool ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. var name: String = "EarthSea" print(name is String) print(name is Int) /* ์ถœ๋ ฅ : true false */ var alphabet: Character = "A" print(alphabet is Character) print(alphabet is String) /* ์ถœ๋ ฅ : true false */ var age: Int = 20 print(age is Int) print(age is Double) /* ์ถœ๋ ฅ : true false */ ์—…์บ์ŠคํŒ…๊ณผ ๋‹ค์šด์บ์ŠคํŒ… : ์ธ์Šคํ„ด์Šค์˜ ํƒ€์ž…์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ์Šˆํผํด๋ž˜..
EarthSea
'๐Ÿ“’ Study/๐Ÿšฉ Swift' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก