iOS/Swift

[Swift] μ ‘κ·Όμ œμ–΄μž(Access Control)에 λŒ€ν•΄μ„œ

κ²½ν‘Έ 2023. 3. 15. 18:30
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš”~ 

 

μ˜€λŠ˜μ€ μ ‘κ·Όμ œμ–΄μžμ— λŒ€ν•΄μ„œ 정리해보렀고 ν•©λ‹ˆλ‹€.

 

 


 

 

μ ‘κ·Όμ œμ–΄μž

μ•žμ„œ μ„€λͺ…ν•œ λͺ¨λ“ˆκ³Ό μ†ŒμŠ€νŒŒμΌλ“±μ˜ μš”μ†Œλ“€μ—μ„œ 접근을 μ œμ–΄ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λ©° 객체지ν–₯의 νŠΉμ„± 쀑 ν•˜λ‚˜μΈ 은닉화λ₯Ό κ΅¬ν˜„ν•  수 있게 ν•΄ μ€λ‹ˆλ‹€. 

 

μ ‘κ·Όμ œμ–΄μžμ˜ μ’…λ₯˜

μ ‘κ·Όμ œμ–΄μžλŠ” 총 5가지λ₯Ό μ œκ³΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

1. open

open μ ‘κ·Ό μ œμ–΄μžλŠ” κ°€μž₯ 높은 μˆ˜μ€€μ˜ μ ‘κ·Ό μ œμ–΄μžλ‘œ, λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œλ„ ν•΄λ‹Ή ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œλ₯Ό μ„œλΈŒν΄λž˜μ‹±(subclassing)ν•˜κ±°λ‚˜ μ˜€λ²„λΌμ΄λ”©(overriding)ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 보톡 μ™ΈλΆ€ 라이브러리λ₯Ό λ§Œλ“€κ³  μ‚¬μš©ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€. open으둜 μ„ μ–Έλœ ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œλ₯Ό μƒμ†ν•˜κ±°λ‚˜ μž¬μ •μ˜ν•΄μ„œ μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

open class Animal { 
   open func bark() {
      print("으λ₯΄λ  으λ₯΄λ ")
   } 
}

class Dog: Animal {
   override open func bark() {
      print("멍멍")
   }
}

 

2. public

public μ ‘κ·Ό μ œμ–΄μžλŠ” 기본적으둜 openκ³Ό μ ‘κ·Ό μ œμ–΄ 정도가 κ°™μœΌλ‚˜ λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ μ„œλΈŒν΄λž˜μ‹±ν•˜κ±°λ‚˜ μ˜€λ²„λΌμ΄λ”©ν•  μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€.

 

public class Animal { 
   public func bark() {
      print("으λ₯΄λ  으λ₯΄λ ")
   } 
}

// λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ μž‘μ„±ν•œ μ½”λ“œλΌλ©΄ μž¬μ •μ˜ λΆˆκ°€λŠ₯
public class Dog: Animal {
   override public func bark() { // Error
      print("멍멍")
   }
}

 

3. internal

internal μ ‘κ·Ό μ œμ–΄μžλŠ” 같은 λͺ¨λ“ˆ λ‚΄μ—μ„œλŠ” μ–΄λ””μ„œλ“ μ§€ ν•΄λ‹Ή μš”μ†Œλ“€μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λͺ¨λ“ˆ μ™ΈλΆ€μ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

 

internal class Cat: Animal {
    override internal func bark() {
        print("μ•Όμ•„μ˜Ή")
    }
}

// μ™ΈλΆ€ λͺ¨λ“ˆμ΄λΌλ©΄
let cat: Cat = Cat() // Error

 

4. fileprivate

fileprivate μ ‘κ·Ό μ œμ–΄μžλŠ” 같은 파일 λ‚΄μ—μ„œλ§Œ ν•΄λ‹Ή μš”μ†Œλ“€μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€

 

fileprivate class Dog {
   fileprivate func bark() {
      print("멍멍")
   }
}

fileprivate let dog = Dog() // λ‹€λ₯Έ μ†ŒμŠ€ 파일이라면 Error
dog.bark()

 

5. private

private μ ‘κ·Ό μ œμ–΄μžλŠ” ν•΄λ‹Ή μš”μ†Œκ°€ μ„ μ–Έλœ 블둝 λ‚΄μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

class Company {
   private let developer = Developer()
    
   func writeCode() {
      developer.writeCode()
   }
}

let company: Company = Company()

company.developer.? // μ ‘κ·Ό λΆˆκ°€λŠ₯ Error

 

 

