iOS/Swift

각 자료형 객체의 mutable, immutable 여부

Downey 2021. 8. 19. 22:15

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

고찰

  1. 모든 자료형은 
    var first: 자료형 = 자료형 값 
    var second = first 일 때 새로운 주소값을 부여받는다. 
  2. Array를 제외한 자료형은 값이 변해도 주소값이 변하지 않는다. 
  3. Array는 기존 변수의 값이 변할 경우, 메모리 주소가 바뀌지 않는다. 
  4. Array에 새로운 요소를 추가할 경우, 새로운 주소가 부여된다. 
  5. Array의 경우 1.의 경우, 기존의 주소값을 부여한다.(Copy-On-Write) 이 후, 3. 4.의 규칙을 따른다.