πŸ“± iOS/-- Swift 5

(Swift) μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ , νƒ€μž… λ©”μ„œλ“œ (instance method, type method)

Newmon 2022. 3. 8. 17:24

μŠ€μœ„ν”„νŠΈμ—μ„œ ν•¨μˆ˜μ˜ μ’…λ₯˜

μŠ€μœ„ν”„νŠΈμ—μ„œ ν•¨μˆ˜λŠ” 크게 λ‘κ°€μ§€λ‘œ λ‚˜λˆˆλ‹€. μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ™€ νƒ€μž… λ©”μ„œλ“œμ΄λ‹€. 그리고 νƒ€μž… λ©”μ„œλ“œλŠ” λ‹€μ‹œ static method, class method둜 λ‚˜λ‰œλ‹€.

  • Instance Method
  • Type Method
    • Static Method
    • Class Method
class ExampleClass{
  func instanceMethod(){}   // μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ
  class func classMethod(){} // 클래슀 λ©”μ„œλ“œ (νƒ€μž… λ©”μ„œλ“œ)
  static func staticMethod(){} // μŠ€νƒœν‹± λ©”μ„œλ“œ (νƒ€μž… λ©”μ„œλ“œ)
}

λͺ¨μ–‘을 λ³΄λ‹ˆ 별닀λ₯Έ ν‚€μ›Œλ“œ 없이 일반적으둜 μ‚¬μš©ν•˜λ˜κ²ƒμ„ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλΌκ³  ν•œλ‹€. 그리고 class λ˜λŠ” static ν‚€μ›Œλ“œλ₯Ό 톡해 μ •μ˜λœ ν•¨μˆ˜λ₯Ό νƒ€μž… λ©”μ„œλ“œλΌκ³ ν•œλ‹€.

3가지 μ’…λ₯˜μ˜ ν•¨μˆ˜μ˜ 차이점을 μ•Œμ•„λ³΄μž.

μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ (Instance Method)

νŠΉμ • νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€(클래슀, ꡬ쑰체, μ—΄κ±°ν˜•...) 에 μ†ν•œ ν•¨μˆ˜λ₯Ό λ§ν•œλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 보톡 ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€μ™€ κ΄€λ ¨ν•œ λ™μž‘μ„ μˆ˜ν–‰ν•œλ‹€.

struct ExampleStruct{
  var count: Int = 0 {
    didSet{
      // countλΌλŠ” ν”„λ‘œνΌν‹°κ°€ λ³€κ²½λ˜λ©΄ ν˜ΈμΆœν•˜λŠ” ν”„λ‘œνΌν‹° κ°μ‹œμž
      print("countκ°€ 변경됨-> \(count)")
    }
  }
  mutating func countUp(){ // ꡬ쑰체의 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ
        self.count += 1
  }
}

그리고 λ‹Ήμ—°νžˆ μΈμŠ€ν„΄μŠ€λ₯Ό 생성해야 ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν• μˆ˜ μžˆλ‹€. . 을 톡해 μ ‘κ·Όν•˜μ—¬ μ‚¬μš©ν•˜λ©΄λœλ‹€.

var exampleStruct = ExampleStruct()
exampleStruct.countUp()
exampleStruct.countUp()
>>> countκ°€ 변경됨-> 1
>>> countκ°€ 변경됨-> 2

 

 

νƒ€μž… λ©”μ„œλ“œ (Type Method)

νƒ€μž… λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³  νƒ€μž… λ©”μ„œλ“œ μžμ²΄μ—μ„œ λ°”λ‘œ 접근이 κ°€λŠ₯ν•˜λ‹€.

Example.classMethod()

그리고 또 ν•œκ°€μ§€ μ€‘μš”ν•œμ μ€ νƒ€μž… λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ self λŠ” νƒ€μž… κ·Έ 자체λ₯Ό 가리킨닀. (μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 가리킴)

