์ƒˆ์†Œ์‹

๐Ÿ“ฑ iOS/-- Swift 5

(Swift) ์ ‘๊ทผ ์ œ์–ด์ž (Access Control, Access Level)

  • -

 

์ ‘๊ทผ ์ œ์–ด์ž๋ž€?

์ฝ”๋“œ๋ผ๋ฆฌ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•  ๋•Œ ์†Œ์ŠคํŒŒ์ผ ๊ฐ„, ๋ชจ๋“ˆ ๊ฐ„ ์ ‘๊ทผ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ํŠน์ • ์ฝ”๋“œ์˜ ์„ธ๋ถ€์ ์ธ ๊ตฌํ˜„์€ ์ˆจ๊ธฐ๊ณ , ํ—ˆ์šฉ๋œ ๊ธฐ๋Šฅ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿผ ์™œ ํŒŒ์ผ ๊ฐ„, ๋ชจ๋“ˆ ๊ฐ„ ์ ‘๊ทผ์„ ์ œํ•œํ•˜๋‚˜?

OOP ํŒจ๋Ÿฌ๋‹ค์ž„์˜ “์€๋‹‰ํ™”"์™€ ๊ด€๋ จ์ด ๊นŠ๋‹ค. ์™ธ๋ถ€์—์„œ ๋ณด๊ฑฐ๋‚˜ ์ ‘๊ทผํ•˜๋ฉด ์•ˆ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•จ์ด๋‹ค.

 

์ ‘๊ทผ ๋ž˜๋ฐธ์˜ ์ข…๋ฅ˜ (Acess Levels)

์Šค์œ„ํ”„ํŠธ์—์„œ๋Š” 5๊ฐœ์˜ ์ ‘๊ทผ๋ž˜๋ฐธ์ด ์žˆ๋‹ค.. ํƒ€์ž…(ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•...)๋ฟ ์•„๋‹ˆ๋ผ, ํƒ€์ž… ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ, ๋ฉ”์„œ๋“œ, ์ด๋‹ˆ์…œ๋ผ์ด์ €, ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ์—๋„ ์ ‘๊ทผ ์ˆ˜์ค€์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Open

๊ฐ€์žฅ ๋„“์€ ๋ฒ”์œ„์ด๋‹ค. ์ง€์ •๋œ ์š”์†Œ๋Š” ์–ด๋””์„œ๋“  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. Public ๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ์•ฝ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

  • Open์€ ํด๋ž˜์Šค์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Open์—์„œ๋งŒ ํด๋ž˜์Šค๊ฐ€ ์ •์˜๋œ ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ๋„ subclassingํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Open์—์„œ๋งŒ ํด๋ž˜์Šค๊ฐ€ ์ •์˜๋œ ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ override ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Public

์Šค์œ„ํ”„ํŠธ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ๋Š” ๊ธฐ๋ณธ ์š”์†Œ๋Š” ๋ชจ๋‘ Open ๋ž˜๋ฐธ์„ ๊ฐ€์ง„ Struct์ด๋‹ค. ex)Bool, Int, String.....

  • ํด๋ž˜์Šค๊ฐ€ ์ •์˜๋œ ๋ชจ๋“ˆ ๋‚ด์—์„œ๋งŒ subclassingํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํด๋ž˜์Šค๊ฐ€ ์ •์˜๋œ ๋ชจ๋“ˆ ๋‚ด์—์„œ๋งŒ override ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Internal

  • ์š”์†Œ ์•ž์— ํ‚ค์›Œ๋“œ๋ฅผ ์“ฐ์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ์ง€์ •๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’์ด๋‹ค.
  • Internal ๋ž˜๋ฐธ์„ ๊ฐ€์ง„ ์š”์†Œ๋Š” ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ๋Š” ์–ด๋””์„œ๋“  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

FilePriavte

  • ํ•ด๋‹น ์†Œ์ŠคํŒŒ์ผ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. (๋ชจ๋“ˆ์ด ๊ฐ™์•„๋„ ๋‹ค๋ฅธ ์†Œ์ŠคํŒŒ์ผ์—์„œ๋Š” ์‚ฌ์šฉ๋ถˆ๊ฐ€)

 

private

  • ๊ฐ€์žฅ ํ•œ์ •์ ์ธ ๋ฒ”์œ„์ด๋‹ค. ํ•ด๋‹น ์š”์†Œ๋ฅผ ์ •์˜ํ•œ ๋ฒ”์œ„ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์„ ์–ธ๋œ private ์š”์†Œ๋Š” ๊ฐ™์€ ํŒŒ์ผ์ด๋”๋ผ๋„ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
class UserInfo {
    static let shared = UserInfo() // ์ด๋•Œ ๋‹จ ํ•œ๋ฒˆ๋งŒ ์ƒ์„ฑ๋œ๋‹ค.

    var id: String?
    var password: String?
    var name: String?
    private init() { } 
}

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์‚ฌ์šฉํ• ๋•Œ ๋งŽ์ด ๋ดค์—ˆ๋‹ค. ์ด๋‹ˆ์…œ๋ผ์ด์ €์— pivate๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ์ƒ์„ฑ๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ

์ฃผ์˜ํ•  ์ 

์ƒ์œ„ ์š”์†Œ๋ณด๋‹ค ํ•˜์œ„ ์š”์†Œ๊ฐ€ ๋” ๋†’์€ ์ ‘๊ทผ์ˆ˜์ค€์„ ๊ฐ€์ง€๋ฉด ์•ˆ๋œ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋ณด๊ฒŒ๋˜๋ฉด

private class EClass{ 
    public func method(){} // private ๋‚ด๋ถ€์— public ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์†Œ์šฉ์—†๋‹ค.
}

public func eMethod(_ : EClass){ // private ํด๋ž˜์Šค๋ฅผ ์ธ์ž๋กœ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.
    print("get Eclass")
}
  1. ํด๋ž˜์Šค(์ƒ์œ„์š”์†Œ)๊ฐ€ private ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์†Œ๋“œ(ํ•˜์œ„์š”์†Œ)๋„ private๋กœ ์ทจ๊ธ‰๋œ๋‹ค.
  2. eMethod ๋Š” public ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— private์ธ Eclass๋ฅผ ์ธ์ž๋กœ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.

 

Setter ์ ‘๊ทผ ์ œ์–ด (์ฝ๊ธฐ ์ „์šฉ)

๊ตฌ์กฐ์ฒด or ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ตฌํ˜„ํ• ๋•Œ ๊ฐ’์„ ๋ณ€๊ฒฝํ• ์ˆ˜ ์—†๋„๋ก ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ)

public(set) ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด setter์˜ ์ ‘๊ทผ๋ž˜๋ฐธ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

public struct SomeType{
    private var count = 0

    internal private(set) var InternerGetOnlyComputedProperty: Int {
        get {
            return count
        }
        set {
            count += 1
        }
    }
}

var someTypeInstance = SomeType()
print(someTypeInstance.InternerGetOnlyComputedProperty)

someTypeInstance.InternerGetOnlyComputedProperty = 14// Error -> ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.