πŸ“’ Study/🚩 Swift

[ Swift ] μ ‘κ·Όμ œμ–΄(Access Control) #1 - 원칙과 문법

EarthSea 2024. 3. 13. 17:58

 

 

μ ‘κ·Όμ œμ–΄μ˜ κΈ°λ³Έ κ°œλ…

 

 

μ ‘κ·Όμ œμ–΄κ°€ ν•„μš”ν•œ 이유

  • μ• ν”Œμ΄ μ›ν•˜λŠ” μ½”λ“œλ₯Ό 감좜 수 있음.
  • μ½”λ“œμ˜ μ˜μ—­μ„ λΆ„λ¦¬μ‹œμΌœμ„œ, 효율적으둜 관리 κ°€λŠ₯
  • 컴파일 μ‹œκ°„ κ°μ†Œ

 

컴파일러 μž…μž₯μ—μ„œλŠ” ν•΄λ‹Ή λ³€μˆ˜κ°€ μ–΄λŠ λ²”μœ„μ—μ„œλ§Œ μ‚¬μš©ν•˜λŠ”μ§€ 인지할 수 μžˆμ–΄μ„œ 더 λΉ λ₯΄κ²Œ μˆ˜ν–‰ν•  수 μžˆλ‹€.

 

class Student {
    private var _name: String = "홍길동"
    
    func setName(_ name: String) {
        self._name = name
    }
}

var student = Student()

// student._name                 // 🚨 error: Value of type 'Student' has no member 'name'
// student._name = "EarthSea"    // 🚨 error: Value of type 'Student' has no member 'name'
student.setName("EarthSea")

 

private 둜 μ„ μ–Έλœ _name μ΄λΌλŠ” λ³€μˆ˜λ₯Ό Class λ°–μ—μ„œλŠ” 접근이 λΆˆκ°€λŠ₯ν•˜λ‹€.

setName ν•¨μˆ˜λŠ” Class 내뢀에 μžˆλŠ” μš”μ†Œμ΄λ―€λ‘œ _name μ΄λΌλŠ” λ³€μˆ˜μ— 접근이 κ°€λŠ₯ν•˜λ‹€.

μ™ΈλΆ€μ—μ„œ _name 에 μ ‘κ·Όν•˜κΈ° μœ„ν•΄μ„œλŠ” setName μ΄λΌλŠ” ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ μ ‘κ·Όν•œλ‹€. -> μ•ˆμ „μ„±μ΄ λ†’μŒ.

 

 

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

  • open : λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ μ ‘κ·Ό κ°€λŠ₯ ( 상속 / μž¬μ •μ˜ κ°€λŠ₯ )
  • public : λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ μ ‘κ·Ό κ°€λŠ₯ ( 상속 / μž¬μ •μ˜ λΆˆκ°€λŠ₯ )
  • internal : 같은 λͺ¨λ“ˆμ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯ ( default μ„€μ • )
  • fileprivate : 같은 파일 λ‚΄μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯
  • private : 같은 scopeλ‚΄μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯

 

-> μ ‘κ·Ό μ œν•œμžλ₯Ό μž‘μ„±ν•˜μ§€ μ•ŠμœΌλ©΄ 기본적으둜 internal 둜 선언이 됨.

-> open 은 ν΄λž˜μŠ€μ—μ„œλ§Œ μ‚¬μš©μ΄ κ°€λŠ₯ ( 상속과 μž¬μ •μ˜κ°€ κ°€λŠ₯ν•œ νƒ€μž…μ΄ 클래슀 뿐이기 λ•Œλ¬Έ )

 

 

λͺ¨λ“ˆμ΄λž€?
ν”„λ ˆμž„ μ›Œν¬, 라이브러리, μ•± λ“± importν•΄μ„œ μ‚¬μš©ν•  수 μžˆλŠ” μ™ΈλΆ€μ˜ μ½”λ“œ

 

 

 

μ ‘κ·Ό μ œμ–΄μ˜ κΈ°λ³Έ 원칙 / κΈ°λ³Έ 문법

 

κΈ°λ³Έ 원칙

νƒ€μž…μ€ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” λ³€μˆ˜(속성)μ΄λ‚˜, ν•¨μˆ˜(λ©”μ„œλ“œ)보닀 높은 μˆ˜μ€€μœΌλ‘œ μ„ μ–Έλ˜μ–΄μ•Όν•œλ‹€.

즉, μƒμœ„ μš”μ†Œλ³΄λ‹€ ν•˜μœ„ μš”μ†Œκ°€ 더 높은 μ ‘κ·Ό μˆ˜μ€€μ„ κ°€μ§ˆ μˆ˜λŠ” μ—†λ‹€.

 

private func sFunc(a: Int) -> Bool {
    //public var a: Int = a   // 🚨 Error : Attribute 'public' can only be used in a non-local scope
    //print(a)
    return true
}

 

sFunc 은 internal νƒ€μž…μ΄μ§€λ§Œ, λ‚΄λΆ€μ˜ a λŠ” public νƒ€μž…μœΌλ‘œ 선언이 될 수 μ—†λ‹€.

 

 

 

κΈ°λ³Έ 문법

 

νƒ€μž…

public class SomePublicClass {}
internal class SomeInternalClass {}
fileprivate class SomeFilePrivateClass {}
private class SomePrivateClass {}

 

 

λ³€μˆ˜ / ν•¨μˆ˜

public var somePublicVariable = 0
internal let someInternalConstant = 0
fileprivate func someFilePrivateFunction() {}
private func somePrivateFunction() {}

 

default

class SomeInternalClass1 {}
let someInternalConstant1 = 0

 

 

private의 κ΄€μŠ΅μ μΈ νŒ¨ν„΄

κ΄€μŠ΅μ μœΌλ‘œ μ‹€λ¬΄μ—μ„œλŠ” private둜 μ„ μ–Έλœ 속성은 λ³€μˆ˜λͺ… μ•žμ— 언더바(_)λ₯Ό ν‘œμ‹œν•œλ‹€.

 

 

μ €μž₯ μ†μ„±μ˜ μ™ΈλΆ€μ—μ„œ μ“°κΈ°λ₯Ό μ œν•œν•˜λŠ” 방법

class SomeOtherClass {
    private var _name = "이름"         // μ“°κΈ° - private
    
    var name: String {                // 읽기 - internal
        return _name
    }
}

class SomeAnotherClass {
    private(set) var name = "이름"     // 읽기 - internal / μ“°κΈ° - private
}

μ½κΈ°λŠ” internal , μ“°κΈ°λŠ” private 둜 μ„ μ–Έν•˜κ³  μ‹ΆμœΌλ©΄ private(set) 으둜 μ“°λ©΄ λœλ‹€.