[야곰] Swift 개념정리 - 프로퍼티

Judy·2022년 3월 16일
0

Swift 공부

목록 보기
7/11

프로퍼티

프로퍼티는 구조체, 클래스, 열거형에서 타입과 관련된 값을 표현할 때 사용한다.

물론 외부에 위치한 함수, 클로저, 타입 등에 전역/지역변수로 모두 사용 가능한다.


1. 프로퍼티의 종류

  • 저장 프로퍼티 / 연산 프로퍼티
  • 인스턴스 프로퍼티 / 타입 프로퍼티

1) 저장 프로퍼티

// 인스턴스 저장 프로퍼티
var name: String = ""
// 타입 저장 프로퍼티
static var job: String = "학생"

저장 프로퍼티는 단순히 값을 저장한다!

인스턴스 프로퍼티는 가변 프로퍼티라면 어떤 인스턴스로든 변경 가능하고, 타입 프로퍼티는 타입 자체로만 참조 및 변경이 가능하다.

2) 연산 프로퍼티

연산 프로퍼티는 단순히 값을 저장하는 것이 아니라 저장하고 사용할 때 특정 연산을 수행할 수 있다.

struct Student{
	var koreanAge = 0
	var westernAge: Int{
    	get{
        	return koreanAge - 1
        }
        set(inputValue){
        	koreanAge = inputValue + 1
        }
    }
}

var jim: Student = Student()
jim.koreanAge = 10
// jim.westernAge == 9

연산 프로퍼티는 get-set으로 이루어지는데 get읽는 부분으로 해당 프로퍼티를 불러올 때 작동하고 set쓰는 부분으로 프로퍼티를 저장할 때 수행한다.

위에서 koreanAge만 설정해줬지만 westernAge를 불러오면 get 연산을 통해 [ koreanAge - 1 ]인 9를 불러오게 된다.

반대로 westernAge를 10으로 설정하면 set 연산을 통해 koreanAge는 자동으로 11로 저장된다.

여기서 inputValue로 새로 들어올 값 이름을 지정해줬는데 매개변수 이름을 지정을 해주지 않는다면 암시적으로 newValue로 사용한다.

읽기 전용 연산 프로퍼티

연산 프로퍼티는 get만 구현된 읽기 전용 연산 프로퍼티도 가능한다.

하지만 set만 구현된 쓰기 전용 프로퍼티는 불가능하다!

var selfIntroduction: String {
	get {
		return "저는 \(self.class)\(name)입니다"
	}
}

읽기 전용 프로퍼티로 매개변수와 반환 값이 없는 메서드를 대체할 수 있다.


2. 프로퍼티 감시자


프로퍼티 감시자를 이용하면 프로퍼티 값을 변경할 때 특정 동작을 수행할 수 있다.

프로퍼티가 변하는지 계속 지켜보는 감시자 역할을 하는 것이다 😎


1) 프로퍼티 감시자 수행 시점

  • willSet - 값이 변경되기 직전에 호출
  • didSet - 값이 변경된 직후에 호출

2) 프로퍼티 감시자 특성

  • willSet, didSet 중 하나만 구현해도 가능
  • 변하는 값이 기존 값과 동일하더라도 실행
  • 연산자 프로퍼티에는 프로퍼티 감시자를 구현 불가
  • 연산 프로퍼티처럼 외부에 있는 프로퍼티에도 구현 가능
struct Money{
	var dollar: Double = 0{
    	willSet(newDollar){
        	print("\(dollar)달러에서 \(newDollar)달러로 변경될 예정입니다")
        }
        didSet(oldDollar){
        	print("\(oldDollar)달러에서 \(dollar)달러로 변경되었습니다.")
        }
    }
}

[ dollar ]라는 저장 프로퍼티에 블럭으로 프로퍼티 감시자를 구현해 dollar의 값이 변경될 때 마다 print 문을 수행하게 된다.

프로퍼티 감시자 역시 매개변수 이름을 지정해서 사용할 수 있지만 괄호 없이 아무런 매개변수를 지정하지 않아도 암시적 매개변수를 이용할 수 있다.

  • willSet의 암시적 매개변수 = newValue
  • didSet의 암시적 매개변수 = oldValue



profile
iOS Developer

0개의 댓글