DEV - iOS/iOS

[Swift] 스위프트 기본 문법 공부(8) - Properties

베이비코더 2022. 2. 18. 19:40
반응형

프로퍼티는 클래스, 구조체, 열거형에 있는 변수 및 속성들을 말한다.

class MyLaptop {
    let model = "MacBookPro"
    var os = "Monterey"
    var osVersion = "12.0.1"
    let chip = "AppleM1Pro"
    let memory = 16
    let displaySize = 14
}

class 내부에 선언한 변수나 상수들을 프로퍼티라고 할 수 있다.

 

Stored Property - 저장 프로퍼티

// class MyLaptop 인스턴스화
let macbook = MyLaptop()

// stored property(저장 프로퍼티)
// 값을 가져와서 사용할 수 있음
macbook.osVersion = "12.0.2"
print(macbook.model+", "+macbook.os+" ver "+macbook.osVersion)

단순하게 값을 저장하고 사용할 수 있는 프로퍼티(var 선언한 변수 혹은 let 선언한 상수)를 저장 프로퍼티라고 한다.

 

프로퍼티는 클래스를 인스턴스화를 하는 시점에 메모리에 올라가게 된다.

만약 용량이 큰 이미지를 여러 개 갖고 있거나, 외부의 파일들을 불러오는 변수를 포함하여 인스턴스화 하는 경우

한 번에 많은 데이터들이 메모리에 올라가게 되면서 부하가 많이 걸리게 될 수 있다.

이런 일을 방지하기 위해 부하가 걸릴 수 있는 프로퍼티는 처음 인스턴스화 할 때 메모리에 올리지 않고, 실제로 사용하는 시점에 메모리에 올릴 수 있다.

class 내부에서 프로퍼티를 작성할 때 lazy 키워드를 앞에 붙여서 변수를 선언하면 된다.

이 것을 lazy stored property(지연 저장 프로퍼티)라고 한다.

지연 저장 프로퍼티는 처음부터 값을 갖는 상수(let)가 아닌 변수로(var)로 선언해야 된다.

 

 

Computed Property - 계산된 프로퍼티

처음 코드 작성 시에 값을 대입하지 않고, 어떤 로직에 의해 계산되어 값이 결정되는 프로퍼티다.

class MemberInfo {
    var name = ""
    var age = 0
    
    // coumputed property의 형태
    var isAdult:Bool {
        // 이 변수가 어떻게 만들어질 것인지 작성
        // 외부에서 값을 정할 수 없음
        if age > 19 {
            return true
        }
        return false
    }
}

isAdult 변수는 성인인지 아닌지에 대한 Bool 값을 미리 세팅하지 않고,

age 변수가 19 이상인지 아닌지에 대한 계산을 하여 Bool 값을 세팅하게 된다.

MemberInfo 클래스를 인스턴스화하여 isAdult에 true 값을 그냥 세팅하게 될 경우 이렇게 오류가 나게 된다.

get-only property라는 말은 값을 setting하지 않고 오직 가져와서(get) 사용만 할 수 있다는 것을 뜻한다.

let member = MemberInfo()
// member.isAdult = true => isAdult에 값을 세팅할 수 없음

member.age = 15
member.isAdult // false 출력

member.age = 30
member.isAdult // true 출력

 

또한 computed property는 get, set 키워드를 통한 값 설정 방법이 있다.

class MemberInfo {
    // 이메일을 받으면(get) 암호화된 값으로(set) 사용하는 경우
    var tempEmail = "" // email의 값 설정을 위한 임시 변수
    var email: String {
        set {
        	// 입력받은 값은 newValue 키워드로 축약 가능
            tempEmail = newValue.hash.description // hash값으로 변환하여 출력하는 경우
        }    
        get {
            return tempEmail
        }
    }
}

member.email = "test@test.com"
member.email // test@test.com를 해쉬값으로 변환한 값 출력

입력한 이메일 값을 암호화된 값으로 사용하는 경우의 예를 들면,

email 변수 안에 get, set 키워드로 이루어진 로직을 작성하였다.

set 부분은 값을 입력받으면 그 값은 newValue에 담겨서 사용할 수 있게 제공된다.

get 부분은 return 키워드를 사용하여 값 출력에 대한 로직을 작성할 수 있다.

 

class MemberInfo {
    var isAdult:Bool {
    	// get 키워드 생략 가능
        get{
            if age > 19 {
                return true
            }
            return false
        }
    }

    var tempEmail = "" // 받고 내보낼 임시적인 변수 필요함
    var email: String {
        set {
            tempEmail = newValue.hash.description
        }
        get {
            return tempEmail
        }
    }
}

set은 기능 자체를 생략 가능하지만 get은 반드시 필요하다.

위에서 작성했던 isAdult는 set 로직은 없지만 get 기능은 필요하고,

get만 사용할 경우 키워드를 생략 가능해서 쓰인 코드이다.

 

이런 기능은 프로퍼티가 항상 수행해야 되는 로직이 있을 때 코드가 반복되는 것을 막아줄 수 있다.

왜 쓰이고 언제 쓰면 유용할지 코드를 작성할 때 잘 생각할 필요가 있다.

 

반응형