-
[SWIFT] 타입프로퍼티 #7iOS/SWIFT 2022. 10. 10. 16:25728x90반응형
오늘은 저번에 이어서 타입프로퍼티에 대한 내용을 포스팅 해보겠다.
타입 프로퍼티
클래스, 구조체, 열거형에서 사용되는 인스턴스가 타입 자체에 속하는 프로퍼티
이게 무슨 말인지 나도 처음에 이해가 잘 되지 않았다. 클래스, 구조체, 열거형에 사용되는 인스턴스는 저장/연산프로퍼티인데 그것이 타입 자체에 속하는 프로퍼티인 것이다. 그렇기 때문에 객체를 생성해서 그 안으로 접근이 불가능하다. 옛날에 자바를 배울 때 사용했던 클래스변수와 같은 개념인 것이다.
타입 프로퍼티의 특징
- 모든 타입이 공통적인 값을 정의하는 데 유용 EX) 싱글톤 패턴
- 저장,연산 프로퍼티 앞에 static 키워드를 붙여서 사용
- 자동으로 lazy로 작동됨(lazy 키워드를 붙일 필요는 없음)
- 저장 타입 프로퍼티일 경우 항상 초기값이 존재해야하거나 연산프로퍼티로 선언해야함
- java의 전역변수처럼 한번 메모리에 올라가면 다시 생성되지 않으며 언제 어디서든 접근 가능
위에 특징 처럼 프로퍼티 앞에 static 키워드나 class 키워드를 붙여 사용하는데 프로그램이 시작 될때 생성되는 프로퍼티임으로 언제 어디서든 접근이 가능하고, 저장/연산 프로퍼티에는 접근할 수가 없다. 애초에 저장/연산 프로퍼티보다 먼저 생성되기 때문에 존재할지 안할지 모르는 프로퍼티에 접근이 불가능한 것이다.
코드를 보자
저장/연산 프로퍼티
class Info{ let name = "콰랑" var greeting{ return "안녕하세요. 저는 " + name + "이라고 합니다." } }
타입 저장/연산 프로퍼티
class InfoType{ static let name = "콰랑" static var greeting{ return "안녕하세요. 저는 " + name + "이라고 합니다." } }
솔직히 별거는 없다. 앞에 static 키워드를 붙이는건 이외에는.. 접근 방식을 보자
print(InfoType.name) //콰랑 print(InfoType.greeting) //안녕하세요. 저는 콰랑이라고 합니다.
타입이름으로 접근하는 것을 알수 없다. 여기서 객체를 생성하여 접근하면 접근이 안된다. 위에서 얘기한 것처럼 인스턴스를 생설할 때 생기는 프로퍼티가 아니기 때문이다. 한번 메모리에 올라가고 모두가 공유할 수 있는 상태가 된것이다.
여기서는 Lazy 키워드를 이해한 상태로 봐야한다. 나중에 포스팅 하겠다. 최대한 빨리..
static은 기본적으로 lazy 동작인데 lazy는 var로 선언해야하지만 static은 var/let 모두 상관이 없다
그냥 저장/연산 프로퍼티는 타입 프로퍼티와 다르게 생성자 호출 시에만 작동이 된다. 그리고 lazy키워드는 호출 될 때 마다 변경이 될수 있기 때문에 상수로 선언이 되어있으면 안되지만 static은 여러번 호출이 아닌 한번 호출되면 그대로 메모리에 유지 되기 때문에 let으로 선언을 해도 문제가 없는 것이다.
타입 연산프로퍼티의 오버라이딩
클래스 타입에 대한 연산 타입 프로퍼티의 경우에는 class 키워드를 사용해 자식 클래스가 부모 클래스의 의 구현부를 재정의(override)할 수 있다.
단순히 static으로 선언하냐 class로 선언하냐에 차이이다.
오버라이딩이 가능한 경우
class Name{ class var name:String{ return "내 이름은 콰랑입니다." } } class NickName:Name{ override class var name:String{ return "내 별명은 멋쟁이입니다." } } print(Name.name) //내 이름은 콰랑입니다. print(NickName.name) //내 별명은 멋쟁이입니다.
오버라이딩이 불가능한 경우
class Name{ static var name:String{ return "내 이름은 콰랑입니다." } } class NickName:Name{ override static var name:String{ //error return "내 별명은 멋쟁이입니다." } } print(Name.name) print(NickName.name)
'iOS > SWIFT' 카테고리의 다른 글
[SWIFT] - 제네릭(Generic) (0) 2023.06.14 [SWIFT] Lazy #8 (1) 2022.12.19 [SWIFT] 연산프로퍼티 #6 (0) 2022.09.29 [SWIFT] 클래스/구조체 #5 (0) 2022.09.13 [SWIFT] Enum #4 (0) 2022.09.06