Apple/Swift

[iOS/Swift] 저장 속성(Stored Property) 이란? (1/2)

59date 2024. 8. 2. 15:52

저장 속성(Stored Property)이란

Swift에서 클래스나 구조체의 인스턴스 데이터를 "저장"하는 속성을 의미합니다. 이를 통해 인스턴스를 생성할 때 데이터를 초기화할 수 있으며, 이후에 해당  속성의 값을 읽거나 수정할 수 있습니다. 저장 속성은 인스턴스의 상태를 유지하고, 객체의 특성을 정의하는 데 중요한 역할을 합니다.

 

 

저장 속성에는 크게 세 가지 종류가 있습니다.

1. 변수 저장 속성

2. 상수 저장 속성

3. 지연 저장 속성

각 속성의 특징을 살펴보겠습니다.

 

변수 저장 속성 (Variable Stored Property), 상수 저장 속성 (Constant Stored Property)

변수 저장 속성은 var 키워드를 사용하여 정의된 속성으로, 인스턴스가 생성된 후에도 언제든 값을 변경할 수 있습니다.

var name: Type = DefaultValue

var는 변수 저장 속성을 선언하는 키워드이고,

name은 속성의 이름이며,

Type은 속성의 데이터 타입,

DefaultValue는 속성의 초기 값입니다.

 

 

상수 저장 속성은 let 키워드를 사용하여 정의된 속성으로, 인스턴스가 생성된 후에는 값을 변경할 수 없습니다.

let name: Type = DefaultValue

let은 상수 저장 속성을 선언하는 키워드이고

나머지 설명은 변수 저장 속성 설명과 동일합니다.

 

 

클래스를 만들어서 저장 속성을 확인해 봅시다.

class Student {
    let name: String = "hoon"
    var grade: Int = 5
}

let으로 선언한 name은 값을 변경할 수 없고 var로 선언한 grade는 언제든 값을 변경할 수 있다.

 

let s = Student()
s.name
s.grade

Student 클래스의 인스턴스를 생성하여 s라는 상수에 할당합니다. s를 통해 Student 클래스의 속성에 접근할 수 있게 됩니다.

인스턴스 s의 name과 grade 속성에 접근합니다.

 

 

만약 값을 변경하고 싶다면

s.grade = 6
s.name = "New"

속성에 접근 한 다음에 새로운 값 30을 저장하면 된다.

여기서 알 수 있는 점은 grade 속성을 var로 선언했기에 변수 저장 속성이므로 값을 변경할 수 있는 것이다.

만약 let으로 선언 한 name의 값을 변경하려고 한다면 Cannot assign to property: 'name' is a 'let' constant 오류가 뜬다. 

 

오류를 해석해 보면 

“Cannot assign to property”: 속성의 값을 변경할 수 없다는 의미입니다.

”‘name’ is a ‘let’ constant”: name 속성이 let으로 선언되었기 때문에 상수로 취급되며, 초기화 후에는 값을 변경할 수 없다는 뜻입니다.

 

 

만약 동일한 코드에서 클래스 대신 구조체를 사용하게 된다면?

struct Student {
    let name: String = "hoon"
    var grade: Int = 5
}

let s = Student()
s.name
s.grade

s.grade = 6

클래스에서 구조체로 변경했을 뿐인데 Cannot assign to property: 's' is a 'let' constant라는 오류가 발생합니다.

 

 

오류를 해석해 보면 

"Cannot assign to Property": 속성에 값을 할당할 수 없다는 의미입니다.

"'s' it a 'let' constant: 여기서 's'는 변경하려는 속성을 포함하는 상수입니다. let으로 선언된 상수는 값을 변경할 수 없으므로, 이 상수에 속성을 할당하려고 하면 오류가 발생합니다.

 

해결 방법은 

var s = Student()

상수를 변수로 변경해 주면 됩니다.

 

하지만 왜 클래스에서는 상수로 선언해도 값 변경이 됐는데 변수로 선언하니까 안되는지 알아봅시다.

그 이유는 값 타입과 참조 타입에 존재합니다.

 

먼저 클래스는 참조 타입으로

 클래스 인스턴스는 메모리 특정 위치를 참조합니다. 여러 변수나 상수가 동일한 인스턴스를 참조할 수 있습니다.

 인스턴스를 상수(let)로 선언해도 그 인스턴스의 속성은 변경할 수 없습니다. 이는 같은 메모리 위치를 가리키고 있기 때문입니다.

 

다음으로 구조체는 값 타입으로

 구조체 인스턴스는 그 자체로 값을 가집니다. 인스턴스를 다른 변수에 할당하면, 그 값이 복사됩니다.

 상수(let)로 선언된 구조체 인스턴스는 불변이기 때문에, 속성을 변경하려고 하면 오류가 발생합니다.

 

 

3. 지연 저장 속성에 관한 설명은 다음 포스팅에서 이어서 하도록 하겠습니다.

 


 

잘못된 내용 혹은 오타가 있거나 더 좋은 내용 피드백은 언제나 환영입니다 :)