[Swift] 프로퍼티와 프로퍼티 감시자

선주·2022년 4월 1일
0

Swift

목록 보기
6/20

📌 프로퍼티

프로퍼티의 종류

  • 저장 프로퍼티
  • 연산 프로퍼티 (var로만 선언 가능)
  • 인스턴스 프로퍼티
  • 타입 프로퍼티

프로퍼티는 구조체, 클래스, 열거형 내부에 구현할 수 있다. 다만 열거형 내부에는 연산 프로퍼티만 구현할 수 있다.

struct Student {
    // ① 인스턴스 저장 프로퍼티
    var name: String = ""
    var `class`: String = "Swift"
    var koreanAge: Int = 0
    
    // ② 인스턴스 연산 프로퍼티
    var westernAge: Int {
        get {
            return koreanAge - 1
        }
        set(inputValue) {
            koreanAge = inputValue + 1
        }
    }
    
    // ③ 읽기전용 인스턴스 연산 프로퍼티
    // func selfIntroduce() {
    // 	  print("저는 \(self.class)반 \(self.name)입니다")
    // }
    // 위의 함수를 이렇게 바꿔줌
    var selfIntroduction: String {
    	get {
        	return "저는 \(self.class)\(self.name)입니다"
        }
    }
    
    // ④ 타입 저장 프로퍼티
    static var typeDescription: String = "학생"
    
}

var me: Student = Student()
me.westernAge = 10
print("제 미국나이는 \(me.westernAge)살이고 한국나이는 \(me.koreanAge)살입니다.")
// 제 미국나이는 10살이고 한국나이는 11살입니다.

me.name = "야곰"
print(me.selfIntroduction)
// 저는 Swift반 야곰입니다.

연산 프로퍼티인 westernAge에 값을 세팅해주면 set 블록이 실행되어 koreanAge라는 프로퍼티의 값이 알아서 연산되어 할당된다. set 블록에 inputValue 처럼 들어올 값의 매개변수의 이름을 정해줄 수 있는데, 만약 지정하지 않는다면 암시적으로 newValue에 값이 할당된다. 반대로 westernAge에서 값을 꺼내갈 때는 get 블록이 실행되어 koreanAge로부터 또 연산을 해서 리턴한다.

③ 매개변수와 반환값이 없는 함수들은 읽기전용 연산 프로퍼티로 만들어줄 수 있다. 이렇게 연산 프로퍼티에 get만 구현이 되어 있으면 읽기전용! (쓰기전용은 없음)


지역/전역변수에 적용

저장 프로퍼티와 연산 프로퍼티의 기능은 함수, 메서드, 클로저, 타입 등의 외부에 위치한 지역/전역변수에도 모두 사용 가능하다.

var a: Int = 100
var b: Int = 20
var sum: Int = {
	return a + b
}
print(sum) // 300

📌 프로퍼티 감시자

struct Money {
    var currencyRate: Double = 1100 {
        willSet(newRate) {
            print("환율이 \(currencyRate)에서 \(newRate)으로 변경될 예정입니다.")
        }
        didSet(oldRate) {
            print("환율이 \(oldRate)에서 \(currencyRate)으로 변경되었습니다.")
        }
    }
}

var money = Money()
// 환율이 1100.0에서 1150.0로 변경될 예정입니다.
money.currencyRate = 1150
// 환율이 1100.0에서 1150.0로 변경되었습니다.

currencyRate 프로퍼티에 저장된 값이 변경될 때 willSet과 didSet이 호출된다.

  • willSet : 변경되기 직전에 호출. newRate(지정한 매개변수명. 디폴트 이름은 newValue)에는 변경될 값이 들어온다.
  • didSet: 변경 후에 호출. oldRate(지정한 매개변수명. 디폴트 이름은 oldValue)에는 변경 이전의 값이 들어온다.

지역/전역변수에 적용

프로퍼티 감시자의 기능은 함수, 메서드, 클로저, 타입 등의 외부에 위치한 지역/전역변수에도 모두 사용 가능하다.

var a: Int = 100 {
	willSet {
    	print("\(a)에서 \(newValue)로 변경될 예정입니다.")
    }
    didSet {
    	print("\(oldValue)에서 \(a)로 변경되었습니다.")
    }
}

// 100에서 200로 변경될 예정입니다.
a = 200
// 100에서 200로 변경되었습니다.


야곰의 스위프트 기본 문법 강좌를 수강하며 작성한 내용입니다.

profile
기록하는 개발자 👀

0개의 댓글