大器晩成

구조체와 클래스(let, var) 참고자료 본문

iOS/Swift 문법

구조체와 클래스(let, var) 참고자료

zerobugpark 2024. 11. 25. 17:36

 

let으로 선언한 객체 (불변 참조)

let으로 객체를 선언하면, 해당 객체의 참조 자체는 변경할 수 없습니다. 즉, 다른 객체를 할당하거나, 해당 객체가 가리키는 인스턴스를 다른 곳에 재할당하는 것은 불가능합니다. 하지만 객체의 내부 속성이나 메서드를 변경할 수 있는지 여부는 객체의 타입에 따라 달라집니다.

class MyClass {
    var value: Int
    
    init(value: Int) {
        self.value = value
    }
}

let myObject = MyClass(value: 10)
myObject.value = 20  // 가능한 작업: 객체의 속성 값 변경
myObject = MyClass(value: 30)  // 오류: 'myObject'는 let으로 선언되어 변경할 수 없음




class MyClass {
    var value: Int = 10
    
//    init(value: Int) {
//        self.value = value
//    }
}

let myObject = MyClass()
myObject = MyClass() // 에러 발생, MyClass()는 새로운 객체를 생성하는것과 동일
  • let으로 선언된 myObject는 다른 객체를 할당하는 것이 불가능합니다.
  • 하지만, myObject의 속성인 value는 변경할 수 있습니다. 이는 클래스 타입이므로, let은 객체 자체의 참조를 불변으로 만들지만, 객체 내부의 속성은 변경 가능하기 때문입니다.

var로 선언한 객체 (가변 참조)

반면에 var로 선언한 객체는 참조 자체도 변경할 수 있습니다. 즉, 같은 변수에 다른 객체를 할당할 수 있습니다.

class MyClass {
    var value: Int
    
    init(value: Int) {
        self.value = value
    }
}

var myObject = MyClass(value: 10)
myObject = MyClass(value: 30)  // 가능한 작업: 다른 객체를 할당



class MyClass {
    var value: Int = 10
    
//    init(value: Int) {
//        self.value = value
//    }
}

var myObject = MyClass()
myObject = MyClass()

 

구조체와 클래스의 차이점

  • 클래스는 참조 타입(reference type)입니다. let으로 선언한 클래스 인스턴스의 참조는 변경할 수 없지만, 인스턴스의 속성은 수정이 가능합니다.
  • 구조체는 값 타입(value type)입니다. 구조체를 let으로 선언하면, 그 구조체의 모든 속성은 변경할 수 없습니다.

구조체 객체의 불변 참조

struct MyStruct {
    var value: Int
    
    mutating func updateValue(newValue: Int) {
        self.value = newValue
    }
}

let myStruct = MyStruct(value: 10)
myStruct.value = 20  // 오류: 'myStruct'는 let으로 선언되어 속성을 변경할 수 없음
  • let으로 선언된 구조체는 속성도 변경할 수 없습니다. 만약 구조체 내에서 속성을 변경하려면, 그 속성을 수정할 메서드가 mutating으로 정의되어 있어야 하고, 이 메서드를 호출할 때는 var로 선언된 인스턴스여야 합니다.

요약

  • let으로 클래스 객체를 선언하면 객체의 참조는 변경할 수 없지만, 객체의 속성은 변경할 수 있습니다.
  • let으로 구조체 객체를 선언하면 객체의 속성 자체도 변경할 수 없습니다.
728x90