Skip to content

Latest commit

Β 

History

History
166 lines (116 loc) Β· 5.24 KB

Instance,Type-Method.md

File metadata and controls

166 lines (116 loc) Β· 5.24 KB

Instance λ©”μ„œλ“œμ™€ Type λ©”μ„œλ“œμ˜ 차이점을 μ„€λͺ…ν•˜μ‹œμ˜€.

μ°Έκ³ ν•œ 쒋은 κΈ€

Answer

1. μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ

μ •μ˜: νŠΉμ • νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€μ—μ„œ ν˜ΈμΆœλ˜λŠ” Method.

μ•„λž˜μ˜ μ½”λ“œλŠ” globalThing()μ΄λΌλŠ” μ „μ—­ ν•¨μˆ˜κ°€ ν•˜λ‚˜ 있고, 각각 firstInstance, secInstance λΌλŠ” μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ₯Ό 가진 FirstClass, SecondClassκ°€ μžˆλ‹€.

μ „μ—­ ν•¨μˆ˜λŠ” μ–΄λ””μ—μ„œλ“  접근이 κ°€λŠ₯ν•˜μ§€λ§Œ 클래슀 λ‚΄μ˜ λ©”μ„œλ“œλŠ” ν•΄λ‹Ή 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€. λ§Œμ•½ λ‹€λ₯Έ 클래슀의 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ³  μ‹Άλ‹€λ©΄ ν•΄λ‹Ή 클래슀λ₯Ό 상속해야 ν•œλ‹€.

// MARK: - μ „μ—­ ν•¨μˆ˜
func globalThing() -> String {
    return "λ‚˜λŠ” μ „μ—­ ν•¨μˆ˜"
}

class FirstClass {
    var something: String?
    
    // MARK: - μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ
    func firInstance() -> String {
        return "Instance!!"
    }
}

class SecondClass {
    var anything: Int?
    
    // MARK: - μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ
    func secInstance() -> String {
        return "Second Instance!!"
    }
}

print(globalThing()) // λ‚˜λŠ” μ „μ—­ ν•¨μˆ˜

var first = FirstClass()
print(first.firInstance()) // MARK: - μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ 호좜
// Result: Instance!!

var sec = SecondClass()
print(sec.secInstance()) // MARK: - μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ 호좜
// Result: Second Instance!!

μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλŠ” mutating ν‚€μ›Œλ“œμ™€λ„ 연관성이 κΉŠλ‹€. 같이 보면 μ’‹μŒ!



2. νƒ€μž… λ©”μ„œλ“œ

μ •μ˜: νƒ€μž… μžμ²΄μ—μ„œ ν˜ΈμΆœλ˜λŠ” Method.

νƒ€μž… λ©”μ„œλ“œμ˜ ν‚€μ›Œλ“œλ‘œλŠ” staticκ³Ό classκ°€ μžˆλ‹€. 이 두 ν‚€μ›Œλ“œκ°€ 뢙은 λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€μ˜ 생성 없이 μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

