각 자료형 객체의 mutable, immutable 여부
Swift의 데이터 타입은 Int, Uint, Float, Double, Bool, Character, String, Any.
열거형은 Array, Dictionary, Set 정도가 있다.
이는 모두 struct를 기반으로 구현되어 있다.
부족한 부분은 댓글로 작성 부탁드립니다, 추가할게요!
지금 얘기하고자 하는 mutable, immutable은 let 혹은 var로 선언하는 것과 다른 얘기이다.
Array의 Copy-On-Write와 같이 메모리 주소 참조 후 변형 ( 추가, 제거 등 ) 이 가해졌을 때에 다른 주소에 다시 저장된는 지에 대한 여부를 확인하기 위한 것이다.
메모리 주소를 위한 메소드는 참조에서 가져왔다.
코드
class mutableTest {
func address(of object: UnsafeRawPointer) -> String{
let address = Int(bitPattern: object)
return String(format: "%p", address)
}
func start() {
var int: Int = 0
print("Int:", address(of: &int))
int = 1
print("Int-selfTest:", address(of: &int))
var intTest = int
print("IntTest-Before:",address(of: &intTest))
intTest = 1
print("IntTest-After:",address(of: &intTest))
var uint: UInt = 0
print("uint:",address(of: &uint))
uint = 1
print("Uint-selfTest:", address(of: &uint))
var uintTest = uint
print("UintTest-Before:",address(of: &uintTest))
uintTest = 1
print("uintTest-After:",address(of: &uintTest))
var float: Float = 0.9
print("float:",address(of: &float))
float = 1.1
print("float-selfTest:", address(of: &float))
var floatTest = float
print("floatTest-Before:",address(of: &floatTest))
floatTest = 1.0
print("floatTest-After:",address(of: &floatTest))
var double: Double = 0.9
print("double:",address(of: &double))
double = 1.0
print("double-selfTest:", address(of: &double))
var doubleTest = double
print("doubleTest-Before:",address(of: &doubleTest))
doubleTest = 1.1
print("doubleTest-After:",address(of: &doubleTest))
var bool: Bool = false
print("bool:",address(of: &bool))
bool = true
print("bool-selfTest:", address(of: &bool))
var boolTest = bool
print("boolTest-Before:",address(of: &boolTest))
boolTest = false
print("boolTest-After:",address(of: &boolTest))
var char: Character = "A"
print("char:",address(of: &char))
char = "B"
print("char-selfTest:", address(of: &char))
var charTest = char
print("charTest-Before:",address(of: &charTest))
charTest = "b"
print("charTest-After:",address(of: &charTest))
var string: String = "A"
print("String:",address(of: &string))
string = "B"
print("string-selfTest:", address(of: &string))
var stringTest = string
print("stringTest-Before:",address(of: &stringTest))
stringTest = "b"
print("stringTest-After:",address(of: &stringTest))
var any: Any = "A"
print("any:",address(of: &any))
any = "B"
print("any-selfTest:", address(of: &any))
var anyTest = any
print("anyTEst-Before:",address(of: &anyTest))
anyTest = "b"
print("anyTEst-After:",address(of: &anyTest))
var array: [Int] = [0]
print("array:",address(of: &array))
array[0] = 1
print("array-변형selfTset:", address(of: &array))
array.append(3)
print("array-추가selfTset:", address(of: &array))
var arrayTest = array
print("arrayTest-Before:",address(of: &arrayTest))
arrayTest.append(2)
print("arrayTest-After:",address(of: &arrayTest))
var dict: [Int:Int] = [0:0]
print("dict:",address(of: &dict))
dict[0] = 1
print("dict-selfTest:", address(of: &dict))
var dictTest = dict
print("dictTest-Before:",address(of: &dictTest))
dictTest[1] = 2
print("dictTest-After:",address(of: &dictTest))
var set: Set<Int> = [0]
print("set:",address(of: &set))
set.insert(1)
print("set-selfTest:", address(of: &set))
var setTest = set
print("setTest-Before:",address(of: &setTest))
setTest.insert(2)
print("setTest-After:",address(of: &setTest))
}
}
mutableTest.init().start()
코드를 만들 때, 그냥 별 생각없이 하드코딩을 했는데,, generic method로 분리할 껄 이라는 후회를 많이했다..
결과
Int: 0x7ffeee1db610
Int-selfTest: 0x7ffeee1db610
IntTest-Before: 0x7ffeee1db5c0
IntTest-After: 0x7ffeee1db5c0
uint: 0x7ffeee1db618
Uint-selfTest: 0x7ffeee1db618
UintTest-Before: 0x7ffeee1db5c8
uintTest-After: 0x7ffeee1db5c8
float: 0x7ffeee1db660
float-selfTest: 0x7ffeee1db660
floatTest-Before: 0x7ffeee1db668
floatTest-After: 0x7ffeee1db668
double: 0x7ffeee1db620
double-selfTest: 0x7ffeee1db620
doubleTest-Before: 0x7ffeee1db628
doubleTest-After: 0x7ffeee1db628
bool: 0x7ffeee1db700
bool-selfTest: 0x7ffeee1db700
boolTest-Before: 0x7ffeee1db6e8
boolTest-After: 0x7ffeee1db6e8
char: 0x7ffeee1db5d0
char-selfTest: 0x7ffeee1db5d0
charTest-Before: 0x7ffeee1db5e0
charTest-After: 0x7ffeee1db5e0
String: 0x7ffeee1db5f0
string-selfTest: 0x7ffeee1db5f0
stringTest-Before: 0x7ffeee1db600
stringTest-After: 0x7ffeee1db600
any: 0x7ffeee1db698
any-selfTest: 0x7ffeee1db698
anyTEst-Before: 0x7ffeee1db1f0
anyTEst-After: 0x7ffeee1db1f0
array: 0x6000029c95e0
array-변형selfTset: 0x6000029c95e0
array-추가selfTset: 0x6000029c9d90
arrayTest-Before: 0x6000029c9d90
arrayTest-After: 0x6000032d85e0
dict: 0x7ffeee1db638
dict-selfTest: 0x7ffeee1db638
dictTest-Before: 0x7ffeee1db640
dictTest-After: 0x7ffeee1db640
set: 0x7ffeee1db650
set-selfTest: 0x7ffeee1db650
setTest-Before: 0x7ffeee1db648
setTest-After: 0x7ffeee1db648
Int: 0x7ffeee1db610
Int-selfTest: 0x7ffeee1db610
IntTest-Before: 0x7ffeee1db5c0
IntTest-After: 0x7ffeee1db5c0
uint: 0x7ffeee1db618
Uint-selfTest: 0x7ffeee1db618
UintTest-Before: 0x7ffeee1db5c8
uintTest-After: 0x7ffeee1db5c8
float: 0x7ffeee1db660
float-selfTest: 0x7ffeee1db660
floatTest-Before: 0x7ffeee1db668
floatTest-After: 0x7ffeee1db668
double: 0x7ffeee1db620
double-selfTest: 0x7ffeee1db620
doubleTest-Before: 0x7ffeee1db628
doubleTest-After: 0x7ffeee1db628
bool: 0x7ffeee1db700
bool-selfTest: 0x7ffeee1db700
boolTest-Before: 0x7ffeee1db6e8
boolTest-After: 0x7ffeee1db6e8
char: 0x7ffeee1db5d0
char-selfTest: 0x7ffeee1db5d0
charTest-Before: 0x7ffeee1db5e0
charTest-After: 0x7ffeee1db5e0
String: 0x7ffeee1db5f0
string-selfTest: 0x7ffeee1db5f0
stringTest-Before: 0x7ffeee1db600
stringTest-After: 0x7ffeee1db600
any: 0x7ffeee1db698
any-selfTest: 0x7ffeee1db698
anyTEst-Before: 0x7ffeee1db1f0
anyTEst-After: 0x7ffeee1db1f0
array: 0x6000029c95e0
array-변형selfTset: 0x6000029c95e0
array-추가selfTset: 0x6000029c9d90
arrayTest-Before: 0x6000029c9d90
arrayTest-After: 0x6000032d85e0
dict: 0x7ffeee1db638
dict-selfTest: 0x7ffeee1db638
dictTest-Before: 0x7ffeee1db640
dictTest-After: 0x7ffeee1db640
set: 0x7ffeee1db650
set-selfTest: 0x7ffeee1db650
setTest-Before: 0x7ffeee1db648
setTest-After: 0x7ffeee1db648
고찰
- 모든 자료형은
var first: 자료형 = 자료형 값
var second = first 일 때 새로운 주소값을 부여받는다. - Array를 제외한 자료형은 값이 변해도 주소값이 변하지 않는다.
- Array는 기존 변수의 값이 변할 경우, 메모리 주소가 바뀌지 않는다.
- Array에 새로운 요소를 추가할 경우, 새로운 주소가 부여된다.
- Array의 경우 1.의 경우, 기존의 주소값을 부여한다.(Copy-On-Write) 이 후, 3. 4.의 규칙을 따른다.