enum์— static ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋‹ค๊ฐ€ ๋ฌธ๋“ ์ด๋Ÿฐ ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. Type property์—๋Š” 2๊ฐ€์ง€ ์ข…๋ฅ˜, static, class๊ฐ€ ์žˆ๋Š”๋ฐ ๋ญ๊ฐ€ ๋‹ค๋ฅธ๊ฑฐ์ง€? ์ด์ฐธ์— ํ—ท๊ฐˆ๋ ธ๋˜ ์šฉ์–ด๊นŒ์ง€ ๋ชฝ๋•… ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•œ๋‹ค.

์ผ๋‹จ static, class์— ๋Œ€ํ•ด์„œ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‘๊ฐ€์ง€ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. method์˜ ๊ฒฝ์šฐ์™€ property์˜ ๊ฒฝ์šฐ์ด๋‹ค. ๊ฐ๊ฐ ์„ค๋ช…ํ•ด๋ณด๊ฒ ๋‹ค.

static, class Method

override ๊ฐ€๋Šฅ ์—ฌ๋ถ€์˜ ์ฐจ์ด

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด, static์˜ ๊ฒฝ์šฐ override๊ฐ€ ๋ถˆ๊ฐ€ํ•˜๊ณ , class์˜ ๊ฒฝ์šฐ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ ‡๋‹ค๋Š” ์–˜๊ธฐ๋Š” static๊ณผ class ํ‚ค์›Œ๋“œ์˜ ๊ฒฝ์šฐ struct, enum์—์„œ๋Š” ๊ฐ™์€ ๋™์ž‘์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์• ์ดˆ์— struct์™€ enum์€ override๊ฐ€ ๋ถˆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‚˜๊ฐ™์œผ๋ฉด static์„ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค.

class SampleClass {
    static func staticFunction() {
        print("๋‚œ static function์ด์–Œ")
    }
    
    class func classFunction() {
        print("๋‚œ class function์ด์–Œ")
    }
}
 
struct SampleStruct {
    // Working
    static func staticFunction() {
        print("๋‚œ static function์ด์–Œ")
    }
    // Not Working: Class methods are only allowed within classes; use 'static' to declare a static metho
    class func classFunction() {
        print("๋‚œ class function์ด์–Œ")
    }
}
 
enum SampleEnum {
    // Working
    static func staticFunction() {
        print("๋‚œ static function์ด์–Œ")
    }
    // Not Working: Class methods are only allowed within classes; use 'static' to declare a static metho
    class func classFunction() {
        print("๋‚œ class function์ด์–Œ")
    }
}

์˜ค ์—ญ์‹œ๋‚˜, ์• ํ”Œ์ด๋‹ค. ์•„์˜ˆ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๋…€์„, ์ฆ‰ struct, enum์—์„œ class ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค๋ ค๊ณ ํ•˜๋‹ˆ compile ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค. ์ข‹๋‹ค. class์—์„œ๋งŒ class keyword๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด class ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ง๋กœ override๊ฐ€ ๊ฐ€๋Šฅํ• ๊นŒ?

class SampleClass {
    // Working
    static func staticFunction() {
        print("๋‚œ static function์ด์–Œ")
    }
    // Not Working
    class func classFunction() {
        print("๋‚œ class function์ด์–Œ")
    }
}
 
 
class SubSmapleClass: SampleClass {
    override static func staticFunction() {
        // Compile Error!: Method does not override any method from its superclass
    }
    override class func classFunction() {
        // No Error!
    }
    
}

์‹ค์ œ๋กœ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

final keyword

ํ  ๊ทธ๋Ÿฌ๋ฉด class function์— final keyword๋ฅผ ์ ์–ด์„œ override๊ฐ€ ๋”์ด์ƒ ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ช…์‹œํ•˜๋ฉด ํ•ด๊ฒฐ๋˜๋Š” ๋ฌธ์ œ ์•„๋‹Œ๊ฐ€? ๋งž๋‹ค. ์ทจํ–ฅ ์ฐจ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋‚˜๊ฐ™์œผ๋ฉด ์•ˆ์“ธ ๊ฒƒ ๊ฐ™๋‹ค. ์ผ๋‹จ ์•Œ๊ณ ๋Š” ์žˆ์ž.

 
class SampleClass {
    class final func classFunction() {
        print("๋‚œ class function์ด์–Œ")
    }
}
 
 
class SubSmapleClass: SampleClass {
    override class func classFunction() {
        // Compile Error!: Class method overrides a 'final' class method
    }
}

