#프로퍼티 Property (저장 / 연산 / 타입 / 옵저버)

minin·2021년 10월 13일
0

Swift연습장

목록 보기
1/11

🍫 notion으로 보기

* 본 포스트는 공부하며 기록용으로 작성한 포스트이기 때문에 정확하지 않은 정보가 있을 수 있습니다. 내용에 대한 피드백 환영입니다!

프로퍼티

: 클래스, 구조체, 또는 열거형 등과 값을 연결

프로퍼티 종류

먼저, 값을 저장하거나 저장된 값을 제공하는 역할을 기준으로 하면, 저장프로퍼티연산프로퍼티로 나눌 수 있다.

그리고 예외적으로 일부 프로퍼티는 클래스와 구조체 자체에 소속되어 값을 가지기도 하는데, 이를 타입 프로퍼티라고 한다. 이는 인스턴스를 생성하지 않아도 사용할 수 있다.

1. 저장 프로퍼티: 값을 저장하는 프로퍼티
2. 연산 프로퍼티: 값 저장 x, 특정 연산을 실행한 결과값
3. 타입 프로퍼티: 특정 타입에서 사용되는 프로퍼티(특정 인스턴스 x)

프로퍼티 작성 위치

  • 클래스 정의 구문 내부 & 메서드 외부에 작성
  • 메서드 내부에는 X
    - 메서드 내부에 작성된 변수나 상수는 프로퍼티가 아니라 지역 변수이다.

프로퍼티 옵저버

  • 사용자가 정의한 특정 액션과 반응하도록 처리
  • 저장 프로퍼티에 추가 가능
  • 슈퍼클래스로부터 상속받은 서브 클래스에서도 추가 가능

1. 저장 프로퍼티

: 저장 프로퍼티는 그동안 익숙하게 사용해 왔던 것들이다.

  • 클래스, 구조체에서 사용
  • 입력된 값을 저장하거나, 저장된 값을 제공하는 역할
  • 상수 및 변수를 사용해서 정의 가능

var name let number 등등.. 선언을 통해서 값을 저장해왔던 것들.

2. 연산 프로퍼티

개인적으로 이것 부터는 어려웠다!!

  • 클래스, 구조체, 열거형에서 사용
  • 특정 연산을 통해 값을 만들어 제공하는 역할
  • 변수만 사용해서 정의 가능

먼저 연산 프로퍼티는 말 그대로, 연산을 하는 것이다.

값을 저장하는 것 대신에 getter/setter를 통해 값에 직접적으로 접근을 할 수 있다.

시급을 알려주는 클래스를 예로 들어 보자.

class HourlyWage {
    // 저장 프로퍼티
    var monthlySalary: Double
    var workingHours: Double
    // 연산 프로퍼티
    var hourlyWage: Double { ... }
    
    init(monthlySalary: Double, workingHours: Double) {
        self.monthlySalary = monthlySalary
        self.workingHours = workingHours
    }
}

위의 코드에서는 값을 담고 있는 저장 프로퍼티(name, workingHours, hourlyWage)와

연산 프로퍼티 hourlyWage가 선언되어 있다.(초기화도 해 주었다)

연산 프로퍼티 hourlyWage를 조금 더 살펴 보면..

var hourlyWage: Double {
        get {
            
        }
        set {
            
        }
    }

연산 프로퍼티는 gettersetter로 이루어져있고, getter만을 사용해서 읽기 전용으로도 만들 수 있다.

먼저 get은 hourlyWage가 호출되면 실행이 되는 곳이다.

get을 통해서 한 달의 시급을 계산한 결과값을 도출할 것이기 때문에, 월급/일한 시간을 리턴해준다.

var hourlyWage: Double {
        get {
			//월급/일한 시간을 리턴
            return workingHours * hourlyWage
        }
        set {
            ...
        }
    }

그리고 set은 hourlyWage의 값이 바뀌면 실행이 되는 곳이다.

시급이 바뀌면 월급도 바뀌기 때문에, montlySalary = newValue * workingHours로 바꾸어 준다.

var hourlyWage: Double {
        get {
            return montlySalary / workingHours
        }
        set {
            montlySalary = newValue * workingHours
        }
    }

*newValue는 새로 들어온 값이다. 따로 설정해 주지 않으면 디폴트가 newValue이다.

전체 코드

class HourlyWage {
   var monthlySalary: Double
   var workingHours: Double
    var hourlyWage: Double {
        get {
            return monthlySalary / workingHours
        }
        set {
            monthlySalary = newValue * workingHours
        }
    }
   
    init(monthlySalary: Double, workingHours: Double) {
       self.monthlySalary = monthlySalary
       self.workingHours = workingHours
   }
}

→ 그럼 여기에서 하나의 인스턴스를 선언해주고, 시급을 계산해 보자!

var myHourlyWage = HourlyWage(monthlySalary: 400000, workingHours: 40)
myHourlyWage.hourlyWage

그리고 시급이 12000원으로 올랐다고 알려주고, 월급을 찍어 보면

myHourlyWage.hourlyWage = 12000
myHourlyWage.monthlySalary


→ 480,000원으로 월급도 갱신되어 있는 것을 알 수 있다!

요런식으로 사용할 수 있는 것이 바로 연산 프로퍼티이다.

3. 프로퍼티 옵저버 willSet/didSet

: 이는 프로퍼티를 감독하는 것이라고 생각하면 되는데, 언제 값이 바뀔 것인지, 또는 바뀌었는지를 감지한다.

방금 사용한 코드에서 시급hourlyWage을 달리 주었을 때, 월급monthlySalary가 바뀌었기 때문에, 월급을 선언한 부분으로 가서, 수정을 해주자.

 class MyHourlyWage {
	var monthlySalary: Double {
        willSet {
            print("월급이 \(monthlySalary)원에서 \(newValue)원으로 변경될 예정입니다.")
        }
        didSet {
            print("월급이 \(oldValue)원에서 \(monthlySalary)원으로 변경되었습니다.")
        }
    }

    var workingHours: Int
    var hourlyWage: Int { ... }
    ...
}

[결과] 월급이 400000.0에서 480000.0으로 변경될 예정입니다.

월급이 400000.0에서 480000.0으로 변경되었습니다.

willSet, didSet을 해 주면 값이 바뀜에 따라 함수가 실행되는 것을 알 수 있다.

→ 이는 tableView에서 값이 저장/삭제될 때마다 **tableView.reloadData()**를 해주어야 하는 번거로움을 줄일 수 있다.

4. 타입 프로퍼티

: 인스턴스를 생성하지 않고, 값에 접근할 수 있다.

struct YourStruct {
    static var storedTypePropeerty = "Your Value"
    static var computedTypeProperty: Int {
        return 1
    }
}

YourStruct.storedTypeProperty
YourStruct.computedTypeProperty
YourStruct.storedTypeProperty = "change value"
YourStruct.storedTypeProperty


-> YourStruct.storedTypeProperty가 "chane value"로 바뀌어 있는 것을 볼 수 있다.
이렇게 새로운 인스턴스를 생성(var myStruct = YourStrct..)하지 않고도,
값에 직접 접근할 수 있는 것을 타입 프로퍼티라고 한다.

profile
🍫 iOS 🍫 Swift

0개의 댓글