Swift

Property - 1

728x90

안녕하세요:)

 

오늘은 Property(속성)에 대해서 공부해보도록 하겠습니다.

1. Property

  • 프로퍼티는 구조체와 클래스에서 선언할 수 있습니다.
  • 프로퍼티는 저장 속성과 연산 프로퍼티가 있습니다.
  • 프로퍼티를 사용하기 위해서는 인스턴스가 필요합니다.
  • 인스턴스를 통해서 프로퍼티를 참조하거나 값을 할당하는데 이렇게 인스턴스에 소속되는 프로퍼티를 인스턴스 프로퍼티라고 합니다.

2. Stored Property( 저장 속성)

  • 입력된 값을 저장하거나 저장된 값을 제공하는 역할을 합니다.
  • 상수 및 변수를 사용해서 정의할 수 있습니다.
  • 클래스와 구조체에서는 사용 가능하지만, 열거형에서는 사용할 수 없습니다.
  • 클래스에서 프로퍼티 선언 시 초기값이 할당되지 않은 저장 프로퍼티는 반드시 옵셔널 타입으로 선언해야 합니다.
  • 기본 값을 지정하면 형식 추론을 통해서 자료형을 생략할 수 있습니다.
var name: Type = DefaultValue // 저장된 값을 언제든 바꿀수 있음
let name: Type = DefaultValue // 인스턴스 초기화가 완료되면 바꿀 수 없음


class User {
    let name: String = "Kim"
    var age: Int = 26
}

let u = User()
u.name // Kim
u.age // 26

struct User2 {
    let name: String = "Kim"
    var age: Int = 26
}

let u2 = User2()
u2.name
u2.age
u2.age = 30 // 에러!, 인스턴스를 상수에 저장했기 때문에 값 변경 불가, 변수로 바꿔주면 변경 가능합니다.

< Lazy Stored Property(지연 저장 속성) >

  • 지연 저장 속성은 인스턴스가 초기화된 이후에 개별적으로 초기화됩니다. 
  • 일반적으로 저장 프로퍼티는 인스턴스가 처음 생성될 때 초기화되지만, 프로퍼티 앞에 lazy라는 키워드가 붙으면 예외입니다.
  • 지연 저장 프로퍼티는 프로퍼티의 초기화를 지연시킵니다.
  • lazy가 붙은 프로퍼티는 선언만 될 뿐 초기화되지 않고 계속 대기하다가 호출되는 순간에 초기화됩니다.
  • 항상 변수 저장 속성으로 선언해야 합니다.
  • 선언 시점에 기본값을 저장해야 합니다.
class Oncreate {
    init() {
        print("Oncreate!!")
    }
}

class LazyTest {
    var base = 0
    lazy var late = Oncreate()
    
    init() {
        print("Lazy Test!")
    }
}

let lz = LazyTest()
lz.late 

3. Computed Property ( 계산, 연산 속성)

  • 메모리 공간을 가지지 않습니다. 다른 속성에 저장된 값을 읽어서 필요한 계산을 실행한 다음 리턴하거나 속성으로 전달된 값을 다른 속성에 저장합니다
  • 항상 변수로 선언해야 합니다.
  • 클래스, 구조체, 열거형에서 사용할 수 있습니다.
var name: Type { // 형식추론을 사용할 수 없고, 자료형을 명시적으로 선언해야 합니다.
    get {          // get Block
        statements
        return expr
    }
    set(name) {  // set Block 값을 저장할 때 실행됩니다. (name)은 파라미터 이름입니다.
        statements
    }
}
class Person {
    var year: Int? // 태어난 연도
    
    var thisYear: Int? { // 올해가 몇년도 인지 계산
        get {
            let df = DateFormatter()
            df.dateFormat = "yyyy"
            return Int(df.string(from: Date()))
        }
    }
}

let p = Person()
p.thisYear // 2020

< 클로저를 이용한 프로퍼티 >

class PropertyInit {
    var value01: String! = {
        print("value01 execute")
        return "value01"
    }()
    
    let value02: String! = {
        print("value02 execute")
        return "value02"
    }()
    
    lazy var value03: String! = {
        print("value03 execute")
        return "value03"
    }()
}

let p = PropertyInit()
p.value01
p.value02
p.value03
728x90

'Swift' 카테고리의 다른 글

Method  (0) 2020.11.25
Property - 2  (0) 2020.11.25
Structure and Class  (0) 2020.11.22
Enumeration  (0) 2020.11.22
Dictionary  (0) 2020.11.20