์ƒˆ์†Œ์‹

๐Ÿ“ฑ iOS/-- Swift 5

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

  • -

 

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

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

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

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

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

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

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

  • ํด๋ž˜์Šค๊ฐ€ ์ •์˜๋œ ๋ชจ๋“ˆ ๋‚ด์—์„œ๋งŒ subclassingํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํด๋ž˜์Šค๊ฐ€ ์ •์˜๋œ ๋ชจ๋“ˆ ๋‚ด์—์„œ๋งŒ override ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์š”์†Œ ์•ž์— ํ‚ค์›Œ๋“œ๋ฅผ ์“ฐ์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ์ง€์ •๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’์ด๋‹ค.
  • Internal ๋ž˜๋ฐธ์„ ๊ฐ€์ง„ ์š”์†Œ๋Š” ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ๋Š” ์–ด๋””์„œ๋“  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํ•ด๋‹น ์†Œ์ŠคํŒŒ์ผ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. (๋ชจ๋“ˆ์ด ๊ฐ™์•„๋„ ๋‹ค๋ฅธ ์†Œ์ŠคํŒŒ์ผ์—์„œ๋Š” ์‚ฌ์šฉ๋ถˆ๊ฐ€)
  • ๊ฐ€์žฅ ํ•œ์ •์ ์ธ ๋ฒ”์œ„์ด๋‹ค. ํ•ด๋‹น ์š”์†Œ๋ฅผ ์ •์˜ํ•œ ๋ฒ”์œ„ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์„ ์–ธ๋œ 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๋ฅผ ์ธ์ž๋กœ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.

 

๊ตฌ์กฐ์ฒด 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 -> ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

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

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