Property [타입] - ehrldyd15/Swift_Skills GitHub Wiki

Property [타입]

타입프로퍼티

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

저장타입프로퍼티와 연산타입프로퍼티가 존재하며, 저장타입프로퍼티의 경우 선언할 때 원하는 값으로 항상 초기화가 되어 있어야 한다.

이는 static을 이용해서 선언하며, 자동으로 lazy로 동작한다.

class Human {
    let name: String = "ABC"     ✅ // 저장 프로퍼티
    
    var alias: String {          ✅ // 연산 프로퍼티
        return name + "은 바보"
    }
}

class Human {
    static let name: String = "ABC"     ✅ // 저장 타입 프로퍼티
    
    static var alias: String {          ✅ // 연산 타입 프로퍼티
        return name + "은 바보"
    }
}

위와 같이 저장타입프로퍼티의 경우 항상 초기값을 가진다.

그렇지 않으면 'static let' declaration requires an initializer expression or an explicitly stated getter 해당 오류가 발생한다.

(static으로 선언할 경우, initializer가 필수거나 getter/setter를 지정해야 한다.)

이유는 static으로 선언되는 저장타입프로퍼티의 경우 초기화할 때 값을 할당할 initializer가 없기 때문이다.

타입프로퍼티는 인스턴스가 생성될 떄마다 매번생성 되는 기존 프로퍼티와는 다르다.

한번 불러서 메모리에 올라가면, 그 뒤로는 생성되지 않으며 언제 어디서나 이 타입프로퍼티에 접근할 수 있다.

저장프로퍼티에서는 인스턴스를 생성하고나서 name에 접근이 가능하지만 저장연산프로퍼티에서로 생성하면 접근이 불가능 하다.

스크린샷 2022-06-15 오후 2 38 26

타입이름을 통해서만 접근이 가능하다.

이것이 왜 저장타입프로퍼티가 무조건 초기값을 가져야 하는지에 대한 답이다.

인스턴스가 생성된다고 타입프로퍼티가 매번 생성되는것이 아니라 타입프로퍼티는 누군가 호출했을떄 한번 메모리에 올라가고

그 뒤로는 어디서든 해당 프로퍼티를 공유하는 형태이다.

따라서 인스턴스 생성과는 상관이 없기 때문에

인스턴스 생성 시 불리는 initializer 또한 상관없는 내용이고,

따라서 초기값이 없을 경우 초기값을 세팅할 방법이 없기 때문에 반드시 초기값을 가져야 한다.

Human.name

이때 메모리에 올라가서 초기화 된다는 것이다.

마지막으로 오버라이딩에 대하여 알아보자

class Human {
    class var alias: String { ✅ class로 선언하여 오버라이딩 가능
        return "Human Type Property"
    }
}
 
class Person: Human {
    override class var alias: String {
        return "Person Type Property"
    }
}
 
Human.alias  // "Human Type Property"
Person.alias // "Person Type Property"

class Human {
    static var alias: String { ✅ static으로 선언하여 오버라이딩 불가능
        return "Human Type Property"
    }
}
 
class Person: Human {
    override static var alias: String {     // error! Cannot override static property
        return "Person Type Property"
    }
}

class로 선언한 프로퍼티의 경우 오버라이딩이 가능하지만

static으로 선언한 프로퍼티의 경우 오버라이딩이 불가능하다.

참고자료

https://babbab2.tistory.com/120?category=828998