iOS/Swift

프로퍼티 4편 (타입 프로퍼티)

밤새는 탐험가89 2024. 1. 25. 15:53

 

타입 프로퍼티 

타입을 미리 정의하고, 해당 타입의 인스턴스가 생성되었을 때

사용하는 프로퍼티가 아닌, 

타입 자체에 속하는 프로퍼티를 타입 프로퍼티라고 함 

 

 

클래스, 구조체, 열거형에서 사용

 

 

인스턴스의 생성 여부와 상관없이

타입 프로퍼티의 값1개

 

타입 프로퍼티를 타입으로 하는 모든 인스턴스가 공통으로 사용하는 값 

모든 인스턴스에서 공용으로 접근하고 값을 변경할 수 있는 변수 등을 정의할 때 유용

(싱글톤)

 

 

타입 프로퍼티저장 타입 프로퍼티, 연산 타입 프로퍼티가 있음

 

 

저장 타입 프로퍼티

변수, 상수로 정의 가능 및

선언할 당시 초기값을 가지고 있어야 함 

이 때 지연 연산되는데, lazy 키워드를 붙일 필요 없음

 

 

연산 타입 프로퍼티

 변수로만 정의 

※여기서 저장, 연산 프로퍼티 앞에 "static" 키워드를 붙이면 

저장 타입, 연산 타입 프로퍼티가 됨 

 

 

타입 프로퍼티 사용

class Fruit {
    static let name: String = "좋아하는 과일?"
    static var answer: String {
        return "맛 좋은" + name
    }
}

 

 

★ 저장 타입 프로퍼티는 항상 선언할 때 초기값을 갖고 있어야 한다고 함 

그래서 한 번 초기값을 주지 않고 선언해보니 오류 발생 

 

초기값을 지정 또는 연산 타입 프로퍼티로 만들라는 오류 발생 

 

클래스로 생성된  Fruit 안의 모든 프로퍼티는 이니셜라이저를 통해 

초기화되어야 하는 게 아닌가? 싶지만 

 

타입 프로퍼티는 메모리에 올라가기만 하면, 그 뒤로는 생성되지 않고

시점, 위치 상관없이 모두 이 타입 프로퍼티에 접근할 수 있음

 

 

따라서 만약에 내가 저장 타입 프로퍼티, 여기서는 name에 접근하려면?

 

Fruit.name = "사과"
let apple: Fruit = Fruit()
print(Fruit.name)
print(Fruit.answer)

let bananaa: Fruit = Fruit()

Fruit.name = "바나나"
print(Fruit.name)
print(Fruit.answer)


// 사과
// 맛 좋은사과
// 바나나
// 맛 좋은바나나

 

 

여기서 보면 인스턴스가 생성 유무와는 상관없이 타입 프로퍼티가 매번 생성되는게 아닌

타입 프로퍼티를 부르면 메모리에 올라가고, 

그 뒤로는 어디서든 공유하는 형태

 

 

연산 타입 프로퍼티는 오버라이딩 가능 

종류에는 2가지 있음

(class VS static)

 

 

이 둘의 큰 차이점은 오버라이딩이 가능 여부 

 

 

class : 오버라이딩 가능 

class Fruit {
    class var apple: String {
        return "apple is great"
    }
}

class Food: Fruit {
    override class var apple: String {
        return "apple is not food"
    }
}


print(Fruit.apple)
print(Food.apple)

// apple is great
// apple is not food

 

 

 

static: 오버라이딩 불가능 

class Fruit {
    static var apple: String {
        return "apple is great"
    }
}

class Food: Fruit {
    override static var apple: String {   // 오류 발생
        return "apple is not food"
    }
}

 

'iOS > Swift' 카테고리의 다른 글

인스턴스 생성 및 소멸 1편  (0) 2024.01.29
메서드  (0) 2024.01.26
프로퍼티 3편 (프로퍼티 감시자)  (0) 2024.01.23
프로퍼티 2편 (연산 프로퍼티)  (0) 2024.01.22
프로퍼티 1편 (저장 프로퍼티)  (0) 2024.01.19