μ ‘κ·Ό μ œμ–΄μžλŠ” λͺ¨λ“ˆ, μ†ŒμŠ€ 파일, 클래슀, ꡬ쑰체, μ—΄κ±°ν˜•, 속성, ν•¨μˆ˜, λ©”μ„œλ“œ λ“± λ‹€μ–‘ν•œ μš”μ†Œμ— μ μš©λ©λ‹ˆλ‹€.

각각의 μš”μ†Œλ³„λ‘œ μ ‘κ·Όμ œμ–΄μžκ°€ μ–΄λ–»κ²Œ μ μš©λ˜λŠ”μ§€ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

λͺ¨λ“ˆ

λͺ¨λ“ˆμ€ 컴파일과 링크 κ³Όμ •μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€. ν”„λ‘œμ νŠΈ λ‚΄μ—μ„œ 각각의 ν”„λ ˆμž„μ›Œν¬, 라이브러리 등은 κ°€κ°μ˜ λͺ¨λ“ˆλ‘œ μ·¨κΈ‰λ˜λŠ”λ° μ΄λ•Œ, μ ‘κ·Ό μ œμ–΄μžκ°€ public이면 ν•΄λ‹Ή λͺ¨λ“ˆ μ™ΈλΆ€μ—μ„œλ„ μ ‘κ·Όν•  수 있으며, internal 이면 λͺ¨λ“ˆ λ‚΄λΆ€μ—μ„œλ§Œ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ†ŒμŠ€ 파일

μ†ŒμŠ€ νŒŒμΌμ€ λͺ¨λ“ˆμ„ κ΅¬μ„±ν•˜λŠ” λ‹¨μœ„μž…λ‹ˆλ‹€. ν•˜λ‚˜μ˜ λͺ¨λ“ˆμ€ μ—¬λŸ¬ 개의 μ†ŒμŠ€ 파일둜 ꡬ성될 수 μžˆμŠ΅λ‹ˆλ‹€. μ†ŒμŠ€νŒŒμΌ λ‚΄μ—μ„œ μ„ μ–Έλœ μš”μ†Œλ“€μ€ 기본적으둜 internal μ ‘κ·Ό μ œμ–΄μžλ₯Ό κ°€μ§€κ²Œ 되고, μ†ŒμŠ€ 파일 λ‚΄μ—μ„œλŠ” 자유둭게 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€λ§Œ, λ‹€λ₯Έ μ†ŒμŠ€ νŒŒμΌμ—μ„œλŠ” internal μš”μ†Œμ— μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.

 

클래슀, ꡬ쑰체, μ—΄κ±°ν˜•

클래슀, ꡬ쑰체, μ—΄κ±°ν˜•μ€ 각각의 멀버듀에 λŒ€ν•΄μ„œ μ ‘κ·Ό μ œμ–΄μžλ₯Ό μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

1. publicμ ‘κ·Ό μ œμ–΄μžλ₯Ό μ μš©ν•˜λ©΄ λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ ν•΄λ‹Ή μš”μ†Œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2. internal μ ‘κ·Ό μ œμ–΄μžλ₯Ό μ μš©ν•˜λ©΄ 같은 λͺ¨λ“ˆ λ‚΄μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3. fileprivate μ ‘κ·Ό μ œμ–΄μžλ₯Ό μ μš©ν•˜λ©΄ 같은 μ†ŒμŠ€ 파일 λ‚΄μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4. private μ ‘κ·Ό μ œμ–΄μžλŠ” ν•΄λ‹Ή 멀버가 μ •μ˜λœ 블둝 λ‚΄μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

속성, ν•¨μˆ˜, λ©”μ„œλ“œ

속성, ν•¨μˆ˜, λ©”μ„œλ“œλ„ 각각의 μ ‘κ·Ό μ œμ–΄μžλ₯Ό μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ†μ„±μ˜ 경우 publicμ ‘κ·Ό μ œμ–΄μžλ₯Ό μ μš©ν•˜λ©΄ λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ μ ‘κ·Ό κ°€λŠ₯ν•©λ‹ˆλ‹€. ν•¨μˆ˜λ‚˜ λ©”μ„œλ“œμ˜ κ²½μš°μ—λ„ λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€.

 

ν‰μ†Œμ— 은닉화λ₯Ό μœ„ν•΄ Private μ ‘κ·Όμ œμ–΄μžλ₯Ό 자주 μ‚¬μš©ν•˜λŠ”λ°

좔후에 κΈ°νšŒκ°€ λœλ‹€λ©΄ μ˜€ν”ˆμ†ŒμŠ€λ₯Ό λ§Œλ“€λ©΄μ„œ

μ—¬λŸ¬ μ ‘κ·Όμ œμ–΄μžλ₯Ό ν™œμš© 및 정리해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

그럼 이만 πŸ‘‹πŸ» πŸ‘‹πŸ» πŸ‘‹πŸ»

λ°˜μ‘ν˜•