- λ€λ₯Έ νλ‘κ·Έλλ° μΈμ΄μ λ¬λ¦¬ Swiftλ μ¬μ©μ μ μ ꡬ쑰체μ ν΄λμ€μ λν΄ λ³λμ μΈν°νμ΄μ€μ ꡬν νμΌμ λ§λ€ νμκ° μμ΅λλ€. Swiftμμ λ¨μΌ νμΌλ‘ ꡬ쑰체 λλ ν΄λμ€λ₯Ό μ μνλ©΄ ν΄λΉ ν΄λμ€ λλ ꡬ쑰체μ λν μΈλΆ μΈν°νμ΄μ€κ° μλμΌλ‘ λ€λ₯Έ μ½λμμ μ¬μ©ν μ μμ΅λλ€.
ꡬ쑰체μ ν΄λμ€λ λ€μκ³Ό κ°μ 곡ν΅μ μ κ°μ§λλ€.
- κ°μ μ μ₯νλ νλ‘νΌν° μ μ
- κΈ°λ₯ μ 곡μ μν λ©μλ μ μ
- μλΈ μ€ν¬λ¦½νΈ ꡬ문μ μ¬μ©νμ¬ κ°μ μ κ·Όμ μ 곡νλ μλΈ μ€ν¬λ¦½νΈ μ μ
- μ΄κΈ°ν μνλ₯Ό μ€μ νκΈ° μν μ΄κΈ°ν μ μ
- κΈ°λ³Έ ꡬνμ λμ΄ κΈ°λ₯μ νμ₯μ μν νμ₯
- νΉμ μ’ λ₯μ νμ€ κΈ°λ₯μ μ 곡νλ νλ‘ν μ½ μ€μ
ꡬ쑰체λ struct ν€μλλ‘ ν΄λμ€λ class ν€μλλ‘ μμν΄ μ μν μ μμ΅λλ€. ꡬ쑰체λ ν΄λμ€μ λ³μλ₯Ό μμ±(property)μ΄λΌκ³ νκ³ ν¨μλ₯Ό λ©μλ(method)λΌκ³ ν©λλ€.
class Dog {
var name = "κ°μμ§"
var weight = 0
func sit() {
print("μμμ΅λλ€.")
}
func layDown() {
print("λμ μ΅λλ€.")
}
}
struct Bird {
var name = "μ"
var weight = 0.0
func fly() {
print("λ μκ°λλ€.")
}
}
ν΄λμ€μ ꡬ쑰체 λλ€ λ©λͺ¨λ¦¬μ μ°μ΄λΈ κ²μ μΈμ€ν΄μ€(instance)λΌκ³ νκ³ μΈμ€ν΄μ€λ μ€μ λ‘ λ©λͺ¨λ¦¬μ ν λΉλμ΄ κ΅¬μ²΄μ μ€μ²΄λ₯Ό κ°μΆ κ²μ λλ€. ꡬ쑰체μ ν΄λμ€ λͺ¨λ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μν΄ μ΄κΈ°ν ꡬ문μ μ¬μ©ν©λλ€. κ°μ₯ κ°λ¨ν ννλ ꡬ쑰체λ ν΄λμ€ μ΄λ¦ λ€μ λΉ μκ΄νΈλ₯Ό λΆμ¬ μ¬μ©νλ κ²μ λλ€. μ΄λ κ² λλ©΄ λͺ¨λ νλ‘νΌν°κ° κΈ°λ³Έκ°μΌλ‘ μ΄κΈ°νλλ ν΄λμ€ λλ ꡬ쑰체μ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μμ±ν©λλ€. μ΄λ¬ν μΈμ€ν΄μ€μ νλ‘νΌν°μ μ κ·ΌνκΈ° μν΄ μ ꡬ문(.)μ μ¬μ©ν©λλ€.
var bori = Dog()
var aBird = Bird()
bori.weight = 0.3
bori.weight // 0.3
aBird.fly() // λ μκ°λλ€.
ꡬ쑰체μ ν΄λμ€μ μ°¨μ΄μ μ 곡λΆνλ©΄μ κ·Έλ₯ κ·Έλ ꡬλ νλ©΄μ λμ΄κ°λ λΆλΆλ€μ λ©λͺ¨λ¦¬ ꡬ쑰μ μ°κ΄μ§μ΄ μ μ°¨μ΄κ° μκΈ°λ μ§λ₯Ό νμ€νκ² μκ²λμκ³ μ΄λ₯Ό 곡λΆνκ³ μ 리ν΄λ³΄μμ΅λλ€.
νλ‘κ·Έλ¨μ΄ μ€ννκ² λλ©΄ OSλ λ©λͺ¨λ¦¬μ 곡κ°μ ν λΉν΄μ£Όλλ° ν λΉν΄μ£Όλ λ©λͺ¨λ¦¬ 곡κ°μ Code, Data, Heap, Stack 4κ°μ§κ° μμ΅λλ€.
Code μμμ μ°λ¦¬κ° μμ±ν μμ€μ½λκ° κΈ°κ³μ΄ ννλ‘ λ€μ΄ κ°λ λΆλΆμΌλ‘ CPUκ° μμ°¨μ μΌλ‘ νμ€μ© μ€νν©λλ€. νλ‘κ·Έλ¨ μ€ν μ€ μ½λκ° λ°λλ©΄ μλλ Read-Onlyλ‘ μ μ₯λ©λλ€.
Data μμμ μ μλ³μλ νμ μμ±μ΄ ν λΉλλ μμμΌλ‘ νλ‘κ·Έλ¨μ μμκ³Ό λμμ ν λΉλκ³ , νλ‘κ·Έλ¨μ΄ μ’ λ£λμ΄μΌ λ©λͺ¨λ¦¬κ° μλ©Έλλ μμμ λλ€.
Heap μμμ μ¬μ©μμ μν΄ λ©λͺ¨λ¦¬ 곡κ°μ΄ λμ μΌλ‘ ν λΉλκ³ ν΄μ λλ©° ν΄λμ€μ κ°μ²΄λ ν΄λ‘μ κ°μ μ°Έμ‘°νμ μ κ°μ΄ ν λΉλ©λλ€. μ¬μ©νκ³ λ νμλ λ©λͺ¨λ¦¬ ν΄μ λ₯Ό ν΄μ€μΌ νμ§λ§ μ€μννΈλ ARCλ₯Ό ν΅ν΄ νμ ν λΉλ λ©λͺ¨λ¦¬κ° λ μ΄μ μΈλͺ¨ μμ΄μ§λ©΄(μ°Έμ‘°λμ§ μμΌλ©΄) μλμΌλ‘ ν΄μ ν΄μ€λ€κ³ ν©λλ€. ARCλ λμ€μ κΌ κ³΅λΆν΄μ μ 리ν΄λ΄μΌκ² μ΄μ
Stack μμμ ν¨μμ μ€νμ νμ λ°μ΄ν°κ° μμ±λκ³ μ¬μ© μλ£ νμλ μ μ₯λ λ©λͺ¨λ¦¬κ° ν΄μ λ©λλ€.
μ€νμμμ CPUκ° ν¨μ¨μ μΌλ‘ λ©λͺ¨λ¦¬λ₯Ό ꡬμ±νκΈ°μ μ΅μ νκ° λμ΄μμ΄ μλκ° λΉ λ₯΄κ³ λ©λͺ¨λ¦¬λ₯Ό μ§μ ν΄μ νμ§ μμλ λλ λ°λ©΄ ν μμμ λ©λͺ¨λ¦¬λ₯Ό κ°λ°μκ° μ§μ κ΄λ¦¬ν΄μΌνλ―λ‘ λ©λͺ¨λ¦¬ λμμ μνμ±μ΄ μκ³ ν λΉ/ν΄μ μμ μΌλ‘ μΈν΄ μλκ° μ€νμ λΉν΄ λ립λλ€. λ μ€νμμμ λ©λͺ¨λ¦¬ ν¬κΈ°μ λν μ νμ΄ μμ§λ§ ν μμμ μ»΄ν¨ν°μ λ¨μμλ λ©λͺ¨λ¦¬ λ΄μμλ λ©λͺ¨λ¦¬ ν¬κΈ°μ λν μ νμ΄ μμ΅λλ€.
Swiftμ Typeμ ν¬κ² Value Type(κ° νμ )κ³Ό Reference Type(μ°Έμ‘° νμ )μΌλ‘ λλ©λλ€. κ° νμ μ λ³μ λλ μμμ ν λΉλ λλ ν¨μλ‘ μ λ¬λ λ λ³΅μ¬ λλ κ°μΈ νμ μ΄κ³ μ°Έμ‘° νμ μ 볡μ¬λ³Έ λμ μ μ‘΄μ¬νλ κ°μ μΈμ€ν΄μ€μ λν μ°Έμ‘°κ° μ¬μ©λ©λλ€.
ꡬ쑰체λ Value Type(κ° νμ ), ν΄λμ€λ Reference Type(μ°Έμ‘° νμ )μ λλ€. μ΄λ₯Ό λ©λͺ¨λ¦¬ ꡬ쑰 κ΄λ ¨ν΄μ μκΈ°λ₯Ό ν΄λ³΄λ©΄ κ° νμ μΈ κ΅¬μ‘°μ²΄μ μΈμ€ν΄μ€(κ·Έ μ€ νλ‘νΌν°. λ©μλλ λ°μ΄ν° μμμ μ μ₯λλ€.)λ Stack μμμ λ°μ΄ν°λ₯Ό 볡μ¬ν΄μ λ©λͺ¨λ¦¬λ₯Ό ν λΉνκ³ , μ°Έμ‘° νμ μΈ ν΄λμ€μ μΈμ€ν΄μ€λ Heap μμμ λ©λͺ¨λ¦¬λ₯Ό ν λΉνκ³ ν¨μλ₯Ό μ€ννκ² λλ©΄ Heapμ μ£Όμλ₯Ό μ λ¬ν΄μ€λλ€. ꡬ쑰체λ ν΄λμ€ μ체λ λ°μ΄ν° μμμ μ μ₯λΌμ.
Value Type κ° -> Stackμ λ©λͺ¨λ¦¬ ν λΉ Reference Type κ° -> Heapμ λ©λͺ¨λ¦¬ ν λΉ
μΆκ°) Value Typeμ΄ Heapμ, Reference Type μ΄ Stackμ μ μ₯λλ μν©λ μλ€κ³ ν©λλ€. μ°Έκ³
class Person {
var name = "μ¬λ"
}
struct Animal {
var name = "λλ¬Ό"
}
var p = Person() // x1234 <- Heapμ μ£Όμλ₯Ό κ°λ¦¬ν΄
p.name // μ¬λ
var a = Animal()
a.name // λλ¬Ό
var p2 = p // (ν΄λμ€) // x1234 <- λ©λͺ¨λ¦¬ μ£Όμκ° λ³΅μ¬λμ λ΄κΉ
p.name = "ν리"
p.name // ν΄λ¦¬
p2.name // ν΄λ¦¬
var a2 = a // (ꡬ쑰체)
a.name = "κ°μμ§"
a.name // κ°μμ§
a2.name // λλ¬Ό
μ΄λ° μ°¨μ΄κ° μΈμ€ν΄μ€ μ μΈμ μμ(let)λ λ³μ(var)λ‘ μμ±ν λμλ μν₯μ λ―ΈμΉ©λλ€.
- μΈμ€ν΄μ€ μμ(let)μΌλ‘ μ μΈμ ꡬ쑰체 -> μ μ₯ μμ±μ΄ μ λΆ μμλ‘ μ μΈλ¨ ν΄λμ€ -> κ°λ₯΄ν€λ μΈμ€ν΄μ€ κ³ μ (μ μ₯ μμ±μ κ° let/var μ μΈμ λ°λ¦)
- μΈμ€ν΄μ€ λ³μ(var)λ‘ μ μΈμμλ ꡬ쑰체λ μ μ₯ μμ±μ κ° let/var μ μΈμ λ°λ₯Έλ€.
κ·Έλ¦¬κ³ μμμμλ μ°¨μ΄λ₯Ό 보μ λλ€. ꡬ쑰체λ μμμ΄ λΆκ°λ₯ν λ°λ©΄μ ν΄λμ€λ μμμ΄ κ°λ₯ν©λλ€. ν΄λμ€λ§μ΄ μμ κ°λ₯ν©λλ€. μμμ λν΄μλ λ€μμ λ μμΈν λ€λ€λ³Όκ²μ.
-
μ°κ΄λ λ°μ΄ν°λ€μ λ¨μν λ¬Άλ κ²μ΄ λͺ©μ μΌ λλ κ΅¬μ‘°μ²΄κ° λ«μ΅λλ€.
-
ꡬ쑰체μ μ μ₯λ μ μ₯ μμ±λ€μ΄ κ° νμ μ΄λ©° μ°Έμ‘°νλ κ²λ³΄λ€ 볡μ¬νλ κ²μ΄ ν©λΉν λ ꡬ쑰체λ₯Ό μ¬μ©ν©λλ€.
-
ν΄λΉ λͺ¨λΈμ serializeν΄μ μ μ‘νκ±°λ νμΌλ‘ μ μ₯ν κ²½μ°κ° λ°μνλ©΄ ν΄λμ€λ₯Ό μ¬μ©ν©λλ€.
-
Objectice-Cμ μνΈ μ΄μ©μ±μ μν λλ ν΄λμ€λ₯Ό μ¬μ©ν©λλ€.
- Objective-Cμμ μ§μνλ APIλ₯Ό μ¬μ©ν΄μΌ ν λλ Objective-Cμ ν΄λμ€λ₯Ό μμλ°μ μ¬μ©ν΄μΌ ν μ μμ΅λλ€. μ΄λ° κ²½μ°μλ ν΄λμ€λ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
-
κ³ μ ν κ°μ μ μ΄ν΄μΌ ν λλ ν΄λμ€λ₯Ό μ¬μ©νμΈμ.
- ν΄λμ€λ μ°Έμ‘° νμ μ΄κΈ° λλ¬Έμ μ€μννΈμμ κ³ μ ν κ°μΌλ‘ μ¬μ©λ©λλ€. μ°Έμ‘° νμ μ μ¬μ©νλ©΄ μ±μ μ¬λ¬ κ³³μμ μ¬μ©νλλΌλ ν μμμμ μ μ©ν μμ μ΄ λ€λ₯Έ μμμμλ μ μ©λ©λλ€. μ£Όλ‘ νμΌ κ΄λ¦¬λ λ€νΈμν¬ μ°κ²°κ³Ό κ°μ μμ μ λ€λ£° λ ν΄λμ€λ₯Ό μ¬μ©ν©λλ€.
[μ°Έκ³ ]
- https://docs.swift.org/swift-book/LanguageGuide/ClassesAndStructures.html
- https://developer.apple.com/documentation/swift/choosing_between_structures_and_classes
- https://sihyungyou.github.io/iOS-Memory-Architecture/
- https://sujinnaljin.medium.com/ios-swift%EC%9D%98-type%EA%B3%BC-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%A0%80%EC%9E%A5-%EA%B3%B5%EA%B0%84-25555c69ccff