티스토리 뷰

iOS

[Swift] 프로퍼티 (Properties)

Peppo 2021. 11. 24. 09:11
728x90

메소드에 이어서 프로퍼티에 대해 공부를 해봅시다.

 

오늘도

가즈아!!

 


프로퍼티 (Properties)

늘 그래왔듯 정의 부터 보죠!

프로퍼티는 클래스(class), 구조체(struct), 열거형(enum)과 관련한 값 입니다. 
종류로는 저장 프로퍼티 연산 프로퍼티 등이 있습니다.

 

 

프로퍼티에는 대표적으로 두가지 종류가 있어요.

이외에도 타입 프로퍼티 등 더 있긴하지만 오늘은 저장 프로퍼티를 먼저 보려고 합니다.

하나씩 파헤쳐 봅시다!

 


저장 프로퍼티 (Stored Properties) 

이름 그대로 값을 저장하고 있는 프로퍼티 입니다.

let(상수) 또는 var(변수) 키워드를 선언해서 사용할 수 있어요.

 

예제를 보면서 해볼까요?

눈으로 보는것보단 Playground에 같이 따라하는게 더 이해가 잘갑니다 :) 



저장프로퍼티는 클래스구조체에서만 사용됩니다. 

먼저 Human 클래스와 Person 구조체를 만들고,

아래 코드를 한번 훑어볼게요 !

class Human {
    let name: String = "unknown"
    var age : Int = 0
}

struct Person {
    let name: String = "unknown"
    var age: Int = 0
}

let peppo: Human? = Human()

peppo?.age = 20
peppo?.name = "roy"    // error!

 

Human과 Person 안에 name이라는 상수와 age라는 변수가 있죠. 

name은 상수 저장 프로퍼티, age는 변수 저장 프로퍼티에요.

 

저장프로퍼티는 생각보다 간단해요. 

하지만 여기서 알아봐야할게 더 있습니다. 

 

Human 이라는 클래스의 인스턴스를 호출한 peppo라는 상수가 있는데 (let 으로 호출 했어요!! 잘 봐주세요!!)

age의 값은 바꿀수 있죠 ? 

하지만 name의 값은 바꿀때 에러가 나게 됩니다. 

 

 

"당연하지 age는 var(변수)고 name은 let(상수)이니까 -ㄴ- "

(나좀 똑똑한듯) 

 

이라고 생각하신분 계신가요 ??

저는 그랬어요 ㅎㅎㅎ..

 

그럼 peppo 앞에 let인데 age가 왜 바뀌어? 라고 질문한다면 ??

👀  아.....

 

 

 

거기에 대해 대답을 하려면 클래스(Class)구조체(Struct)에 대한 개념이 필요해요. 

블로깅은 추후 작성하고 링크 남겨 놓겠습니다 .

정리완료  >> https://peppo.tistory.com/25 

 

일단 여기에 정리를 조금 해보자면 

Class는 '값을 참조' 하구요, 

Struct는 '값을 복사' 해요.

 

먼저 Class를 볼게요.

class Human {
    let name: String = "noname"
    var age : Int = 0
}

let peppo: Human? = Human()

peppo?.age = 20
peppo?.name = "roy"    // error!

 

peppo라는 인스턴스에 let을 붙이게 되면

일단 Human 안에 있는 값들 (let name, var age)은 그대로 사용됩니다.

물론 name은 상수니까 값 변경이 안되겠고, age는 변수라 변경이 되겠죠 ? 

 

다만, peppo의 자체의 인스턴스는 변경 할수 없어요.

 

peppo = Person()  // 이런식으로 말이죠
// error!

 

그럼 peppo를 var로 바꿔본다면?

 

class Human {
    let name: String = "noname"
    var age : Int = 0
}

var peppo: Human? = Human()

peppo?.age = 20
peppo?.name = "roy"    // error!

사실 class에서는 var로 바꾸어도 해당 위에서의 내용과 동일 해요!!

Class는 참조타입이기 때문에, 원본에 바로접근하기 때문이에요.

 

 

자 이번엔 Struct를 한번 볼까요?

peppo인스턴스var로 먼저 시작해볼게요.

struct Human {
    let name: String = "noname"
    var age : Int = 0
}

var peppo: Human? = Human()

peppo?.age = 20        
peppo?.name = "roy"    // error

 

자 여기까지도 위 Class에서 선언했던것처럼 상수 name만 변경이 되지않습니다.

 

이제 하이라이트 struct에서의 let을 보시죠!

 

struct Human {
    let name: String = "noname"
    var age : Int = 0
}

let peppo: Human? = Human()

peppo?.age = 20       // Cannot assign to property: 'name' is a 'let' constant
peppo?.name = "roy"   // Cannot assign to property: 'name' is a 'let' constant

 

자 이겁니다 !!

아니 Class에서는 let으로 해도 변수 age는 변경됐는데 왜 안되지? 

의 답변을 드리자면,

 

구조체(struct)는 값 타입이기 때문이에요. 

구조체의 인스턴스가 var로 선언되면 해당 구조체의 변수(var) 프로퍼티들은 변경할 수있지만, 

let으로 선언이 되면 모든 프로퍼티가 잠겨버립니다. (변경할수 없게돼요!)

 

 

 

이외에도 lazy 프로퍼티, 연산 프로퍼티등 여러종류의 프로퍼티들이 아직 남아있는데요!

다음 블로깅에 하나씩 작성해보겠습니다. 

class/ struct/ enum에 관해서두요 !! 

 


 

 

 

이해하는데 도움이 됐어요

 

https://babbab2.tistory.com/118

https://zeddios.tistory.com/243

728x90

'iOS' 카테고리의 다른 글

[Swift] Lazy Stored Properties (지연 저장 프로퍼티)  (0) 2021.11.30
[iOS] DatePicker, DateFormatter  (0) 2021.11.25
[Swift] 인스턴스 (instance) / 메서드 (methods)  (0) 2021.11.17
[iOS] Frame, Bounds 차이  (0) 2021.11.14
WebSocket 용어  (0) 2021.11.12