class ν‚€μ›Œλ“œλŠ” class μ—μ„œλ§Œ μ‚¬μš©κ°€λŠ₯ν•˜λ‹€.

  • class keyword

    • μž₯점: 동물 μšΈμŒμ†Œλ¦¬ 내기와 같은 반볡적으둜 μ‚¬μš© ν•΄μ•Όν•˜λŠ” κ²½μš°μ— μœ μš©ν•˜κ²Œ 쓰일 수 μžˆλ‹€. μΈμŠ€ν„΄μŠ€λ₯Ό λ”°λ‘œ μƒμ„±ν•˜μ§€ μ•ŠκΈ° 떄문에 λ©”λͺ¨λ¦¬μ˜ 걱정을 ν•  ν•„μš”λ„ μ—†λ‹€.

    • 단점: ν•˜μ§€λ§Œ ν™•μž₯성이 ꡬ리닀. λ‹Ήμ—°ν•œ κ°’λ“€λ‘œλ§Œ 리턴을 ν•˜κ³ , μ΄ˆκΈ°ν™”κ°€ μ—†κΈ° 떄문에 λ³€μˆ˜λ₯Ό 쓰지 λͺ»ν•œλ‹€.

    class SomeClass {
        // MARK: - Instance Method
        func useInstance() -> String {
            return "Instance!!"
        }
    
        // MARK: - Type Method
        class func getSomething() -> String {
            return "Type!!"
        }
    }
    
    var some = SomeClass()
    print(some.useInstance()) // Instance!! , μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ
    
    print(some.getSomething) // error    
    print(SomeClass.getSomething()) // "Type!!" , νƒ€μž… λ©”μ„œλ“œ
  • static keyword

    class ν‚€μ›Œλ“œμ™€μ˜ 차이점은 override κ°€λŠ₯ 여뢀이닀. class ν‚€μ›Œλ“œλŠ” ν•΄λ‹Ή 클래슀λ₯Ό 상속 λ°›μ•˜μ„ 경우 μ˜€λ²„λΌμ΄λ“œκ°€ κ°€λŠ₯ν•˜λ‹€.

    class SubClass: SomeClass {
        override class func getSomething() -> String {
            return "wow"
        }
    }
    
    print(SubClass.getSomething()) // wow

    λ˜ν•œ, class func을 ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ static func둜 override ν•˜λŠ” 것도 κ°€λŠ₯ν•˜λ‹€.

    class SubClass: SomeClass {
        override static func getSomething() -> String {
            return "wow"
        }
    }
    
    print(SubClass.getSomething()) // wow

    ν•˜μ§€λ§Œ SomeClass의 getSomething ν‚€μ›Œλ“œλ₯Ό static으둜 λ³€κ²½ν•΄μ€€λ‹€λ©΄?

    class SomeClass {
        func useInstance() -> String {
            return "Instance!!"
        }
    
        // static으둜 μ„ μ–Έ
        static func getSomething() -> String {
            return "Type!!"
        }
    }
    
    class SubClass: SomeClass {
    
        // error: Can not override static method
        override class func getSomething() -> String {
            return "wow"
        }
    }

    static methodλŠ” μ˜€λ²„λΌμ΄λ“œκ°€ λΆˆκ°€ν•˜λ‹€λŠ” 였λ₯˜ λ©”μ‹œμ§€λ₯Ό λ‚΄λΏœλŠ”λ‹€.

    class ν‚€μ›Œλ“œλ„ μ•žμ— finalν‚€μ›Œλ“œλ₯Ό λΆ™μ΄κ²Œ 되면 overrideλ₯Ό 막을 수 μžˆλ‹€.



κ΄€λ ¨ 문제

μŠ€μœ„ν”„νŠΈ Method에 κ΄€ν•œ μ„€λͺ…이닀. μ•„λž˜ 보기 μ€‘μ—μ„œ λ§žλŠ” 것을 λͺ¨λ‘ κ³ λ₯΄μ‹œμ˜€.

β‘  Instance Methods와 Type MethodsλŠ” νŠΉμ • νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€μ—μ„œ ν˜ΈμΆœλ˜λŠ” Methodλ₯Ό λœ»ν•œλ‹€.

β‘‘ Type Methods 쀑 class func을 ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ static func둜 overrideν•  수 μ—†λ‹€.

β‘’ Type Methods 쀑 static func을 ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ class func둜 overrideν•  수 μ—†λ‹€.

β‘£ Type Methods 쀑 class func은 classμ—λ§Œ 선언이 κ°€λŠ₯ν•˜λ©°, struct, enumμ—μ„œλŠ” 선언이 λΆˆκ°€λŠ₯ν•˜λ‹€.



+ mutating static은 μ™œ μ•ˆλ κΉŒ?

static λ³€μˆ˜λ‚˜ ν•¨μˆ˜λŠ” object 생성없이 μ‚¬μš©ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ mutating은 object κ·Έ 자체λ₯Ό λ°”κΎΌλ‹€λŠ” μ˜λ―Έμ΄λ―€λ‘œ 같이 μ‚¬μš©ν•  수 μ—†λ‹€.