iOS 공부하는 감자

Day8) 프로퍼티, 연산 프로퍼티 본문

22 베이직 챌린지

Day8) 프로퍼티, 연산 프로퍼티

DongTaTo 2022. 1. 10. 18:27
반응형

프로퍼티

클래스, 구조체, 열거형 등에 관련된 값

 

프로퍼티 종류

  • 저장 프로퍼티
  • 연산 프로퍼티
  • 타입 프로퍼티

 

저장 프로퍼티

  • 클래스와 구조체에서 값을 저장하기 위해 선언되는 변수/상수
  • 클래스와 구조체의 인스턴스가 생성되는 시점에 모든 프로퍼티는 초기화된다. (프로퍼티가 옵셔널이 아니라면 모두 값이 들어감)
  •  
  • // name, age 모두 저장 프로퍼티 class PersonClass { let name: String = "dong" var age: Int = 25 } struct PersonStruct { let name: String = "Dong" var age: Int = 25 }
  • 지연 저장 프로퍼티 : 프로퍼티가 호출되는 시점에 초기화되는 저장 프로퍼티 (인스턴스가 생성되어도 선언만 될뿐 초기화되지 않음)
    • 지연 저장 프로퍼티는 lazy 키워드를 추가해서 표현함
    • 저장 프로퍼티로 다른 클래스나 구조체의 인스턴스를 할당해야 할 때 주로 사용된다. (인스턴스 초기화 단계에서 저장 프로퍼티에 할당될 다른 클래스나 구조체의 인스턴스가 당장 필요하지 않을 경우)
    • 지연 저장 프로퍼티를 잘 사용하면 불필요한 성능저하, 공간낭비를 줄일 수 있다.
    • struct CoordinatePosition {
          var x: Int = 0
          var y: Int = 0
      }
      
      class Position {
          lazy var point: CoordinatePosition = CoordinatePosition()
          let name: String
          
          init(name: String) {
              self.name = name
          }
      }
      
      let yagomPosition: Position = Position(name: "yagom")
      
      
      // 아래의 코드를 통해 point 프로퍼티로 처음 접근할 때
      // point 프로퍼티의 CoordinatePoint가 생성된다.
      print(yagomPosition.point)  // x: 0, y: 0

 

연산 프로퍼티

  • 저장 프로퍼티와 다르게 저장 공간을 갖지 않고, 다른 저장 프로퍼티의 값을 사용하여 연산을 하거나 전달받은 값을 다른 저장 프로퍼티에 저장하는 기능을 수행한다.
  • 연산 프로퍼티는 열거형에서 사용이 가능하다.
  • 값을 저장하는 것이 아니라 특정 상태에 따른 연산을 수행하므로 변수(var)로 선언되어야 한다.
  • 값을 직접 저장하지 않기 때문에 타입 추론이 불가능하다. (선언할 때 자료형을 명시해야됨)
  •  
  • struct Money { var won: Int = 1000 var dollar: Int { // dollar를 호출하면 won / 1000 연산을 한 값을 리턴 get { return won / 1000 } // dollar에 값을 할당하면 들어온 값에 * 1000 연산을 수행하여 won에 할당 // set(파라미터 이름) <<- newValue대신 원하는 파라미터 이름을 사용할 수 있음 set { won = newValue * 1000 } } } var money: Money = Money() print(money.dollar) // 1 money.dollar = 3 print(money.won) // 3000 print(money.dollar) // 3
  • 연산 프로퍼티는 get만 사용하여 읽기 전용으로 구현할 수 있지만 set만 사용하는 쓰기 전용으로는 구현할 수 없다.

 

타입 프로퍼티

  • 저장 타입 프로퍼티와 연산 타입 프로퍼티가 존재한다.
  • 저장 타입 프로퍼티는 타입을 선언할 당시에 원하는 값으로 항상 초기화가 되어 있어야 한다.
  • 클래스, 구조체, 열거형에서 사용되며 static 키워드를 통해 선언한다.
  • 이전까지 설명된 내용은 모두 인스턴스 프로퍼티에 대한 설명 ( 특정 타입의 인스턴스에 속하는 프로퍼티 )
  • 타입 프로퍼티는 데이터 타입 자체에 속하는 프로퍼티
  • 인스턴스 생성 여부와 관계없이 타입 프로퍼티의 값은 하나이며, 모든 인스턴스에서 공용으로 접근하고 값을 변경할 수 있는 변수 등을 정의할 때 유용하게 사용
  • 자동으로 지연 연산되어 lazy 키워드를 사용할 필요가 없다. (언젠가 호출이 되면 메모리에 올라가고 해당 프로퍼티를 공유하는 개념)
  •  
  • struct Person { let name: String var age: Int static let nickName: String = "kong" } let dong: Person = Person(name: "dong", age: 25) // dong.nickName -- 인스턴스에서는 타입 프로퍼티로 접근할 수 없음 // 해당 타입을 통해 직접 접근 가능하고, 변수일 경우 값을 변경 가능 Person.nickName // kong

 

프로퍼티 감시자

  • 프로퍼티의 값이 변경되면 적절한 작업을 취할 수 있다.
  • 프로퍼티의 값이 새로 할당될 때마다 호출된다. (할당되기 전과 값이 같더라도..)
  • willSet : 값이 저장되기 직전에 호출
  • didSet: 값이 저장된 직후에 호출
  • newValue, oldValue 대신 직접 괄호에 파라미터 이름을 넣어서 지정할 수도 있다.
  • struct Person {
        var name: String {
            willSet {
                print("현재 이름: \(name), 바꿀 이름: \(newValue)")
            }
            didSet {
                print("바꾼 이름: \(name), 바꾸기 전 이름: \(oldValue)")
            }
        }
        var age: Int
    }
    
    var dong: Person = .init(name: "dong", age: 25)
    
    dong.name = "kong"
    //현재 이름: dong, 바꿀 이름: kong
    //바꾼 이름: kong, 바꾸기 전 이름: dong

 

 

 


알고리즘

https://co-dong.tistory.com/15?category=1033755

 

예산

예산 S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄

co-dong.tistory.com

 

반응형