static, class Property

์—ญ์‹œ๋‚˜ override ๊ฐ€๋Šฅ ์—ฌ๋ถ€์˜ ์ฐจ์ด

์—ญ์‹œ๋‚˜ ๊ฒฐ๋ก  ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด ๊ฐ™๋‹ค. ํ•˜์ง€๋งŒ ์กฐ๊ธˆ ์ •ํ™•ํžˆ ์•Œ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ผ๋‹จ Property๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„ํ•˜๋Š”์ง€๋ถ€ํ„ฐ ์•Œ์•„๋ณด์ž.

Property๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด๋ณด๋ฉด ์œ„์™€ ๊ฐ™๋‹ค. ๋ณ€๊ฒฝ ์—ฌ๋ถ€๋Š” let, var๋ฅผ ๋งํ•œ๋‹ค. ๊ฐ„๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฝ์šฐ์˜ ์ˆ˜ ์กฐํ•ฉ์—์„œ๋Š” ์ œ์™ธํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค. ์—ฌ๊ธฐ์„œ, ์ด ์กฐํ•ฉ์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ๋…€์„๋“ค์„ ๋งŒ๋“ค์–ด๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ๋œ๋‹ค.

  • Instance Stored Property
  • Instance Computed Property
  • Type Stored Property: ์ฃผ์ธ๊ณต
  • Type Computed Property: ์ฃผ์ธ๊ณต

์ด ๊ฐ๊ฐ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ณด๋ฉด์„œ ์ดํ•ดํ•ด ๋ณผ ๊ฒƒ์ด๋‹ค.

Instance Stored Property

class SampleClass {
    let storedImmutableProperty: String = "์ธ์Šคํ„ด์Šค ์ €์žฅ ๋ถˆ๋ณ€ ํ”„๋กœํผํ‹ฐ"
    var storedMutableProperty: String = "์ธ์Šคํ„ด์Šค ์ €์žฅ ๊ฐ€๋ณ€ ํ”„๋กœํผํ‹ฐ"
}
 
struct SampleStruct {
    let storedImmutableProperty: String = "์ธ์Šคํ„ด์Šค ์ €์žฅ ๋ถˆ๋ณ€ ํ”„๋กœํผํ‹ฐ"
    var storedMutableProperty: String = "์ธ์Šคํ„ด์Šค ์ €์žฅ ๊ฐ€๋ณ€ ํ”„๋กœํผํ‹ฐ"
}

Instance์— โ€œ์ €์žฅโ€ ๋˜๋Š” ๋…€์„์ด๋‹ค. ๋ณดํ†ต ์šฐ๋ฆฌ๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋…€์„์ด๋ผ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

Instance Computed Property

class SampleClass {
    // Not Working
    let computedImmutablePropertyNOTWORKING: String { // ๊ณ„์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” let์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
        return "์ธ์Šคํ„ด์Šค ๊ณ„์‚ฐ ๋ถˆ๋ณ€ ํ”„๋กœํผํ‹ฐ"
    }
    // Working
    var computedMutableProperty: String {
        "์ธ์Šคํ„ด์Šค ๊ณ„์‚ฐ ๊ฐ€๋ณ€ ํ”„๋กœํผํ‹ฐ"
    }
}
 
struct SampleStruct {
    // Not Working
    let computedImmutablePropertyNOTWORKING: String { // ๊ณ„์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” let์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
        "์ธ์Šคํ„ด์Šค ๊ณ„์‚ฐ ๋ถˆ๋ณ€ ํ”„๋กœํผํ‹ฐ"
    }
    // Working
    var computedMutableProperty: String {
        "์ธ์Šคํ„ด์Šค ๊ณ„์‚ฐ ๊ฐ€๋ณ€ ํ”„๋กœํผํ‹ฐ"
    }
}

๊ณ„์‚ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฒฝ์šฐ์—๋Š” ์ผ์ข…์˜ ํ•จ์ˆ˜๋ผ ์ƒ๊ฐํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. ํ˜ธ์ถœ๋˜๋Š” ์ˆœ๊ฐ„ ๊ฐ’์ด ๊ณ„์‚ฐ๋˜์–ด ๋ฆฌํ„ดํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ instance์— ๊ณ„์†ํ•ด์„œ ๋‚จ์•„์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— computed๋ผ ๋ถ€๋ฅธ๋‹ค.