class SuperClass{
    class func printName(){
        print("this is \(self)")
    }

    static func printName2(){
        print("this is \(self)")
    }
}

class SubClass: SuperClass {
    override class func printName(){   // >>> μ˜€λ²„λΌμ΄λ“œ κ°€λŠ₯
        print("this is \(self)")
    }

    override static func printName2(){ // >>> μ˜€λ²„λΌμ΄λ“œ λΆˆκ°€ 컴파일 μ—λŸ¬
        print("this is \(self)")
    }

}

SuperClass.printName()  // μΈμŠ€ν„΄μŠ€κ°€ μ•„λ‹ˆλΌ νƒ€μž… μžμ²΄μ— μ ‘κ·Όν•˜μ—¬ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€.
SubClass.printName()        

 

 

그럼 static λ©”μ„œλ“œμ™€ staticλ©”μ„œλ“œμ˜ μ°¨μ΄λŠ” 뭘까?

class λ©”μ„œλ“œ: override κ°€λŠ₯ν•˜λ‹€.

static λ©”μ„œλ“œ: overrideκ°€ λΆˆκ°€λŠ₯ν•˜λ‹€.

μ΄λŸ¬ν•œ μ°¨μ΄μ—μ„œ λ‚˜μ˜€λŠ” 차이가 ν•œκ°€μ§€ 더 μžˆλ‹€. 상속이 λΆˆκ°€λŠ₯ν•œ structλ‚˜ enumμ—μ„œ class funcλ₯Ό μ •μ˜ν•˜λ©΄ 컴파일 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. (ν‚€μ›Œλ“œ μ΄λ¦„μ²˜λŸΌ classμ—μ„œλ§Œ μ‚¬μš©λ˜λ„€)

 

그럼 νƒ€μž… λ©”μ„œλ“œλŠ” μ–Έμ œ μ“°λ©΄ μ’‹μ„κΉŒ?

static ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것은 ν•΄λ‹Ή ν”„λ‘œνΌν‹°λ‚˜ λ©”μ„œλ“œκ°€ νƒ€μž… μžμ²΄μ™€ μ—°κ΄€λ λ•Œ μ‚¬μš©ν•˜λ©΄ λœλ‹€. λ‹€μ‹œ μ‰½κ²Œ λ§ν•˜λ©΄, μœ μΌν•œ 값을 κ°€μ Έμ•Ό ν• λ•Œ μ‚¬μš©λœλ‹€. (싱글톀 νŒ¨ν„΄μ—μ„œλ„ static 을 μ‚¬μš©ν•œλ‹€.)

예λ₯Όλ“€μ–΄ "λ³Όλ₯¨" 을 λ‹΄λ‹Ήν•˜λŠ” ν΄λž˜μŠ€μ™€ "μ˜ν™” μž¬μƒ", "μŒμ•… μž¬μƒ"을 λ‹΄λ‹Ήν•˜λŠ” ν΄λž˜μŠ€κ°€ μžˆλ‹€. λ³Όλ₯¨μ€ μ‹œμŠ€ν…œμ—μ„œ μœ μΌν•œ 값이어야 ν•˜λ©°, μ˜ν™” μž¬μƒκ³Ό μŒμ•… μž¬μƒμ„ μ˜€κ³ κ°€λ”λΌλ„ 값이 λ°”λ€Œλ©΄ μ•ˆλœλ‹€. μ΄λ•Œ λ³Όλ₯¨μ— static ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜λ©΄ μ•Œλ§žμ„κ²ƒμ΄λ‹€. 그리고 ν•΄λ‹Ή λ³Όλ₯¨μ„ μ‘°μ ˆν•˜λŠ” λ™μž‘μ„ static func mute(){} λ“±μœΌλ‘œ static ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

​ (+ 이 와쀑에 상속이 ν•„μš”ν•˜λ‹€λ©΄ class λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ λ˜κ² μ§€)