본문 바로가기
iOS/Swift

[iOS/Swift] 간단하게 알아보는 프로퍼티(Property)의 유형

by iosdevlime 2023. 2. 12.

쉬어가는 차원으로..

 

앞서 살펴본 클래스의 구성요소 중 내부에 선언되는 변수, 상수인

프로퍼티(Property)에 대한 내용을 다뤄볼까 합니다.

 

메모리(Memory)관련 내용과 함께 다루기엔, 다소 장황해질 수 있으므로

이번 포스팅에선 매우 간략하게 살펴보도록 하겠습니다.

 

(지연 저장 프로퍼티나 타입 프로퍼티는, 구조체 포스팅 이후에..)

 

 

 


 

 

 

저장 프로퍼티(Stored Property)

클래스나 구조체 내부에서 활용가능한, 메모리 상에 저장되는 프로퍼티

 

우선, 지금까지 살펴본 프로퍼티의 유형,

저장 프로퍼티를 먼저 짚고 넘어가겠습니다.

 

 

 

저장 프로퍼티란? 

  • 값를 저장하기 위해 선언하는 변수 혹은 상수입니다.
    • 클래스(Class)나 구조체(Struct)에서만 활용이 가능합니다!
    • 저장 프로퍼티는 메모리(Memory)상에 저장됩니다.
  • 지난번 Class 포스팅에서 다룬 예제를 다시 한번 불러서 활용해보자면..
    • 클래스 내부 accountNumber, accountBalance가 바로 저장프로퍼티 입니다.
    • 인스턴스를 생성, 프로퍼티의 초기값을 부여할 수 있습니다.
class BankAccount {
    // 저장 프로퍼티 (2개)
    var accountNumber: Int = 0
    var accountBalace: Float = 0
   
    // 초기화
    init(number: Int, balance: Float) {
        accountNumber = number
        accountBalace = balance
    }
}

// 프로퍼티 myAccount 생성 후, 초기값 설정
var myAccount = BankAccount2(number: 123456, balance: 100.0)
myAccount.accountBalace // 100.0
myAccount.accountNumber // 123456

 

 

 


 

 

 

연산 프로퍼티(Computed Property)

클래스나 구조체, 열거형(Enum)에서 활용 가능한, 연산을 실행하는 프로퍼티

 

더하고 빼고 나누고..

연산을 실행할 수 있는 프로퍼티인데, 저장이 되진 않는다구요?

 

연산 프로퍼티는, 직접 값을 가질순 없지만

다른 프로퍼티(= 저장 프로퍼티)를 활용해 연산값을 부여할 수 있습니다.

 

정의로 봐서는, 일종의 기능을 담당하는 함수역할과 가깝다고 볼 수 있겠네요.

 

 

 

연산 프로퍼티란?

  • 값를 저장연산함으로서 다른 프로퍼티의 값을 설정하거나, 저장합니다! 
    • 즉, 저장 프로퍼티와는 달리 별도의 '저장값'을 가지지 못합니다.
    • 따라서, 무조건 변수(var)로 선언이 되어야 합니다.
  • 저장하는 형식의 프로퍼티가 아니므로, 타입추론을 사용할 수 없습니다.
    • 타입 어노테이션을 통해 반드시 데이터 타입(Data Type)을 명시해야 합니다.

 


 

 

Getter(Get) - 읽기전용

  • Getter(Get)는 저장 프로퍼티의 값을 임의로 연산, 반환(Return)합니다. 
    • var(변수)와 명칭(name), 그리고 선언된 자료형 뒤에, {  } 블럭으로 감싸줍니다.
    • 내부에 get {  } 코드블럭을 활용하여 연산을 실행합니다.
  • 위 예시코드 BankAccount(클래스) 내부에 연산 프로퍼티를 선언해보자면.. 
    • 클래스 내부에 수수료(fee) 저장 프로퍼티를 선언합니다.
class BankAccount {
    var accountNumber: Int = 0
    var accountBalace: Float = 0

    // 수수료(fee) 설정
    let fee: Float = 50.0
    
