๐ ์ค์ํํธ vs ์ค๋ธ์ ํฐ๋ธ-C: iOS ์ฑ์ ๋ฐํ์ ์ฑ๋ฅ ๋๊ฒฐ! ๐

์๋ ํ์ธ์, ๊ฐ๋ฐ์ ์ฌ๋ฌ๋ถ! ์ค๋์ iOS ์ฑ ๊ฐ๋ฐ์ ๋ ๊ฑฐ์ธ, ์ค์ํํธ์ ์ค๋ธ์ ํฐ๋ธ-C์ ๋ฐํ์ ์ฑ๋ฅ์ ๋ํด ๊น์ด ํํค์ณ๋ณผ ๊ฑฐ์์. ์ด ๋ ์ธ์ด์ ์ฑ๋ฅ ์ฐจ์ด๋ฅผ ์๋ฉด ์ฌ๋ฌ๋ถ์ ์ฑ ๊ฐ๋ฐ ์ค๋ ฅ์ด ํ ๋จ๊ณ ์ ๊ทธ๋ ์ด๋๋ ๊ฑฐ์์! ๐
๊ทธ๋ผ ์ด์ ๋ถํฐ ์ค์ํํธ์ ์ค๋ธ์ ํฐ๋ธ-C์ ์ธ๊ณ๋ก ๋น ์ ธ๋ณผ๊น์? ์ค๋น๋์ จ๋์? 3, 2, 1... ์ถ๋ฐ! ๐๏ธ๐จ
๐ง ์ค์ํํธ์ ์ค๋ธ์ ํฐ๋ธ-C: ๊ธฐ๋ณธ ๊ฐ๋ ์ดํดํ๊ธฐ
๋จผ์ , ์ฐ๋ฆฌ์ ์ฃผ์ธ๊ณต๋ค์ ๊ฐ๋จํ ์๊ฐํด๋ณผ๊ฒ์!
์ค์ํํธ (Swift) ๐ฆ
์ ํ์ด 2014๋ ์ ์ ๋ณด์ธ ํ๋์ ์ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์. ์์ ์ฑ, ์๋, ํํ๋ ฅ์ ๋ชจํ ๋ก ์ผ๊ณ ์์ฃ .
์ค๋ธ์ ํฐ๋ธ-C (Objective-C) ๐ข
1980๋ ๋์ ํ์ํ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก, iOS์ macOS ๊ฐ๋ฐ์ ๊ธฐ๋ฐ์ด ๋์์ด์.
๋ ์ธ์ด ๋ชจ๋ iOS ์ฑ ๊ฐ๋ฐ์ ์ฌ์ฉ๋์ง๋ง, ๊ฐ์์ ํน์ง๊ณผ ์ฅ๋จ์ ์ด ์์ด์. ํนํ ๋ฐํ์ ์ฑ๋ฅ ๋ฉด์์๋ ๊ฝค๋ ํฅ๋ฏธ๋ก์ด ์ฐจ์ด๋ฅผ ๋ณด์ด์ฃ . ๊ทธ๋ผ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ํํค์ณ๋ณผ๊น์? ๐ต๏ธโโ๏ธ
์ด ๊ทธ๋ํฝ์ ๋ณด๋ฉด ์ค์ํํธ์ ์ค๋ธ์ ํฐ๋ธ-C๊ฐ ๋ง์น ๊ถํฌ ๋ง ์์ ์ ๋ ์ ์ ๊ฐ์ฃ ? ใ ใ ใ ์ด์ ๋ถํฐ ์ด ๋ ์ ์์ ์ฑ๋ฅ ๋๊ฒฐ์ ์์ธํ ์ดํด๋ณผ ๊ฑฐ์์!
๐โโ๏ธ ๋ฐํ์ ์ฑ๋ฅ: ์๋์ ๋๊ฒฐ
์, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ค์ํํธ์ ์ค๋ธ์ ํฐ๋ธ-C์ ๋ฐํ์ ์ฑ๋ฅ์ ๋น๊ตํด๋ณผ ๊ฑฐ์์. ๋ฐํ์ ์ฑ๋ฅ์ด๋ผ๊ณ ํ๋ฉด ๋ญ๊ฐ ์ด๋ ค์ ๋ณด์ด์ฃ ? ์ฝ๊ฒ ๋งํด์ ํ๋ก๊ทธ๋จ์ด ์คํ๋ ๋ ์ผ๋ง๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ๋์ํ๋์ง๋ฅผ ๋งํด์. ๋ง์น F1 ๊ฒฝ์ฃผ์ฒ๋ผ ๋๊ฐ ๋ ๋นจ๋ฆฌ ๋ชฉ์ ์ง์ ๋์ฐฉํ๋๋์ ๊ฒ์์ด์ฃ ! ๐๏ธ๐จ
1. ์ปดํ์ผ ์๊ฐ โฑ๏ธ
๋จผ์ ์ปดํ์ผ ์๊ฐ๋ถํฐ ์ดํด๋ณผ๊ฒ์. ์ปดํ์ผ์ด๋ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋ ์ธ์ด๋ก ๋ฒ์ญํ๋ ๊ณผ์ ์ด์์.
์ค์ํํธ
์ค์ํํธ๋ ์ฒ์ ๋ฑ์ฅํ์ ๋ ์ปดํ์ผ ์๊ฐ์ด ์ค๋ธ์ ํฐ๋ธ-C๋ณด๋ค ๊ธธ๋ค๋ ํ๊ฐ๋ฅผ ๋ฐ์์ด์. ํ์ง๋ง ์ ํ์ด ์ด์ฌํ ๊ฐ์ ํ ๋๋ถ์ ์ต๊ทผ ๋ฒ์ ์์๋ ๋ง์ด ๋นจ๋ผ์ก๋ต๋๋ค!
์ค๋ธ์ ํฐ๋ธ-C
์ค๋ธ์ ํฐ๋ธ-C๋ ์ค๋ ์๊ฐ ์ต์ ํ๋ฅผ ๊ฑฐ์ณ์๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ์๊ฐ์ด ์๋์ ์ผ๋ก ๋น ๋ฅธ ํธ์ด์์. ํนํ ์ฆ๋ถ ๋น๋(์ผ๋ถ๋ง ์์ ํ์ ๋ ์ ์ฒด๋ฅผ ๋ค์ ์ปดํ์ผํ์ง ์๋ ๋ฐฉ์)์์ ๊ฐ์ ์ ๋ณด์ฌ์.
๊ฒฐ๋ก : ์ปดํ์ผ ์๊ฐ๋ง ๋๊ณ ๋ณด๋ฉด ์์ง์ ์ค๋ธ์ ํฐ๋ธ-C๊ฐ ์ฝ๊ฐ ์์ ์์ด์. ํ์ง๋ง ๊ทธ ์ฐจ์ด๋ ์ ์ ์ขํ์ง๊ณ ์์ฃ !
2. ์คํ ์๋ ๐
์ด์ ์ค์ ๋ก ์ฑ์ด ๊ตฌ๋๋ ๋์ ์๋๋ฅผ ๋น๊ตํด๋ณผ๊ฒ์. ์ฌ๊ธฐ์๋ถํฐ๊ฐ ์ง์ง ์น๋ถ์ฒ์์!
์ค์ํํธ
์ค์ํํธ๋ ํ๋์ ์ธ ์ธ์ด๋ต๊ฒ ๋ค์ํ ์ต์ ํ ๊ธฐ๋ฒ์ ์ ์ฉํ์ด์. ํนํ ARC(Automatic Reference Counting)๋ฅผ ์ฌ์ฉํด ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์๋ํํ์ฃ . ์ด ๋๋ถ์ ์คํ ์๋๊ฐ ๊ฝค ๋น ๋ฅธ ํธ์ด์์.
์ค๋ธ์ ํฐ๋ธ-C
์ค๋ธ์ ํฐ๋ธ-C๋ ARC๋ฅผ ์ง์ํ์ง๋ง, ๋์ ๋์คํจ์น(์คํ ์๊ฐ์ ๋ฉ์๋๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ์) ๋๋ฌธ์ ์ผ๋ถ ์ํฉ์์๋ ์ค์ํํธ๋ณด๋ค ๋๋ฆด ์ ์์ด์.
๊ฒฐ๋ก : ์คํ ์๋๋ ๋์ฒด๋ก ์ค์ํํธ๊ฐ ์ค๋ธ์ ํฐ๋ธ-C๋ณด๋ค ๋น ๋ฅธ ํธ์ด์์. ํนํ ๋ณต์กํ ์ฐ์ฐ์ด๋ ์๊ณ ๋ฆฌ์ฆ์์ ๊ทธ ์ฐจ์ด๊ฐ ๋๋๋ฌ์ ธ์.
3. ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๐พ
์ฑ์ ์ฑ๋ฅ์ ์ด์ผ๊ธฐํ ๋ ๋นผ๋์ ์ ์๋ ๊ฒ ๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด์์. ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒ ์ฌ์ฉํ ์๋ก ๋ ๋ง์ ์ฑ์ ๋์์ ์คํํ ์ ์๊ณ , ๋ฐฐํฐ๋ฆฌ ์๋ชจ๋ ์ค์ผ ์ ์์ฃ .
์ค์ํํธ
์ค์ํํธ๋ ๊ฐ ํ์ (Value Types)์ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํด์. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋ํ, ์ต์ ํ๋ ์ปฌ๋ ์ ํ์ ๋ค๋ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ๋์ฌ์ฃผ์ฃ .
์ค๋ธ์ ํฐ๋ธ-C
์ค๋ธ์ ํฐ๋ธ-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์ ์ฃผ์ ํน์ฑ์ ๋น๊ตํ ๊ฑฐ์์. ๊ฐ ์ธ์ด์ ๊ฐ์ ์ด ์ ๋๋ฌ๋ ์์ฃ ? ์ค์ํํธ๋ ํ๋์ ์ด๊ณ ์์ ํ ํน์ฑ์ด ๊ฐ์กฐ๋๊ณ , ์ค๋ธ์ ํฐ๋ธ-C๋ ์ฑ์๋์ ์ ์ฐ์ฑ์ด ๋๋ณด์ด๋ค์.
์, ์ด์ ์ฐ๋ฆฌ๊ฐ ์ดํด๋ณธ ๋ด์ฉ์ ์ ๋ฆฌํด๋ณผ๊น์? ๐ค
๐ ๊ฒฐ๋ก : ์น์๋ ๋๊ตฌ?
์, ์ด์ ์ค์ํํธ์ ์ค๋ธ์ ํฐ๋ธ-C์ ๋ฐํ์ ์ฑ๋ฅ์ ๋ํด ๊ฝค๋ ๊น์ด ์๊ฒ ์ดํด๋ดค์ด์. ๊ทธ๋ ๋ค๋ฉด ์ต์ข ์น์๋ ๋๊ตฌ์ผ๊น์? ๐ค
์ฌ์ค, ์ด ์ง๋ฌธ์ ๋ํ ๋ต์ "์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค"์์. ์ ๊ทธ๋ด๊น์?
- ํ๋ก์ ํธ์ ํน์ฑ: ์๋ก์ด ํ๋ก์ ํธ๋ผ๋ฉด ์ค์ํํธ๊ฐ ์ ๋ฆฌํ ์ ์์ง๋ง, ๊ธฐ์กด์ ์ค๋ธ์ ํฐ๋ธ-C ์ฝ๋๋ฒ ์ด์ค๊ฐ ํฐ ํ๋ก์ ํธ๋ผ๋ฉด ์ค๋ธ์ ํฐ๋ธ-C๊ฐ ๋ ์ ํฉํ ์ ์์ด์.
- ๊ฐ๋ฐ์์ ์๋ จ๋: ๊ฐ ์ธ์ด์ ๋ํ ๊ฐ๋ฐ์์ ๊ฒฝํ๊ณผ ์๋ จ๋๋ ์ค์ํ ์์์์.
- ์ฑ๋ฅ ์๊ตฌ์ฌํญ: ๊ทน๋๋ก ๋์ ์ฑ๋ฅ์ด ํ์ํ ๋ถ๋ถ์์๋ ์ฌ์ ํ ์ค๋ธ์ ํฐ๋ธ-C๊ฐ ์ ํธ๋ ์ ์์ด์.
- ์ ์ง๋ณด์์ฑ: ์ฅ๊ธฐ์ ์ธ ๊ด์ ์์๋ ์ค์ํํธ์ ์์ ์ฑ๊ณผ ๊ฐ๋ ์ฑ์ด ์ ๋ฆฌํ ์ ์์ฃ .
๊ทธ๋๋ ์ ๋ฐ์ ์ธ ํธ๋ ๋๋ฅผ ๋ณด์๋ฉด, ์ค์ํํธ๊ฐ ์ ์ ๋ ๋ง์ ๊ฐ๋ฐ์๋ค์ ์ ํ์ ๋ฐ๊ณ ์์ด์. ์ ํ๋ ์ค์ํํธ๋ฅผ ๋ฏธ๋์ ์ฃผ๋ ฅ ์ธ์ด๋ก ๋ฐ๊ณ ์๊ณ , ์ง์์ ์ธ ๊ฐ์ ์ด ์ด๋ฃจ์ด์ง๊ณ ์์ฃ .
ํ์ง๋ง ์์ง ๋ง์์ผ ํ ์ ์, ์ข์ ์ฑ์ ์ธ์ด ์ ํ๋ณด๋ค๋ ๊ฐ๋ฐ์์ ์ค๋ ฅ๊ณผ ๋ ธ๋ ฅ์ ๋ ๋ง์ด ์ข์ฐ๋๋ค๋ ๊ฑฐ์์. ์ด๋ค ์ธ์ด๋ฅผ ์ ํํ๋ , ๊ทธ ์ธ์ด์ ํน์ฑ์ ์ ์ดํดํ๊ณ ์ต์ ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ๊ฐ๋ฐ ์ธ๊ณ๋ ํญ์ ๋ณํํ๊ณ ์์ด์. ์๋ก์ด ๊ธฐ์ ๊ณผ ํธ๋ ๋๋ฅผ ๊ณ์ ์ฃผ์ํ๊ณ , ํ์ํ๋ค๋ฉด ์๋ก์ด ๊ฒ์ ๋ฐฐ์ฐ๋ ์์ธ๊ฐ ์ค์ํด์. ์ฌ๋ฌ๋ถ๋ ์ด ๊ธ์ ์ฝ๊ณ ์ค์ํํธ๋ ์ค๋ธ์ ํฐ๋ธ-C์ ๋ํด ๋ ๊น์ด ๊ณต๋ถํด๋ณด๊ณ ์ถ์ง ์๋์? ๐
๊ทธ๋ฆฌ๊ณ ์์ ์ธ๊ธํ๋ ์ฌ๋ฅ๋ท(https://www.jaenung.net) ๊ฐ์ ํ๋ซํผ์ ํ์ฉํ๋ฉด, ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ ๊ฒฝํ๊ณผ ๋ ธํ์ฐ๋ฅผ ๋ฐฐ์ธ ์ ์๋ ์ข์ ๊ธฐํ๊ฐ ๋ ๊ฑฐ์์. ํจ๊ป ์ฑ์ฅํ๋ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์ ์ผ์์ด ๋์ด๋ณด๋ ๊ฑด ์ด๋จ๊น์?
์, ์ด์ ์ ๋ง ๊ธ์ ๋ง๋ฌด๋ฆฌํ ์๊ฐ์ด๋ค์. ์ฌ๋ฌ๋ถ์ iOS ๊ฐ๋ฐ ์ฌ์ ์ ์ด ๊ธ์ด ์กฐ๊ธ์ด๋๋ง ๋์์ด ๋์๊ธธ ๋ฐ๋๋๋ค. ํ์ดํ ! ๐๐จโ๐ป๐ฉโ๐ป
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