ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] self λŠ” μ–΄λŠ μ‹œμ λΆ€ν„° μ‚¬μš©ν•  수 μžˆμ„κΉŒ?
    iOS/🟠 Swift 2021. 1. 1. 23:45

    1μ°¨ μˆ˜μ •: 2021/06/10

     

     

    μ•ˆλ…•ν•˜μ„Έμš”. μ˜€λŠ˜μ€ self 의 μ ‘κ·Ό κ°€λŠ₯ μ‹œμ μ— λŒ€ν•΄μ„œ 적어보렀고 ν•©λ‹ˆλ‹€πŸΆ

     

    사싀 이 κΆκΈˆμ¦μ€ μ œκ°€ μŠ€μœ„ν”„νŠΈλ₯Ό 처음 μ‹œμž‘ν•  무렡 κ°€μ§€κ²Œλœ 것인데,

    κ²°λ‘ λΆ€ν„° λ§μ”€λ“œλ¦¬μžλ©΄ 이 κΆκΈˆμ¦μ€ 클래슀의 Initialization Process λ₯Ό μ΄ν•΄ν•˜λ©΄ μ™„λ²½ν•˜κ²Œ ν•΄κ²°λ©λ‹ˆλ‹€πŸ˜‚

    μ €μ˜ κ²½ν—˜μœΌλ‘œλŠ” 이 주제(Initialization Process)λ₯Ό μ•„μ£Ό κΌΌκΌΌν•˜κ²Œ μ—¬λŸ¬λ²ˆ μ½μ€ ν›„ λΉ„λ‘œμ†Œ 이해가 λ˜μ—ˆλ˜ 것 κ°™μŠ΅λ‹ˆλ‹€.

     

    κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  이 글을 적은 μ΄μœ λŠ” λ§‰νžŒ 뢀뢄을 ν•΄κ²°ν•˜κΈ° μœ„ν•΄ Initialization 전체λ₯Ό λ‹€μ‹œ 곡뢀해야할 μ‹œκ°„μ΄ μ—†μ–΄μ„œ, ad-hoc 으둜 μš°μ„  μ•Œκ³  λ„˜μ–΄κ°€λ €κ³  ν•˜μ‹œλŠ” 뢄듀을 μœ„ν•΄μ„œμž…λ‹ˆλ‹€.

    :: ad-hoc 이 무쑰건 λ‚˜μœ 것이라고 μƒκ°ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€

     

    이 κΈ€μ—μ„œλŠ” Initialization Process 의 전체 λ‚΄μš©μ„ λ‹€λ£¨μ§€λŠ” μ•Šμ§€λ§Œ, sefl 의 μ ‘κ·Ό κ°€λŠ₯ μ‹œμ μ„ μ΄ν•΄ν•˜κΈ° μœ„ν•˜μ—¬ μ‘°κΈˆμ”© λ‚΄μš©μ„ μ†Œκ°œν• κ±°μ—μš”~

     

     

     

    그럼 μ‹œμž‘ν•΄λ³Όκ²Œμš”!!πŸ‘‡πŸ»πŸ‘‡πŸ»πŸ‘‡πŸ»


    ν•œ μž₯의 그림으둜 ν‘œν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

     

    1. μΈμŠ€ν„΄μŠ€ 속성 μ΄ˆκΈ°ν™” μ‹œμ μ—μ„œλŠ” μ ‘κ·Όν•  수 μ—†λ‹€

    class Person {
      var name: String = "Park"
      
      var birthDate: String = "1994/09/15"
      
      var description: String = "My birthday is ... " + self.birthDate // μ»΄νŒŒμΌμ—λŸ¬
    }

     

    μ†μ„±μ˜ default value μ½”λ“œμ˜ 컴파일러 평가 μ‹œμ μ€

    init() 의 λ°”λ””μ—μ„œ μΈμŠ€ν„΄μŠ€ 속성에 값을 μ΄ˆκΈ°ν™”ν•˜λŠ” μ‹œμ κ³Ό λ™μΌν•©λ‹ˆλ‹€.

    :: μœ„ μ½”λ“œμ—μ„œλŠ” "Park", "1994/09/15" λ“±μ˜ 뢀뢄이 ν‰κ°€λ˜λŠ” μ‹œμ μ„ κ°€λ¦¬ν‚΅λ‹ˆλ‹€.

     

    μΈμŠ€ν„΄μŠ€ 속성에 값을 μ“°λŠ” μ‹œμ μ€ self λΌλŠ” κ°’ μžμ²΄κ°€ 아직 μ΄ˆκΈ°ν™” μ™„λ£Œλ˜κΈ° μ „μž…λ‹ˆλ‹€.

     

    이 λ•ŒλŠ” self λ₯Ό μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

     

    μ œκ°€ 이 λΆ€λΆ„μ—μ„œ ν—·κ°ˆλ Έμ—ˆλŠ”λ°,

    self 에 μ‚¬μš©ν•  수 μ—†λ‹€λŠ” ν‘œν˜„μ˜ 의미λ₯Ό μ œλŒ€λ‘œ μ•„λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

     

    그리고 μ•„λž˜μ™€ 같은 μ½”λ“œλŠ”  self λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ•„λ‹Œκ°€? λΌλŠ” 것이 제 의문의 ν•΅μ‹¬μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

    init() {
      self.name = "Hasiguchi"
      self.date = "1998/06/24"
      
      super.init()
    }

     

     self κ°€ μ½”λ“œμ— λͺ…λ°±νžˆ μ ν˜€ 있기 λ•Œλ¬Έμ— μ €λŠ” μ²˜μŒμ— 이것이 self λ₯Ό μ‚¬μš©ν•˜λŠ” μ½”λ“œλΌκ³  λ§‰μ—°νžˆ μƒκ°ν–ˆλ˜ 것 κ°™μŠ΅λ‹ˆλ‹€.

     

    ν•˜μ§€λ§Œ 였λ₯˜λŠ” λœ¨μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ™œμΌκΉŒμš”?

     

    결둠은 μ΄λ ‡μŠ΅λ‹ˆλ‹€.

    μœ„μ˜ μ½”λ“œλŠ” self 에 μ ‘κ·Όν•˜μ—¬ 값을 μ“°κ³  μžˆμ„ 뿐이기 λ•Œλ¬Έμ—, self λ₯Ό μ‚¬μš©ν•œλ‹€κ³  λ³Ό μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€.

     

    init() 이 호좜 된 직후에, μΈμŠ€ν„΄μŠ€λŠ” λ‚΄μš©μ€ μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ μƒνƒœμ΄μ§€λ§Œ λΆ„λͺ…ν•œ (λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλœ) μ£Όμ†Œλ₯Ό κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.

     

    μ΄λ•Œ 아직 μΈμŠ€ν„΄μŠ€κ°€ μ™„μ „νžˆ μ΄ˆκΈ°ν™” λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— self λ₯Ό μ‚¬μš©ν• μˆ˜λŠ” μ—†μ§€λ§Œ,

    λΆ„λͺ…ν•œ λ©”λͺ¨λ¦¬ μ£Όμ†ŒλŠ” 가지고 있기 λ•Œλ¬Έμ— μ ‘κ·Όν•˜μ—¬ 값은 μ΄ˆκΈ°ν™”ν•  수 μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.

     

     

    πŸ’‘lazy ν‚€μ›Œλ“œλ‘œ 속성 μ΄ˆκΈ°ν™” μ‹œμ μ„ λŠ¦μΆ”λ©΄, self λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    lazy 둜 μ •μ˜λœ 속성은 호좜 μ‹œμ μ— μ΄ˆκΈ°ν™”λ₯Ό μ‹œμž‘ν•˜κΈ° λ•Œλ¬Έμ—, κ·Έ μ‹œμ μ΄ 무쑰건 μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” μ΄ν›„μž„μ΄ 보μž₯λ©λ‹ˆλ‹€.

    μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™”κ°€ μ™„λ£Œλ˜μ—ˆλ‹€λ©΄ self λ₯Ό μ‚¬μš©ν•  수 μžˆμœΌλ―€λ‘œ lazy μ†μ„±μ—μ„œλŠ” seflλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


     

    2. init() 의 super.init() 호좜 이후에 μ ‘κ·Όν•  수 μžˆλ‹€

     

    Initailzation Process (Chain) 에 μ˜ν•˜μ—¬,

    init() 의 λ°”λ””μ—μ„œ super.init() 을 ν˜ΈμΆœν•˜λ©΄ 체인을 타고 수퍼 클래슀의 속성 및 μΈμŠ€ν„΄μŠ€κ°€ μ°¨λ‘€λ‘œ μ΄ˆκΈ°ν™” λ©λ‹ˆλ‹€.

     

    super.init() 이 λ°˜ν™˜λœ μ‹œμ μ€, self κ°€ μ™„λ²½ν•˜κ²Œ μ΄ˆκΈ°ν™”λœ μƒνƒœμž…λ‹ˆλ‹€.

     

    이후 μ½”λ“œλΆ€ν„° self λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

     

    init() {
      self.name = "Hasiguchi"
      self.date = "1998/06/24"
      
      super.init()
      
      self.someProperty = "Override Value"
      self.someInstanceMethod()
    }

     

    πŸ’‘μƒμ†κ³„μΈ΅μ΄ μ—†λŠ” 클래슀라면, λͺ¨λ“  속성이 μ΄ˆκΈ°ν™”λœ 이후 μ‹œμ μ΄λΌλ©΄ 호좜 κ°€λŠ₯ν•©λ‹ˆλ‹€

    class A {
        var test: Int
        
        init() {
            self.test = 3
            self.testFunc()
            
          // 속성이 μ „λΆ€ μ΄ˆκΈ°ν™” 되기 전에 self λ₯Ό λ¨Όμ € μ‚¬μš©ν•˜λŠ” 것은 컴파일 μ—λŸ¬
          //  self.testFunc()
          //  self.test = 3
        }
        
        func testFunc() {
            print("test")
        }
    }
    
    
    
    

     

    μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œμ—μ„œ μ ‘κ·Όν•  수 μžˆλ‹€

     

    μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλŠ” self κ°€ μ΄ˆκΈ°ν™” 된 이후 μ‹œμ λΆ€ν„° ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

     

    κ·Έλž˜μ„œ λ©”μ„œλ“œ 호좜 μ‹œμ μ—μ„œλŠ” self 의 μ΄ˆκΈ°ν™”κ°€ μ™„λ£Œλ˜μ–΄μžˆμŒμ΄ 보μž₯λ©λ‹ˆλ‹€.

     

    λ”°λΌμ„œ self λ₯Ό λ©”μ„œλ“œ λ°”λ””μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

     

     

     

     

    끝!


    πŸ€–πŸŸ’[우짱의 iOS λΈ”λ‘œκ·Έ]πŸ”΅πŸ’»

    iOSλ₯Ό κ³΅λΆ€ν•˜λ©΄μ„œ 배운 λ‚΄μš©μ„ κΈ°λ‘ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

    'iOS > 🟠 Swift' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

    Strong Reference Cycle - Memory  (0) 2021.01.03
    Weak Reference - Memory  (0) 2021.01.02
    Strong Reference - Memory  (0) 2020.12.31
    ARC - Memory  (0) 2020.12.30
    [Swift] κ°’νƒ€μž…κ³Ό μ°Έμ‘°νƒ€μž… ( Value Type vs Reference Type )  (4) 2020.12.29

    λŒ“κΈ€

μ–΄μ œλ³΄λ‹€ λ°œμ „ν•œ λ‚˜