    // 초기화
    init(number: Int, balance: Float) {
        accountNumber = number
        accountBalace = balance
    }
}

 

  • 현재 보유 금액에서 수수료를 제외하고자 하는 연산 프로퍼티를 생성합니다. 
    • 'balanceLessFees' 연산 프로퍼티는 현재금액-수수료 값을 반환합니다.
    • 생성된 인스턴스에서 balanceLessFees를 호출할 경우, 연산된 값이 출력됩니다.
class BankAccount {

    ...
    
    // 수수료
    let fee: Float = 50.0
    
    // 값을 저장(저장 프로퍼티)하는 프로퍼티가 아니기 때문에, 반드시 타입명시를 해줘야 함!
    var balanceLessFees: Float {
        // 아래와 같이, 연산을 수행하는 getter(get)를 추가함
        get {
            return accountBalace - fee
        }
    
    ...
}

// 인스턴스 생성
var myAccountBalance = BankAccount(accountNumber: 123, accountBalance: 100.0)
myAccountBalance.balanceLessFees // 50.0 (수수료를 제외한 금액이 연산되어 출력됨)

 

 

 


 

 

Setter(Set) - 쓰기전용

  • Setter(Set)는 저장 프로퍼티의 값을 간접적으로 설정, 반환(Return)합니다. 
    • 연산 프로퍼티 내부에 set(매개변수){   } 코드블럭을 활용합니다.
    • 해당 연산 프로퍼티의 값을 ➟ (매개변수)로 넘겨주고, 내부에서 연산을 실행합니다.
  • 즉, 연산 프로퍼티에 '초기값'을 부여하게 되면 'Set' 블럭으로 넘어가게 됩니다. 
    • 다음 예시를 통해 조금 더 자세히 살펴보도록 하겠습니다.
class BankAccount2 {
    var accountNumber: Int = 0
    var accountBalace: Float = 0

    // 수수료
    let fee: Float = 50.0
    
    var balanceLessFees: Float {
        get {
            return accountBalace - fee
        }
        
        // 아래와 같이, set키워드와 괄호()내부에 매개변수를 선언합니다
        // 함수와 동일한 형태이며, 매개변수 newBalance = balanceLessFees 입니다. 
        set(newBalance) {
            accountBalace = newBalance - fee
        }
    }
    
    ...
}

 

  • 연산 프로퍼티, Setter는 연산 프로퍼티의 값을 매개변수로 받아옵니다.   
    • 위 예시코드에 따르면, (newBalance) balanceLessFees값 입니다.
    • 해당 매개변수는, 단 하나만 존재합니다.
  • 클래스 내부에서 선언한 accountBalance(저장 프로퍼티)는 Set을 통해 다시 설정됩니다. 
    • Set, 쓰기전용 기능을 통해 저장 프로퍼티에 새로운 값이 쓰여지게 됩니다.
// 1-1. computedProperty란 저장 인스턴스를 생성
var computedProperty = BankAccount2(number: 123, balance: 100.0)

// 1-2. 저장 프로퍼티(get)에서 balanceLessFees를 반환한다면?
computedProperty.balanceLessFees // 50이란 값이 호출

// 2-1. Set를 생성, 연산 프로퍼티를 매개변수로 가져와 값에 할당해서 돌려버리면?
computedProperty.balanceLessFees = 100 // 100이란 값을 임의로 할당

// 2-2. accountBalance는 100(newValue) - 50(fee) 50이란 값이 쓰여지게(Set, write) 됨!
computedProperty.accountBalace // 50

// 2-3. 그렇다면, balanceLessFees를 다시 호출하게 되면 어떤 값이 나오게 될까?
computedProperty.balanceLessFees // 0

 

 

 


 

이번 포스팅에서는 프로퍼티의 2가지 종류인

저장/연산 프로퍼티의 간단한 개념과 활용법에 대해 알아보았습니다.

 

Lazy 저장 프로퍼티, 타입 프로퍼티, Property Observed 등  

프로퍼티에 대한 추가적인 문법내용은

 

추후 구조체 포스팅 이후에 찬찬히 다뤄보도록 하겠습니다.

 

 

 

댓글