ํ•˜์ง€๋งŒ ์ฃผ์˜ํ•  ์ ์ด ์žˆ๋Š”๋ฐ, computed property์˜ ๊ฒฝ์šฐ let์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

Type Stored Property

์ด์ œ ๋“œ๋””์–ด ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์‹ถ์€ ๋…€์„๋“ค์ด ๋‚˜์˜จ๋‹ค.

class SampleClass {
    // static: Working
    static let staticStoredImmutableProperty: String = "ํƒ€์ž… ์ €์žฅ ๋ถˆ๋ณ€ ํ”„๋กœํผํ‹ฐ"
    static var staticStoredMutableProperty: String = "ํƒ€์ž… ์ €์žฅ ๊ฐ€๋ณ€ ํ”„๋กœํผํ‹ฐ"
    
    // class: Not working
    // Error: Class stored properties not supported in classes;
    class let classStoredImmutableProperty: String = "ํƒ€์ž… ์ €์žฅ ๋ถˆ๋ณ€ ํ”„๋กœํผํ‹ฐ"
    class var classStoredMutableProperty: String = "ํƒ€์ž… ์ €์žฅ ๊ฐ€๋ณ€ ํ”„๋กœํผํ‹ฐ"
}
 
struct SampleStruct {
    // static: Working
    static let staticStoredImmutableProperty: String = "ํƒ€์ž… ์ €์žฅ ๋ถˆ๋ณ€ ํ”„๋กœํผํ‹ฐ"
    static var staticStoredMutableProperty: String = "ํƒ€์ž… ์ €์žฅ ๊ฐ€๋ณ€ ํ”„๋กœํผํ‹ฐ"
    
    // class: Not working
    // Error: Class properties are only allowed within classes; use 'static' to declare a static property
    class let classStoredImmutableProperty: String = "ํƒ€์ž… ์ €์žฅ ๋ถˆ๋ณ€ ํ”„๋กœํผํ‹ฐ"
    class var classStoredMutableProperty: String = "ํƒ€์ž… ์ €์žฅ ๊ฐ€๋ณ€ ํ”„๋กœํผํ‹ฐ"
}
 
enum SampleEnum {
    // static: Working
    static let staticStoredImmutableProperty: String = "ํƒ€์ž… ์ €์žฅ ๋ถˆ๋ณ€ ํ”„๋กœํผํ‹ฐ"
    static var staticStoredMutableProperty: String = "ํƒ€์ž… ์ €์žฅ ๊ฐ€๋ณ€ ํ”„๋กœํผํ‹ฐ"
    
    // class: Not working
    // Error: Class properties are only allowed within classes; use 'static' to declare a static property
    class let classStoredImmutableProperty: String = "ํƒ€์ž… ์ €์žฅ ๋ถˆ๋ณ€ ํ”„๋กœํผํ‹ฐ"
    class var classStoredMutableProperty: String = "ํƒ€์ž… ์ €์žฅ ๊ฐ€๋ณ€ ํ”„๋กœํผํ‹ฐ"
}

์ผ๋‹จ ์ •์  ํƒ€์ž… ์ฆ‰, static, class์˜ ๊ฒฝ์šฐ struct, class, enum ๋ชจ๋‘์—์„œ ์„ ์–ธ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋‘ ์ ์–ด๋ณด์•˜๋‹ค. ์‹ ๊ธฐํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”๋Š”๋ฐ, class์—์„œ๋Š” class ํ‚ค์›Œ๋“œ๋กœ Type Stored property๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†์—ˆ๋‹ค. static ํ‚ค์›Œ๋“œ๋กœ๋งŒ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค. ๋‹ค์Œ์— ๋‚˜์˜ค๊ฒ ์ง€๋งŒ computed property์˜ ๊ฒฝ์šฐ class์—์„œ class ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค.

๋˜ํ•œ class๋ผ๋Š” ์ด๋ฆ„ ๋‹ต๊ฒŒ, struct, enum์—์„œ๋Š” ์•„์˜ˆ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€ํ–ˆ๋‹ค. ์—ญ์‹œ ๋ง‰์•„๋‘๋Š”๊ฒŒ ์ข‹์€ ํŒ๋‹จ์ธ ๋“ฏ ํ•˜๋‹ค.

