10-1. 프로퍼티 개념, 저장된 / 지연저장된 프로퍼티, 계산된 프로퍼티

🌈 devleeky16498·2022년 4월 15일
0

프로퍼티는 값을 특정 클래스, 구조체, 또는 열거형을 연결한다. 저장된 프로퍼티는 인스턴스의 일부로 상수와 변수값을 저장하고, 계산된 프로퍼티는 값을 저장하는 대신 계산한다. 계산된 프로퍼티는 클래스, 구조체, 열거형에서 제공되고, 저장된 프로퍼티는 클래스와 구조체에서만 제공된다. 또한 프로퍼티 는 타입 자체와도 연결될 수 있는데 이를 타입 프로퍼티라고 한다. 프로퍼티 관찰자(property observer)를 정의하여 값의 변경을 모니터링할 수 있고 이는 하위클래스가 상속하는 프로퍼티에 추가된다.

저장된 프로퍼티

  1. 가장 간단한 형식으로 저장된 프로퍼티는 특정 클래스나 구조체의 인스턴스의 부분으로 저장된 상수나 변수이다. 저장된 프로퍼티에 기본 값을 제공할 수 있고, 초기화 중 초기값을 설정하거나 수정할 수도 있다. 상수에도 할당이 가능하다.
struct FixedLengthRange {
	var firstValue : Int
    var length : Int
}

var rangeOfThreeItems = FixedLengthRange(firstValue : 0, length : 3)
rangeOIfThreeITems.firstValue = 6
//다음과 같이 값의 수정, 저장이 모두 가능하다.

let rangeOfOthers = FixedLengthRange(firstValue : 0, length : 2)
rangeOfOthers.firstValue = 1
//상수이므로 값이 변하지 않고 에러가 난다.
//구조체는 값 타입이므로 인스턴스가 상수로 선언하면 수정이 불가하다.
//클래스는 참조 타입이므로 인스턴스를 상수로 할당해도 수정이 가능하다.

지연저장된 프로퍼티

  1. 지연저장된 프로퍼티(lazy stored property)는 처음 사용되는 순간까지 초기값이 계산되지 않는 프로퍼티이다. lazy 키워드를 붙여서 나타낸다.이 때 인스턴스 초기화가 완료된 후에도 초기값이 없을 수 있으므로 지연 프로퍼티는 var 키워드를 사용해서 변수로 선언해야 한다. 프로퍼티 상수는 초기화 완료 전에 항상 값이 있어야 하므로 lazy로 선언할 수 없다. 이는 인스턴스 초기화 완료까지 알 수 없는 값이 외부요인에 의해 달라질 때 사용하기 좋다.
class DataImporter {
	var filename = "data.text"
}

class DataManager {
	lazy var importer = DataImporter()
    var data = [String]()
}

let manager = DataManager()
manager.data.append("some Data")
manager.data.append("some more Data")

print(manager.importer.filename)
//"data.text"를 출력하게 된다. 
//위에서 lazy가 붙어 있으므로 importer 프로퍼티의 인스턴스는 
//filename 프로퍼티를 조회할 때 처음 접근 시 생성된다.

계산된 프로퍼티

  1. 저장된 프로퍼티 외에 클래스, 구조체, 열거형은 값을 실질적으로 저장하지 않는 계산된 프로퍼티를 정의 가능하다. 프로퍼티의 값을 간접적으로 조회하고 설정하는 getter와 setter를 제공한다.
struct Point {
	var x = 0.0, y = 0.0
}
// 점 구조체 정의하고 초기값을 설정함.
struct Size {
	var width = 0.0, height = 0.0
}
//사이즈 구조체 정의하고 초기값을 설정함.

struct Rect {
	var origin = Point()
    var size = Size()
    var center : Rect {
    	get {
        	let center X = origin.x + (size.width / 2)
            let center Y = origin.y + (size.height / 2)
            return Point(x : centerX, y : centerY)
        } set(newCenter) {
        	let center X = newCenter.x + (size.width / 2)
            let center Y = newCenter.y + (size.height / 2)
        }
    }
}
//Rect 구조체는 center라는 계산된 프로퍼티를 제공하는데 이를 위한 getter와 setter를 정의하게 된다.

var square = Rect(origin: Point(x: 0.0, y: 0.0), size: Size(Width : 0.0, height : 0.0))

let initialSuqreCenter = square.center
square.center = Point(x : 15.0, y : 15.0)

print("Square.origin is now at\(square.origin.x), \(square.origin.y)")
  1. 짧은 setter 선언이 가능하며, setter가 새로운 값을 설정하는데 이름을 정의하지 않았다면, newValue라는 기본 이름이 사용된다. 또한 getter는 암시적으로 표현식을 반환한다. 따라서 return 표현식을 쓰지 않아도 된다.
struct Rect {
	var origin = Point()
    var size = Size()
    var center : Rect {
    	get {
        	let center X = origin.x + (size.width / 2)
            let center Y = origin.y + (size.height / 2)
            //다음과 같이 return해주지 않아도 암시적 반환을 통해 작동한다.
        } set {
        	let center X = newValue.x + (size.width / 2)
            let center Y = newValue.y + (size.height / 2)
        }
    }
}
//다음과 같이 위 예시에서 사용한 newCenter를 쓰지 않고, newValue프로퍼티를 사용하게 된다.

읽기 전용 계산된 프로퍼티

  1. setter가 없고 getter만 있는 계산된 프로퍼티는 읽기 전용 계산된 프로퍼티라고 한다. 이는 항상 값을 반환하고 점 구문으로 접근 가능ㅎ나, 다른 값 설정이 안된다.
struct Cuboid {
	var width = 0.0, height = 0.0, depth = 0.0
    var volume : Double {
    	return width * height * depth
    }
}
//get 키워드와 그것의 중괄호를 삭제하고 간편히 선언이 가능하다.
let fourByFiveByTwo = Cuboid(width : 4.0, height : 5.0, depth : 2.0)
print(ForByFivebyTwo)
//다음과 같은경우 40을 출력한다.
profile
Welcome to Growing iOS developer's Blog! Enjoy!🔥

0개의 댓글