-
[SWIFT] 연산프로퍼티 #6iOS/SWIFT 2022. 9. 29. 03:55728x90반응형
요즘 부쩍 개인적인 사정으로 번아웃이 씨게 와서 코딩이고 공부고 중단을 했었다. 그러다 보니 너무 나태해짐을 느꼈는데.. 다시 붙잡으니 너무 힘들다(코딩은 하루도 쉬면 안될 것같다..)
아.무.튼 본론으로 돌아와서 이번에 정리할 내용은 연산프로퍼티이다. swift 게시물에 첫번째로 올라온 것이 변수와 상수인데 사실 이것들은 저장프로퍼티에 속하게 된다. 하지만 프로퍼티는 종류가 있는데 오늘 자세히 알아보도록 하자.연산프로퍼티
우리는 지금까지 열거형,구조체,클래스 이렇게 3가지를 배웠다. 이것들안에 존재할 수 있는 속성을 프로퍼티라고 하는데, 저장프로퍼티의 선언은 다음과 같았다.var a:Int = 2 //변수 저장프로퍼티 let b:String = "안녕하십니까" //상수 저장프로퍼티
물론 연산프로퍼티도 이런 틀을 크게 벗어나지는 않는다.
일단 연산프로퍼티는 특정타입의 인스턴스에 사용되는 것을 뜻한다. 말로는 무슨말인지 잘 이해가 안간다. 연산프로퍼티는 말그래도 저장 프로퍼티와는 달리 연산을 하는 그 자체를 의미한다. 그럼으로 선언과 동시에 연산부분을 선언을 해줘야하는데 예제를 한번 살펴보자struct Grade{ var num:Int = 1 var trans:Grade{ get{ return Grade(num:num+7) } set(val){ num = 7+val.num } } } var gradeone:Grade = Grade() //저장프로퍼티에 접근만 하고 직접 사용하지 않을 시에는 getter 실행 print("초등학교 \(gradeone.num)학년은 \(gradeone.trans.num)살입니다.")//초등학교 1학년은 8살입니다. var grade:Grade = Grade(num:3) //저장프로퍼티에 직접 값을 설정을 할 시 setter 실행 print("초등학교 \(grade.num)학년은 \(grade.trans.num)살입니다.")//초등학교 3학년은 10살입니다.
get,set 키워드가 새롭게 보일 것이다. 연산프로퍼티는 getter(읽는 부분)와 setter(설정하는 부분) 이렇게 두가지가 존재하는데 getter에서는 말그대로 불러온 값에 어떠한 값을 따로 추가하지 않고 행위만 불러내는 것이고 setter는 불러올때 특정 값을 추가하여 연산하도록 하는 것이다. 그리하여 위 코드는 원래 존재하는 변수프로퍼티에 접근할 때 getter를 읽기만 하여 7을 더한 값을 받을 수 있는것이고, setter로 접근할 때 특정값과 setter의 7을 더하여 반환받을 수 있는 것이다. 단순 변수 선언시 할수 있는 작은 연산을 한번에 해줄 수 있는 고마운 프로퍼티이다. 이 연산프로퍼티는 사용할 때 특징과 규칙이 있는데 한번 알아보자
- 클래스, 구조체, 열거형에서 사용 가능
- var로 선언해야 함 -> 연산프로퍼티임으로 언제가 값이 변경될수 있기 때문
- 클래스, 구조체, 열거형에 값을 저장할 저장 프로퍼티가 반드시 하나 있어야 함 -> 연산을 할 항목이 필요
- get, set을 동시에 구현 가능하고, 읽기 전용으로 get만 구현 가능 -> setter만 존재할수 는 없음
- set의 매개변수를 생략한다면 반드시 newValue 키워드를 사용해야 함
- 직접적인 값을 저장하지 않고 값을 연산한 결괏값
- 타입을 지정하지 않으면 에러가 남 -> 무슨타입으로 연산이 될지 모르니 타입추론이 불가함
위에서 말한 내용중에 newValue라는 것이 있는데 setter는 우리가 값을 직접 설정해줘야하기 때문에 무조건 매개변수를 받아서 사용을 해야한다. 매개변수를 하나만 필요로 할때 우리는 newValue라는 키워드를 사용하기로 한것이다.
struct Grade{ var num:Int = 1 var trans:Grade{ get{ Grade(num:num+7) //retrun 생략 } set{ num = 7+newValue.num //newValue로 대체 } } } var gradeone:Grade = Grade() //저장프로퍼티에 접근만 하고 직접 사용하지 않을 시에는 getter 실행 print("초등학교 \(gradeone.num)학년은 \(gradeone.trans.num)살입니다.") //초등학교 1학년은 8살입니다. var grade:Grade = Grade(num:3) //저장프로퍼티에 직접 값을 설정을 할 시 setter 실행 print("초등학교 \(grade.num)학년은 \(grade.trans.num)살입니다.") //초등학교 3학년은 10살입니다.
위와 같이 할용할 수 있다. 보면 접근자(getter)에 return이 빠져있는데, 이경우는 접근자의 코드가 한줄이고 접근자의 타입과 결과값의 타입이 같으면 return은 생략할 수가 있는 것이다.
'iOS > SWIFT' 카테고리의 다른 글
[SWIFT] Lazy #8 (1) 2022.12.19 [SWIFT] 타입프로퍼티 #7 (0) 2022.10.10 [SWIFT] 클래스/구조체 #5 (0) 2022.09.13 [SWIFT] Enum #4 (0) 2022.09.06 [SWIFT] Optional #3 (0) 2022.08.29