[Swift] Struct vs. Class (1), μΈμ λ μ¨μΌν κΉ?
ꡬ쑰체λ ν΄λμ€λ.. κ³ κ²μ΄ λ¬Έμ λ‘λ€..
μλ‘μ΄ λ°μ΄ν° ꡬ쑰λ₯Ό μ μνκ±°λ νμ μ λ§λ€ λ, ꡬ쑰체μ ν΄λμ€ μ€ μ΄λ€ κ²μ μ¬μ©ν μ§ κ³ λ―Όνκ³€ ν©λλ€. μ€λμ ꡬ쑰체μ ν΄λμ€μ μ°¨μ΄μ λν΄μ μμλ³΄κ³ μ΄λ€ μν©μ μ΄λ€ λ°©μμ μ ννλ©΄ μ’μμ§ κ³ λ―Όν΄λ³΄κ² μ΅λλ€.
κ° νμ vs. μ°Έμ‘° νμ
ꡬ쑰체μ ν΄λμ€μ μ°¨μ΄ μ€ κ°μ₯ λλλ¬μ§λ κ²μ ꡬ쑰체λ κ° νμ , ν΄λμ€λ μ°Έμ‘° νμ μ΄λΌλ κ²μ λλ€. λ°λΌμ ꡬ쑰체μ μΈμ€ν΄μ€λ λ³μμ λμ λκ±°λ λ€λ₯Έ ν¨μλ‘ μ λ¬λ λ, λ©€λ²λ€μ κ°μ΄ κ·Έλλ‘ λ³΅μ¬λ μλ‘μ΄ μΈμ€ν΄μ€κ° μμ±λκ³ , ν΄λμ€λ νμ¬ μΈμ€ν΄μ€μ μ°Έμ‘° κ°μ΄ μ λ¬λ©λλ€.
λ©λͺ¨λ¦¬ μ¬μ©
ꡬ쑰체λ κ° νμ , ν΄λμ€λ μ°Έμ‘° νμ μ΄λΌλ λ§μ 곧 λ νμ μ΄ λ©λͺ¨λ¦¬λ₯Ό μλ‘ λ€λ₯΄κ² μ¬μ©νλ€λ κ²μ μλ―Έν©λλ€.
ꡬ쑰체 - μ€ν μμ
ꡬ쑰체λ κ° νμ μ΄κΈ° λλ¬Έμ, λ©λͺ¨λ¦¬μ μ€ν μμμ μ¬μ©ν©λλ€. μ€ν μμμ κ° μ€λ λκ° λ 립μ μΌλ‘ μ¬μ©νκΈ° λλ¬Έμ Thread-Safe νλ€λ νΉμ§μ΄ μμ΅λλ€. λν μ€ν μμμ μ€ν ν¬μΈν°λ§ μ΄λμν€λ©΄ λκΈ° λλ¬Έμ ν λ²μ λͺ λ ΉμΌλ‘ ν λΉκ³Ό ν΄μ κ° κ°λ₯ν©λλ€. κ·Έλ¦¬κ³ μ»΄νμΌ νμμ ν λΉν ν¬κΈ°κ° κ²°μ λκΈ° λλ¬Έμ λ©λͺ¨λ¦¬λ₯Ό λ°λ‘ κ΄λ¦¬ν΄μ£Όμ§ μμλ λ©λλ€. μ΄λ μ΄μ체μ κ° μλ‘μ΄ λ°μ΄ν°λ₯Ό ν λΉν μμμ λ°λ‘ κ³μ°νμ§ μμλ λλ€λ κ²μ μλ―Έν©λλ€.
ν΄λμ€ - ν μμ
ν΄λμ€μ μΈμ€ν΄μ€λ ν μμμ μ μ₯λ©λλ€. ν μμμ μ μ₯λλ λ°μ΄ν°λ€μ λͺ¨λ μ»΄νμΌ νμμ΄ μλ λ°νμμ ν¬κΈ°κ° κ²°μ λ©λλ€. λ°λΌμ λ°νμμ μΆκ°μ μΈ μ°μ°μ μꡬν©λλ€. λν ν μμμ ν νλ‘μΈμ€μ μ€λ λλ€μ΄ ν¨κ» 곡μ νλ μμμ΄κΈ° λλ¬Έμ Thread-Safeμ 보μ₯νμ§ μμ΅λλ€.
μ λ΄μ©μ κΈ°λ°νμ¬ μκ°ν΄λ³΄λ©΄, ꡬ쑰체λ₯Ό μ¬μ©νλ κ²μ΄ λ©λͺ¨λ¦¬ κ΄λ¦¬ μΈ‘λ©΄μμ ν΄λμ€μ λΉν΄ λ μ 리νκ³ , λ λΉ λ₯Έ μλλ₯Ό κ°μ§λλ€.
Copy-on-write
ꡬ쑰체μ κ°μ κ° νμ λ€μ κ° Copy-on-writeλΌλ μ΅μ νλ₯Ό μ¬μ©ν©λλ€. λͺ¨λ κ° νμ λ€μ΄ Copy-on-writeλ₯Ό μ¬μ©νμ§λ μμ§λ§, λ°°μ΄, λμ λ리μ κ°μ κ΅¬μ‘°μ²΄λ‘ μ μλ 컬λ μ λ€μ μ΄ μ΅μ νλ₯Ό μ¬μ©ν©λλ€.
Copy-on-writeλ κ° νμ λ³μλ₯Ό μλ‘μ΄ λ³μμ ν λΉν λ, μ¦μ μλ‘μ΄ κ°μ 볡μ¬νλ κ²μ΄ μλλΌ, κΈ°μ‘΄ μΈμ€ν΄μ€λ₯Ό κ³μ κ°λ¦¬ν€λ€κ° λ³κ²½μ¬νμ΄ μκ²Όμ λ 볡μ¬λ³Έμ λ§λλ κ²μ μλ―Έν©λλ€. λ©μΉκ° ν°, νΉν λ΄λΆμ μ°Έμ‘° νμ λ©€λ² λ³μλ₯Ό ν¬ν¨νλ ꡬ쑰체μ 볡μ¬λ λ νΌλ°μ€ μΉ΄μ΄ν κ³Ό κ°μ μ€λ²ν€λλ₯Ό λ°μμν΅λλ€. λ°λΌμ μ΅μ νλ₯Ό μν΄ λ³κ²½μ¬νμ΄ μμ λλ κΈ°μ‘΄ μΈμ€ν΄μ€λ₯Ό κ·Έλλ‘ μ¬μ©νκ³ , μλ‘μ΄ λ³κ²½μ΄ μκ²Όμ λλ§ μμ ν μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό λ§λλ μ΅μ νλ₯Ό μ¬μ©ν©λλ€.
import Foundation
func compareValueTypeInstance(of arr1:[Int], with arr2:[Int]) {
if arr1 == arr2 {
print("same instance")
} else {
print("different istance")
}
}
let arr1 = [1, 2, 3, 4]
var arr2 = arr1
compareValueTypeInstance(of: arr1, with: arr2) // "same instance"
arr2.append(5)
compareValueTypeInstance(of: arr1, with: arr2) // "different istance"
μμ
ν΄λμ€λ μμμ΄ κ°λ₯νμ§λ§ ꡬ쑰체λ μμμ΄ λΆκ°λ₯ν©λλ€. ꡬ쑰체μμ Protocolμ μ±νν΄μ κΈ°λ₯μ νμ₯ν μλ μλλ‘ ν©λλ€. μ¬μ€ μ€μννΈλ νλ‘ν μ½μ ν΅ν μμμ κΆμ₯νκ³ μμ΄μ.
μΈμ λ μΈκΉ?
κ·ΈλΌ μΈμ ꡬ쑰체λ₯Ό μ°κ³ , μΈμ ν΄λμ€λ₯Ό μ¨μΌ ν κΉμ? 곡μλ¬Έμμμ μΉμ νκ² μλ΄ν΄μ£Όκ³ μμ΅λλ€.
Apple Developer Documentation
developer.apple.com
λν΄νΈλ‘ ꡬ쑰체λ₯Ό μ¬μ©νμΈμ.
λ€λ₯Έ μΈμ΄λ€κ³Όλ λ€λ₯΄κ² μ€μννΈμ ꡬ쑰체λ ν΄λμ€μμ μ¬μ©ν μ μλ λ€μν μμλ€μ μ¬μ©ν μ μμ΅λλ€. μ°μ°/μ μ₯ νλ‘νΌν°, λ©μλ, νλ‘ν μ½ μ±ν λ± λ€λ₯Έ μΈμ΄μμλ ν΄λμ€μμλ§ μ¬μ©ν μ μμ§λ§ μ€μννΈμμλ ꡬ쑰체μμλ μ§μν©λλ€. λν μ€μννΈμ νμ€ λΌμ΄λΈλ¬λ¦¬λ€μ λ°μ΄ν°λ€ μμλ λλΆλΆ ꡬ쑰체λ₯Ό μ¬μ©ν΄ ꡬνλμ΄ μμ΅λλ€.
Objective-Cμ μνΈ μ΄μ©(Interoperability) ν΄μΌ ν λλ ν΄λμ€λ₯Ό μ¬μ©νμΈμ.
Objective-Cμμ μ§μνλ APIλ₯Ό μ¬μ©ν΄μΌ ν λλ Objective-Cμ ν΄λμ€λ₯Ό μμλ°μ μ¬μ©ν΄μΌ ν μ μμ΅λλ€. μ΄λ° κ²½μ°μλ ν΄λμ€λ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
κ³ μ ν κ°μ μ μ΄ν΄μΌ ν λλ ν΄λμ€λ₯Ό μ¬μ©νμΈμ.
ν΄λμ€λ μ°Έμ‘° νμ μ΄κΈ° λλ¬Έμ μ€μννΈμμ κ³ μ ν κ°μΌλ‘ μ¬μ©λ©λλ€. μ°Έμ‘° νμ μ μ¬μ©νλ©΄ μ±μ μ¬λ¬ κ³³μμ μ¬μ©νλλΌλ ν μμμμ μ μ©ν μμ μ΄ λ€λ₯Έ μμμμλ μ μ©λ©λλ€. μ£Όλ‘ νμΌ κ΄λ¦¬λ λ€νΈμν¬ μ°κ²°κ³Ό κ°μ μμ μ λ€λ£° λ ν΄λμ€λ₯Ό μ¬μ©ν©λλ€.
κ³ μ ν κ°μ μ μ΄νμ§ μμ λλ ꡬ쑰체λ₯Ό μ¬μ©νμΈμ.
μΈλΆμμ μ΄λ―Έ κ³ μ μ±μ μ²λ¦¬νκ³ μλ κ²½μ°μλ μ± λ΄μμ λ°μ΄ν°μ κ³ μ μ±μ κ΄λ¦¬ν νμκ° μμ΅λλ€.
μμκ³Ό 곡μ μμ±μ λͺ¨λΈλ§ νκ³ μΆμ λλ ꡬ쑰체μ νλ‘ν μ½μ μ¬μ©νμΈμ.
ꡬ쑰체λ ν΄λμ€μ²λΌ λ€λ₯Έ ν΄λμ€λ₯Ό μμν μ μμ΅λλ€. νμ§λ§ νλ‘ν μ½μ ν΅ν΄ κ³μΈ΅κ΅¬μ‘°λ₯Ό ννν μ μμ΅λλ€. ν΄λμ€λ ν΄λμ€λΌλ¦¬λ§ μμμ λ§λ€ μ μλ λ°λ©΄μ νλ‘ν μ½μ ν΄λμ€, μ΄κ±°ν, κ΅¬μ‘°μ²΄κ° λͺ¨λ μ±ννλλ‘ ν μ μμ΅λλ€.