본문 바로가기

Mobile/Swift

[Swift - 문법] 프로퍼티(Property) - 1. 저장 프로퍼티

반응형

프로퍼티: 클래스, 구조체 또는 열거형 등에 관련된 값
메소드: 특정 타입에 관련된 함수

1. 프로퍼티

프로퍼티는 크게 세가지 종류의 프로퍼티가 있습니다.

1. 저장 프로퍼티: 인스턴스의 변수 또는 상수로 구조체와 클래스에서만 사용할 수 있습니다.
2. 연산 프로퍼티: 값을 저장한 것이 아닌 특정 연산을 실행한 결괏값으로 클래스, 구조체, 열거형에 쓰일 수 있습니다.
3. 타입 프로퍼티: 특정 타입에 사용되는 프로퍼티입니다.

2. 저장 프로퍼티

인스턴스의 변수 또는 상수로 구조체와 클래스에서만 사용할 수 있습니다.

(1) 기본 저장 프로퍼티

// 좌표
struct CoordinatePoint {
    var x: Int
    var y: Int
}

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

// 차량 네비게이션의 위치 정보
class CarPosition {
    var point: CoordinatePoint
    let name: String
    
    // 프로퍼티 기본값을 지정해주지 않는다면 이니셜라이저를 따로 정의해주어야 합니다.
    init(name: String, currentPoint: CoordinatePoint) {
        self.name = name
        self.point = currentPoint
    }
}

let iAmHere: CarPosition = CarPosition(name: "K5", currentPoint: myCarPoint)
print("운전자의 차량 \(iAmHere.name)의 위치는 \(iAmHere.point) 입니다.")
// 운전자의 차량 K5의 위치는 CoordinatePoint(x: 100, y: 200) 입니다.

iAmHere.point.x = 999
iAmHere.point.y = 888

print("운전자의 차량 \(iAmHere.name)의 위치는 \(iAmHere.point) 입니다.")
// 운전자의 차량 K5의 위치는 CoordinatePoint(x: 999, y: 888) 입니다.

(2) 옵셔널 저장 프로퍼티

프로퍼티를 옵셔널로 설정할 수 있습니다. 옵셔널로 설정한 후 추후에 필요할 때 값을 할당해 사용합니다. 값을 할당하지 않은 프로퍼티의 경우 nil 로 저장됩니다.

// 옵셔널 저장 프로퍼티
class UserPosition {
    var point: CoordinatePoint?
    let name: String
    
    init (name:String) {
        self.name = name
    }
}

var user1: UserPosition = UserPosition(name: "AXCE")
print(user1.point) // nil
print(user1.name) // AXCE

user1.point = CoordinatePoint(x: 10, y: 10)
print(user1.point) // Optional(__lldb_expr_30.CoordinatePoint(x: 10, y: 10))

(3) 지연 저장 프로퍼티

지연 저장 프로퍼티는 호출이 있어야 값을 초기화합니다. 이때 lazy 키워드를 사용합니다. 상수는 인스턴스가 완전히 생성되기 전에 초기화해야 하기 때문에 필요에 따라 값을 할당하는 지연 저장 프로퍼티는 변수(var) 키워드를 사용해 변수로 정의합니다. 지연 저장 프로퍼티는 주로 복잡한 클래스나 구조체를 구현할 때 많이 사용됩니다.

class LazyPosition {
    lazy var point: CoordinatePoint = CoordinatePoint(x: 0, y: 0)
    let name: String
    
    init (name: String) {
        self.name = name
    }
}

let myPosition: LazyPosition = LazyPosition(name: "Dony")

// 아래 코드로 point 에 처음 접근하게 되면 프로퍼티가 생성됩니다.
print(myPosition.point)
// CoordinatePoint(x: 0, y: 0)
반응형