본문 바로가기

 𝗔𝗣𝗣𝗟𝗘/SWIFT : GRAMMAR

Swift 기초 문법 - 프로퍼티(Property)

 

 

 

 

새로 수강한 강의에 대해 정리

 

 

 

이미 정리한 내용도 있겠지만 다시 한 번 복습을 위해 작성했다 / 일부 참고

 

💡 프로퍼티 (Property)

- 프로퍼티는 클래스, 구조체 또는 열거형 등에 관련된 값

 

프로퍼티의 종류 

  • 저장 프로퍼티 
  • 지연 저장 프로퍼티 
  • 연산 프로퍼티 
  • 프로퍼티 감시자
  • 타입 프로퍼티 

 

 


 

 

💡 저장 프로퍼티 (Stored Property) 

- 저장 프로퍼티는 인스턴스의 변수, 상수를 의미

   즉, 클래스 또는 구조체의 인스턴스와 연관된 값을 저장하는 가장 단순한 개념의 프로퍼티 

  • let : 변경할 수 없는 상수(Constant)를 선언
  • var : 변경할 수 있는 변수(Variable)를 선언

 

기본적인 저장 프로퍼티 선언과 인스턴스 초기화 방법 
// 좌표
struct CoordinatePoint {
    var x: Int  // 저장 프로퍼티
    var y: Int  // 저장 프로퍼티
}

// 구조체에는 기본적으로 저장 프로퍼티를 매개변수로 갖는 이니셜라이저가 있습니다.
let eunseoPoint: CoordinatePoint = CoordinatePoint(x: 2, y: 4)

// 사람의 위치 정보
class Position {
    var point: CoordinatePoint  // 저장 프로퍼티 (변수)
    let name: String    // 저장 프로퍼티 (상수)

    // 프로퍼티 기본값을 지정해주지 않는다면 이니셜라이저를 따로 정의해주어야 합니다.
    init(name: String, currentPoint: CoordinatePoint) {
        self.name = name
        self.point = currentPoint
    }
}

// 사용자 정의 이니셜라이저를 호출해야만 합니다.
// 그렇지 않으면 프로퍼티 초기값을 할당할 수 없기 때문에 인스턴스 생성이 불가능합니다.
let eunseoPosition: Position = Position(name: "eunseo", currentPoint: eunseoPoint)

 

 

 

이니셜라이저(Initializer)란?

- 새로운 인스턴스를 생성하고 초기화하는 특별한 메서드

- 클래스, 구조체, 열거형 등의 타입에서 사용

 

일반적인 이니셜라이저 (Initializer)의 형식

init(parameters) {
    // 초기화 코드
}

 

여기서 parameters란? 

- 이니셜라이저가 호출될 때 필요한 매개변수를 가리킴

- 매개변수들은 인스턴스를 초기화하는 데 필요한 데이터나 정보를 전달하는 데 사용

- 이니셜라이저의 매개변수는 해당 타입의 속성을 초기화하는 데 사용 됨

 

예시

class Person {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

 

위의 예제에서 Person 클래스에는 두 개의 속성 name과 age가 있다.

이니셜라이저는 이 두 속성을 초기화하기 위해 name과 age라는 두 개의 매개변수를 필요로 한다. 

 

그렇기 때문에 이니셜라이저를 호출할 때는 다음과 같이 매개변수에 값을 전달하여 호출

let person = Person(name: "John", age: 30)

 

- Person 클래스의 이니셜라이저를 호출할 때 "John"과 30이라는 값이 각각 name과 age 매개변수에 전달되어 인스턴스 초기화

 

 


 

💡지연 저장 프로퍼티 (Lazy Stored Properties)

- var 키워드를 사용하여 변수로 정의

   상수는 인스턴스가 완전히 생성되기 전 초기화해야 하므로 필요할 때 값을 할당하는 지연 저장 프로퍼티와는 맞지 않음

- 호출이 있어야 값을 초기화 함

- lazy 키워드 사용 

 

예시

class DataManager {
    lazy var data: [String] = {
        // 데이터를 로드하거나 초기화하는 작업
        // 이 클로저는 처음으로 data 프로퍼티에 접근할 때 실행됩니다.
        return ["Data 1", "Data 2", "Data 3"]
    }()
}

 

위 예제에서 data 프로퍼티는 지연 저장 프로퍼티로 선언되었다. 초기화 클로저는 해당 프로퍼티에 처음으로 접근될 때 한 번만 실행되며, 이러한 특성은 특히 프로퍼티가 복잡하거나 초기화하는 데 시간이 걸리는 경우에 유용하다.

 

 


 

💡 연산 프로퍼티 (Computed Property)

- 값을 저장하는 것이 아니라 특정한 연산을 통해 값을 제공하는 프로퍼티

   이러한 프로퍼티는 특정한 값을 저장하는 것이 아니라, 값을 계산하기 위해 다른 프로퍼티나 데이터를 사용한다.

- 그때그때 계산한 값을 알려주기 때문에 변수를 나타내는 var를 사용하여 선언 (let은 불가능)

- getter와 optional한 setter를 제공

   getter: 연산된 값 반환

   setter: 값 설정

  하지만 모든 연산 프로퍼티가 setter를 가져야 하는 것은 아님, 필요에 따라 getter만을 정의할 수도 있음

 

예시

원의 넓이를 계산하는 프로퍼티를 연산 프로퍼티로 정의 

class Circle {
    var radius: Double
    
    init(radius: Double) {
        self.radius = radius
    }
    
    var area: Double { // 연산 프로퍼티
        return Double.pi * radius * radius
    }
}

 

위 예제에서 area는 연산 프로퍼티로, getter를 통해 원의 넓이를 계산하여 반환한다.

이 프로퍼티는 값을 저장하는 것이 아니라 radius 프로퍼티를 사용하여 원의 넓이를 계산하며, 연산 프로퍼티는 실제로 값을 저장하지 않지만 읽기 전용 또는 읽기/쓰기 모두 가능한 형태로 사용할 수 있다.

 

 

 

 

Recent Posts
Visits
Today
Yesterday
Archives
Calendar
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31