ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Property Observers (willSet, didSet)
    Swift 2025. 1. 27. 12:17

    안녕하세요. 그린입니다 🍏

    이번 포스팅에서는 연휴를 맞이하여 Swift 기초를 한번 정리해보려고 합니다!

    그 중에서 Property Observers의 willSet과 didSet을 간단하고 이해하기 쉽게 톺아보겠습니다 🙋🏻

     

    Swift는 객체지향과 함수형 프로그래밍의 장점 모두를 가지고 있는 프로그래밍 언어죠.

    여기서 Property Observers는 Swift의 기능 중 하나로 프로퍼티의 값 변화를 모니터링하고 그에 반응하는 코드를 작성할 수 있게 도와줍니다.

     

    그럼 본격적으로 알아보시죠 🚀


    Property Observers?

    우선 Property Observers가 무엇인지 알아볼까요?

    Property Observers는 프로퍼티의 값이 변경될 때 호출되는 특별한 메서드에요.

     

    Swift에선 두가지 Property Observers를 제공해줍니다.

    우리가 알아볼것이죠.

     

    1️⃣ willSet - 값이 저장되기 직전에 호출

    2️⃣ didSet - 값이 저장된 직후에 호출

     

    그럼 이 두가지 옵션의 차이를 알아볼까요?

     


    willSet vs didSet


    willSet

    willSet은 새로운 값이 설정되기 직전에 호출됩니다.

    이때 새로운 값은 기본적으로 newValue라는 파라미터로 접근할 수 있으며, 아래 예시처럼 커스텀 파라미터 이름을 지정할 수도 있어요.

     

    var counter: Int = 0 {
        willSet(newValue) {
            print("\(counter)에서 \(newValue) 로 변경 예정")
        }
    }

     


    didSet

    didSet은 반면 새로운 값이 설정된 직후에 호출됩니다.

    이전 값은 oldValue라는 파라미터로 접근할 수 있으며, willSet과 마찬가지로 커스텀 파라미터 이름을 지정할 수 있죠.

     

    var counter: Int = 0 {
        didSet(oldValue) {
            print("\(oldValue)에서 \(counter)로 변경됨")
        }
    }

     


    Property Observers 공식문서 살펴보기

    Swift 공식 문서에서는 Property Observers를 다음과 같이 정의하고 있어요 🙋🏻

     

    "Property observers observe and respond to changes in a property's value.
    Property observers are called every time a property's value is set, even if the new value is the same as the property's current value."

     

    즉 Property Observers가 다음과 같은 특징을 가진다고 말합니다.

     

    1️⃣ 값의 변경을 관찰하고 응답

    2️⃣ 새로운 값이 현재 값과 동일하더라도 호출

    3️⃣ 저장 프로퍼티와 오버라이딩된 연산 프로퍼티에 추가할 수 있음

     

    그럼 실제 사용 사례를 한번 만들어서 쉽게 봐볼까요?

     


    실제 사용하기

    class ShoppingCart {
        var itemCount: Int = 0 {
            willSet {
                if newValue > 10 {
                    print("대량 주문 할인이 적용될 예정입니다!")
                }
            }
            didSet {
                updateBadgeCount()
                if itemCount > oldValue {
                    animateCartIcon()
                }
                calculateTotalPrice()
            }
        }
        
        private func updateBadgeCount() {
            // 장바구니 배지 업데이트
        }
        
        private func animateCartIcon() {
            // 장바구니 아이콘 애니메이션
        }
        
        private func calculateTotalPrice() {
            // 총 가격 계산
        }
    }

     

    예시로 쇼핑 카드 객체를 만들었어요.

    willSet을 보면 itemCount가 10이 넘게 담기려고 변경되기전에 대량 주문 할일이 적용될 예정입니다!를 노출시킬 수 있죠.

    didSet은 실제 변경 후에 장바구니 배지나 아이콘 애니메이션, 가격 등의 계산을 해주는 후속 처리를 도와주죠.

     

    이런식으로 두가지의 옵션을 달리 적재적소에 사용할 수 있어요 😄

     


    주의사항 & 제한사항

    주의할 점과 제한사항에 대해 알아보겠습니다.

     

    1️⃣ 지연 저장 프로퍼티 (lazy stored properties)에는 Property Observers를 추가할 수 없음

    2️⃣ Property Observers내에서 같은 프로퍼티의 값을 변경하면 무한 루프가 발생할 수 있으니 주의

    class Warning {
        var dangerLevel: Int = 0 {
            didSet {
                // 위험! 무한 루프 발생 가능
                dangerLevel = 5 // 이렇게 하면 안 됩니다
            }
        }
    }

    3️⃣ willSet과 didSet은 초기화 중에는 호출되지 않음

     

    이렇게 알아봤는데 아주 간단하죠? ㅎㅎ

     


    마무리

    Property Observers는 Swift에서 상태 관리를 더욱 우아하게 만들어주는 강력한 도구입니다.

    willSet과 didSet을 적절히 활용하면 코드의 가독성과 유지보수성을 크게 향상시킬 수 있죠.

    특히, UI 업데이트, 데이터 동기화, 유효성 검사 등의 로직에서 편리하게 작용할 수 있습니다.

     

    다만 Property Observers를 사용할 때는 항상 성능과 부작용을 고려해야하고 필요한 경우에만 적절히 사용해야 됩니다.

    오히려 과도한 사용은 코드의 복잡성을 증가시키고 디버깅을 어렵게 만들기에 유의해야 합니다 ☝️

     


    레퍼런스

     

    Documentation

     

    docs.swift.org

Designed by Tistory.