Type Computed Property

 
class SampleClass {
    // Not Working: ๊ณ„์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” let์ด ๋ถˆ๊ฐ€ํ•จ
    static let staticComputedImmutableProperty: String {
        return "ํƒ€์ž… ๊ณ„์‚ฐ ๋ถˆ๋ณ€ ํ”„๋กœํผํ‹ฐ"
    }
    // Working
    static var staticComputedMutableProperty: String {
        return "ํƒ€์ž… ๊ณ„์‚ฐ ๊ฐ€๋ณ€ ํ”„๋กœํผํ‹ฐ"
    }
    
    // Not Working: ๊ณ„์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” let์ด ๋ถˆ๊ฐ€ํ•จ
    class let classComputedImmutableProperty: String {
        return "ํƒ€์ž… ๊ณ„์‚ฐ ๋ถˆ๋ณ€ ํ”„๋กœํผํ‹ฐ"
    }
    // Working
    class var classComputedMutableProperty: String {
        return "ํƒ€์ž… ๊ณ„์‚ฐ ๊ฐ€๋ณ€ ํ”„๋กœํผํ‹ฐ"
    }
}
 
struct SampleStruct {
    // Not Working: ๊ณ„์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” let์ด ๋ถˆ๊ฐ€ํ•จ
    static let staticComputedImmutableProperty: String {
        return "ํƒ€์ž… ๊ณ„์‚ฐ ๋ถˆ๋ณ€ ํ”„๋กœํผํ‹ฐ"
    }
    // Working
    static var staticComputedMutableProperty: String {
        return "ํƒ€์ž… ๊ณ„์‚ฐ ๊ฐ€๋ณ€ ํ”„๋กœํผํ‹ฐ"
    }
    
    // Not Working: ๊ณ„์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” let์ด ๋ถˆ๊ฐ€ํ•จ, class keyword๋Š” class์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•จ
    class let classComputedImmutableProperty: String {
        return "ํƒ€์ž… ๊ณ„์‚ฐ ๋ถˆ๋ณ€ ํ”„๋กœํผํ‹ฐ"
    }
    // Not Working: struct์—์„œ๋Š” class type์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
    class var classComputedMutableProperty: String {
        return "ํƒ€์ž… ๊ณ„์‚ฐ ๊ฐ€๋ณ€ ํ”„๋กœํผํ‹ฐ"
    }
}
 
enum SampleEnum {
    // Not Working: ๊ณ„์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” let ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€ํ•จ
    static let staticComputedImmutableProperty: String {
        return "ํƒ€์ž… ๊ณ„์‚ฐ ๋ถˆ๋ณ€ ํ”„๋กœํผํ‹ฐ"
    }
    // Working
    static var staticComputedMutableProperty: String {
        return "ํƒ€์ž… ๊ณ„์‚ฐ ๊ฐ€๋ณ€ ํ”„๋กœํผํ‹ฐ"
    }
    
    // Not Working: ๊ณ„์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” let ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€ํ•จ
    class let classComputedImmutableProperty: String {
        return "ํƒ€์ž… ๊ณ„์‚ฐ ๋ถˆ๋ณ€ ํ”„๋กœํผํ‹ฐ"
    }
    // Not Working: enum์—์„œ๋Š” class type์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
    class var classComputedMutableProperty: String {
        return "ํƒ€์ž… ๊ณ„์‚ฐ ๊ฐ€๋ณ€ ํ”„๋กœํผํ‹ฐ"
    }
}

๊ฑฐ์˜ ๋ชจ๋“  ๋…€์„๋“ค์ด ํ˜ผํ•ฉ๋œ ํ˜•ํƒœ๋‹ค! ์ด๊ฑธ ์ดํ•ดํ–ˆ๋‹ค๋ฉด ๋ฐฉ์‹์€ ๋ชจ๋‘ ์ดํ•ดํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋งˆ๋ฌด๋ฆฌ

  • class keyword๋Š” Class type์—์„œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค. override๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • class keyword๋ฅผ class์—์„œ Type property๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด computed property๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. stored property๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด static์„ ์‚ฌ์šฉํ•˜์ž.

์ด๋ ‡๊ฒŒ ์ •๋ฆฌํ•˜๊ณ ๋‚˜๋‹ˆ ์ •์  ๋ณ€์ˆ˜๋Š” ์–ธ์ œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ์ƒ๊ฒผ๋‹ค. ๋‹ค์Œ์— ์ž‘์„ฑํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. ๋!

Reference