์์ฑ์ผ: 2022๋ 7์ 25์ผ ์คํ 10:42
Access Control - The Swift Programming Language (Swift 5.7)
- ํน์ ์ฝ๋์ ์ ๊ทผ์ ๋ค๋ฅธ ์์คํ์ผ์ด๋ ๋ชจ๋์์ ์ ํํ๋ ๊ฒ
- ์ธ๋ถ์ ์ธ ๊ตฌํ์ ๊ฐ์ถ๊ณ ํ์ํ ๋งํผ ๊ณต๊ฐํ์ฌ ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฉ ๊ฐ๋ฅ
- ๊ฐ๋ณ ํ์ (individual types)(ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐ)๋ง ์๋๋ผ, ํด๋น ํ์ ์ ์ํ๋ ํ๋กํผํฐ, ๋ฉ์๋, ์ด๋์ ๋ผ์ด์ ๋ฐ ์ฒจ์(subscripts)์ ๋ํด ํน์ ์ ๊ทผ ๋ ๋ฒจ์ ์ง์ ๊ฐ๋ฅ
- Swift๋ ๋ค์ํ ์์ค์ ์ ๊ทผ ์ ์ด ์ธ์๋ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค์ ๋ํ ๊ธฐ๋ณธ ์ ๊ทผ ๋ ๋ฒจ์ ์ ๊ณต
- ๋ช ์์ ์ ๊ทผ ์ ์ด ๋ ๋ฒจ์ ์ง์ ํ ํ์์ฑ์ ์ค์ฌ์ค
- Swift์ ์ ๊ทผ ์ ์ด๋ ๋ชจ๋๊ณผ ์์คํ์ผ์ ๊ธฐ๋ฐ์ ๋๊ณ ์๋ค.
- ๋ชจ๋: ์ฝ๋๋ฅผ ๋ฐฐํฌํ๋ ๋จ์ผ ๋จ์๋ก ํ๋์ ํ๋ ์์ํฌ(UIKit ๋ฑ)๋ ์ฑ / import๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ธ์ฌ ์ ์๋ค.
- ์์คํ์ผ: ๋ชจ๋ ๋ด์ ๋จ์ผ Swift ์์ค ์ฝ๋ ํ์ผ
๋ค์ฏ ๊ฐ์ง ์ ๊ทผ ๋ ๋ฒจ ์กด์ฌ
- Open / Public : ๋ค๋ฅธ ๋ชจ๋์์ ์ฌ์ฉ ๊ฐ๋ฅ
- Open์ ํด๋์ค ๋ฐ ํด๋์ค ๊ตฌ์ฑ์์๊ฒ๋ง ์ ์ฉ ๊ฐ๋ฅ
- Open์ ๋ค๋ฅธ ๋ชจ๋์์ ์ค๋ฒ๋ผ์ด๋์ ์๋ธํด๋์ฑ์ด ๊ฐ๋ฅํ์ง๋ง, Public์ ๋ถ๊ฐ๋ฅ (Public์ ์ ์๋ ๋ชจ๋ ๋ด์์๋ง ์๋ธ ํด๋์ฑ, ์ค๋ฒ๋ผ์ด๋ ๊ฐ๋ฅ)
- ํด๋์ค๋ฅผ Open์ผ๋ก ํ์ํ๋ฉด ๋ค๋ฅธ ๋ชจ๋์ ์ฝ๋๊ฐ ๋ฏธ์น๋ ์ํฅ์ ๊ณ ๋ คํด์ ์ฝ๋๋ฅผ ์ค๊ณํ๋ค๋ ๊ฒ์ ๋ํ๋
- Internal : ๊ธฐ๋ณธ ์ ๊ทผ๋ ๋ฒจ๋ก ํด๋น ๋ชจ๋ ์ ์ฒด์์ ์ฌ์ฉ ๊ฐ๋ฅ
- File-private: ํน์ ์ํฐํฐ๋ฅผ ์ ์ธํ ํ์ผ ์์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ
- Private: ํน์ ์ํฐํฐ๊ฐ ์ ์ธ๋ ๊ดํธ ์์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ
์ผ๋ฐ ๊ฐ์ด๋ ์์น์ ๋ฐ๋ฅธ๋ค.
โ ๋ ๋ฎ์(๋ ์ ํ์ ) ๋ ๋ฒจ์ ๊ฐ๊ณ ์๋ ๋ค๋ฅธ ์ํฐํฐ์ ํน์ ์ํฐํฐ๋ฅผ ์ ์ธํด ์ฌ์ฉํ ์ ์๋ค.
- public ๋ณ์๋ ๋ค๋ฅธ internal, file-private ํน์ private ํ์ ์์ ์ ์๋ ์ ์๋ค. ์๋ํ๋ฉด ๊ทธ ํ์ ์ public ๋ณ์๊ฐ ์ฌ์ฉ๋๋ ๋ชจ๋ ๊ณณ์์ ์ฌ์ฉ๋ ์ ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์.
- ํจ์๋ ๊ทธ ํจ์์ ํ๋ผ๋ฏธํฐ ํ์ ์ด๋ ๋ฆฌํด ๊ฐ ํ์ ๋ณด๋ค ๋ ๋์ ์ ๊ทผ ๋ ๋ฒจ์ ๊ฐ์ง ์ ์๋ค. ์๋ํ๋ฉด ํจ์์๋ ์ ๊ทผ ๊ฐ๋ฅํ์ง๋ง ํ๋ผ๋ฏธํฐ์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅ ํ๊ฑฐ๋ ํน์ ๋ฐํ ๊ฐ ํ์ ๋ณด๋ค ์ ๊ทผ ๋ ๋ฒจ์ด ๋ฎ์ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ด๋ จ ์ฝ๋์์ ์ด์ฉํ ์ ์์ ์ ์๊ธฐ ๋๋ฌธ์.
์๋ฌด๋ฐ ์ ๊ทผ ๋ ๋ฒจ์ ๋ช ์ํ์ง ์์ ๊ฒฝ์ฐ internal์ ๊ฐ๊ฒ ๋๋ค.
๋จ์ผ ํ๊ฒ ์ฑ์์๋ ํน๋ณํ ์ ๊ทผ๋ ๋ฒจ์ ๋ช
์ํ ํ์๊ฐ ์์ง๋ง ํ์์ ๋ฐ๋ผ file-private, private๋ฑ์ ์ฌ์ฉํด ์ฑ๋ด์์ ๊ตฌํ ์ธ๋ถ์ฌํญ์ ์จ๊ธธ ์ ์๋ค.
ํ๋ ์์ํฌ๋ฅผ ๊ฐ๋ฐํ๋ค๋ฉด publicํน์ open์ผ๋ก ์ง์ ํด์ ๋ค๋ฅธ ๋ชจ๋์์ ๋ณผ ์ ์๊ณ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ๋ง๋ค์ด์ผ ํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก open์ด๋ public์ผ๋ก ์ง์ ๋ ์ํฐํฐ๋ง ๋ค๋ฅธ ๋ชจ๋์์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ์ ๋ํ
์คํธ๋ฅผ ํ๋ ๊ฒฝ์ฐ ๋ชจ๋ import ์์ @testable์ด๋ผ๋ ์ํธ๋ฆฌ๋ทฐํธ๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ํด๋น ๋ชจ๋์ ํ
์คํธ๊ฐ ๊ฐ๋ฅํ ๋ชจ๋๋ก ์ปดํ์ผํด ์ฌ์ฉ****
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() {}internal์ ๊ทผ๋ ๋ฒจ์ ์๋ตํ ์ ์๋ค.
- ์ปค์คํ ํด๋์ค์ ํน์ ์ ๊ทผ๋ ๋ฒจ ์ง์ ๊ฐ๋ฅ
โ ํน์ ํ์ ์ ์ ๊ทผ ๋ ๋ฒจ ์ง์ ์ ํ๋ ๊ฒ์ ๊ทธ ํ์ ๋ฉค๋ฒ(ํ๋กํผํฐ, ๋ฉ์๋ ์ด๊ธฐํ, ์๋ธ์คํฌ๋ฆฝํธ)์ ์ ๊ทผ ๋ ๋ฒจ์ ์ํฅ์ ๋ฏธ์น๋ค.
- ์์: file-private ํด๋์ค๋ฅผ ์ ์ํ๋ค๋ฉด, file-private ํด๋์ค๊ฐ ์ ์๋ ์์ค ํ์ผ ์์์ ํ๋กํผํฐ, ๋๋ ํจ์ ๋งค๊ฐ๋ณ์, ๋ฐํ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค.
public class SomePublicClass { // explicitly public class
public var somePublicProperty = 0 // explicitly public class member
var someInternalProperty = 0 // implicitly internal class member
fileprivate func someFilePrivateMethod() {} // explicitly file-private class member
private func somePrivateMethod() {} // explicitly private class member
}
class SomeInternalClass { // implicitly internal class
var someInternalProperty = 0 // implicitly internal class member
fileprivate func someFilePrivateMethod() {} // explicitly file-private class member
private func somePrivateMethod() {} // explicitly private class member
}
fileprivate class SomeFilePrivateClass { // explicitly file-private class
func someFilePrivateMethod() {} // implicitly file-private class member
private func somePrivateMethod() {} // explicitly private class member
}
private class SomePrivateClass { // explicitly private class
func somePrivateMethod() {} // implicitly private class member
}ํํ์์ ์ฌ์ฉ๋๋ ๋ชจ๋ ํ์ ์ ์ ๊ทผ๋ ๋ฒจ ์ค ๊ฐ์ฅ ์ ํ์ ์ธ ์ ๊ทผ๋ ๋ฒจ์ ๊ฐ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ง์ฝ ํ๋๋ internal ๋ค๋ฅธ ํ๋๋ private ์ ๊ทผ ๊ถํ์ ๊ฐ๋ 2๊ฐ์ ํ์
์ผ๋ก ๊ตฌ์ฑ๋ ํํ์ ๋ ๋ฎ์ ๋ ๋ฒจ์ธ private ์ ๊ทผ ๋ ๋ฒจ์ ๊ฐ์ต๋๋ค.
- ํจ์ ํ์ ์ ์ ๊ทผ ๋ ๋ฒจ์ ํ๋ผ๋ฏธํฐ ํ์ ๊ณผ ๋ฆฌํด ํ์ ์ ์ ๊ทผ๋ ๋ฒจ ์ค ๊ฐ์ฅ ์ ํ์ ์ธ ์ ๊ทผ๋ ๋ฒจ๋ก ๊ณ์ฐ๋ผ ์ฌ์ฉ
- ๊ทธ๊ฒ์ ๋ง๋ ์ ๊ทผ ๋ ๋ฒจ์ ํจ์ ์์ ๋ช ์ํด ์ค์ผ ํ๋ค.
func someFunction() -> (SomeInternalClass, SomePrivateClass) {
// function implementation goes here
}- ๋ช ์์ ์ธ ์ ๊ทผ ๋ ๋ฒจ์ ๋ช ์ํ์ง ์์ ํจ์๋ก ์ปดํ์ผ์ ์๋ฌ๊ฐ ๋ฐ์
- ๋ฐํ๊ฐ ์ค์ ์ ๊ทผ๋ ๋ฒจ์ด
private์ธSomePrivateClass๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์someFunction()์internal์ ๊ทผ๋ ๋ฒจ๋ก ์ ์ธ๋ ์ ์๋ค.
private func someFunction() -> (SomeInternalClass, SomePrivateClass) {
// function implementation goes here
}- ํจ์ ์์
private์ ๊ทผ๋ ๋ฒจ์ ์ง์ ํด ์ค์ผ ํ๋ค.
์ด๊ฑฐํ์์ ๊ฐ case๋ enum์ ์ ๊ทผ๋ ๋ฒจ์ ๋ฐ๋ฅด๊ณ ๊ฐ๋ณ์ ์ผ๋ก ๋ค๋ฅธ ์ ๊ทผ๋ ๋ฒจ์ ์ง์ ํ ์ ์๋ค.
public enum CompassPoint {
case north
case south
case east
case west
}- ๊ฐ case๋ enum์ ์ ๊ทผ๋ ๋ฒจ
public์ ๋ฐ๋ผ ๋ชจ๋public์ ๊ทผ๋ ๋ฒจ์ ๊ฐ๋๋ค.
์ด๊ฑฐํ ๋ด์ ๊ณ ์ ๊ฐ๊ณผ ์ฐ๊ด๊ฐ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ๋ฐ๋์ ์ด๊ฑฐํ๋ณด๋ค ๊ฐ๊ฑฐ๋ ๋์ ์ ๊ทผ ๋ ๋ฒจ์ ๊ฐ์ ธ์ผ ํ๋ค.
์ฆ, internal ์ ๊ทผ ๋ ๋ฒจ์ ๊ฐ๊ณ ์๋ ์ด๊ฑฐํ ํ์
์์ private ์ ๊ทผ ๋ ๋ฒจ์ ๊ฐ๋ ๊ณ ์ ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค.****
private๋ก ์ ์ธ๋ ํ์ ์ ์ค์ฒฉ ํ์ ์ ์๋์ผ๋กprivate์ ๊ทผ๋ ๋ฒจ์ ๊ฐ๋๋ค.****file-private์ผ๋ก ์ ์ธ๋ ๊ฒฝ์ฐ ์ค์ฒฉํ์ ์file-private์ ๊ฐ๋๋ค.publicํน์internal๋ก ์ ์ธ๋ ํ์ ์์ ์ค์ฒฉํ์ ์ ์๋์ผ๋กinternal์ ๊ทผ๋ ๋ฒจ์ ๊ฐ๋๋ค.public์ผ๋ก ์ ์ธ๋ ํ์ ์์public์ผ๋ก ์ ์ธ๋ ์ค์ฒฉํ์ ์ ์ฌ์ฉํ๊ณ ์ถ์ผ๋ฉด ๋ช ์์ ์ผ๋กpublic์ ๊ทผ์๋ฅผ ์ค์ฒฉํ์ ์ ์ ์ด์ค์ผ ํ๋ค.
- ์๋ธํด๋์ค๋ ์ํผํด๋์ค๋ณด๋ค ๋ ๋์(๋ ์ ํ์ ์ธ) ์ ๊ทผ๋ ๋ฒจ์ ๊ฐ์ง ์ ์๋ค.
- ์์: ์ํผํด๋์ค๊ฐ
internal๋ฅผ ๊ฐ๋๋ฐ ๊ทธ๊ฒ์ ์๋ธํด๋์ฑํด์pubic์๋ธํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋ค. - ํ์ง๋ง ๋ฉ์๋๋ ์๋ธํด๋์ค์์ ๋ ๋์ ์ ๊ทผ ๋ ๋ฒจ์ ๊ฐ๋ ๋ฉ์๋๋ก ์ค๋ฒ๋ผ์ด๋ ํ ์ ์๋ค.
public class A {
fileprivate func someMethod() {}
}
internal class B: A {
override internal func someMethod() {}
}- class B์ someMethod()๋ ์ํผํด๋์ค์
fileprivate๋ณด๋ค ๋ ๋์ ์ ๊ทผ๋ ๋ฒจ์ธinternal์ ๊ฐ๋๋ก ์ค๋ฒ๋ผ์ด๋ ๋๋ค.
์ด๊ฒ ๊ฐ๋ฅํ ์ด์ ๋ class A์ class B๊ฐ ๊ฐ์ ์์คํ์ผ์ ์ ์ธ๋ผ ์์ด์ class B์ someMethod ๊ตฌํ์์ super.someMethod()๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ์ ํจํ๊ธฐ ๋๋ฌธ์ด๋ค.
public class A {
fileprivate func someMethod() {}
}
internal class B: A {
override internal func someMethod() {
super.someMethod()
}
}์์, ๋ณ์, ํ๋กํผํฐ ๋ฑ์ ๊ทธ ํ์ ๋ณด๋ค ๋ ๋์ ์ ๊ทผ๋ ๋ฒจ์ ๊ฐ์ง ์ ์๋ค.
์ฆ, private ํ์
์์ public ํ๋กํผํฐ๋ฅผ ์ ์ธํ ์ ์๋ค.
์๋์ ๊ฐ์ด private ํด๋์ค ๋ณ์์ ์ ๊ทผ๋ ๋ฒจ์ private์ด ๋ผ์ผ ํ๋ค.
private class SomePrivateClass {}
private var privateInstance = SomePrivateClass() // ์ปดํ์ผ ์๋ฌ ๋ฏธ๋ฐ์
public var privateInstance = SomePrivateClass() // ์ปดํ์ผ ์๋ฌ ๋ฐ์์์, ๋ณ์, ํ๋กํผํฐ ๊ทธ๋ฆฌ๊ณ ์๋ธ์คํฌ๋ฆฝํธ์ ๊ฒํฐ์ ์ธํฐ๋ ์๋์ผ๋ก ํด๋น ์์, ๋ณ์, ํ๋กํผํฐ ๊ทธ๋ฆฌ๊ณ ์๋ธ์คํฌ๋ฆฝํธ๊ฐ ๊ฐ๋ ์ ๊ทผ๋ ๋ฒจ์ ๋์ผํ๊ฒ ๊ฐ๋๋ค.
ํ์์ ๋ฐ๋ผ ์ธํฐ์ ์ ๊ทผ๋ ๋ฒจ์ ๊ฒํฐ๋ณด๋ค ๋ฎ๊ฒ ์ ํ ์ ์๋ค.
fileprivate(set),private(set),internal(set)ํค์๋ ์ฌ์ฉ- ์ด ๊ท์น์ ์ ์ฅ ํ๋กํผํฐ ๋ฟ ์๋๋ผ, ์ฐ์ฐ ํ๋กํผํฐ์๋ ๋์ผํ๊ฒ ์ ์ฉ
struct TrackedString {
private(set) var numberOfEdits = 0
var value: String = "" {
didSet {
numberOfEdits += 1
}
}
}
var stringToEdit = TrackedString()
stringToEdit.value = "This string will be tracked."
stringToEdit.value += " This edit will increment numberOfEdits."
stringToEdit.value += " So will this one."
print("The number of edits is \(stringToEdit.numberOfEdits)")
// Prints "The number of edits is 3"- ๊ฒํฐ๋ง์ ์ด์ฉํด ๋ณ๊ฒฝ๋ ์ซ์ ํ์ธ ๊ฐ๋ฅ
- ์ธํฐ์ ์ ๊ทผ๋ ๋ฒจ์ด ์ง์ ๋์ง ์์๋ค๋ฉด TrackedString์ด internal์ด๊ธฐ ๋๋ฌธ์ ์ธ๋ถ์์๋ ์ ๊ทผ ๊ฐ๋ฅ
public struct TrackedString {
public private(set) var numberOfEdits = 0
public var value: String = "" {
didSet {
numberOfEdits += 1
}
}
public init() {}
}- ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ฒํฐ ๋ ๋ฒจ๋ ์ค์ ๊ฐ๋ฅ
์ด๊ธฐ์์ ์ ๊ทผ๋ ๋ฒจ์ ํ์ ์ ๋ ๋ฒจ๊ณผ ๊ฐ๊ฑฐ๋ ๋ฎ๋ค(๋ ์ ํ์ ).
- ํ ๊ฐ์ง ์์ธ: ์ง์ ์ด๊ธฐ์(required Initializer) - ๋ฐ๋์ ์ํ ํ์ ๊ณผ ์ ๊ทผ๋ ๋ฒจ์ด ๊ฐ์์ผ ํ๋ค.
- ํ์ ์ ์ ๊ทผ๋ ๋ฒจ์ด public์ด ์๋๋ฉด ํ์ ๊ณผ ๊ฐ์ ์ ๊ทผ๋ ๋ฒจ์ ๊ฐ๋๋ค.
- ํ์ ์ ์ ๊ทผ๋ ๋ฒจ์ด public์ด๋ฉด ๊ธฐ๋ณธ ์ด๊ธฐ์๋ internal ์ ๊ทผ๋ ๋ฒจ์ ๊ฐ๋๋ค.
- ๋ชจ๋ ์ ์ฅ ํ๋กํผํฐ๊ฐ private์ผ ๊ฒฝ์ฐ, Default Memberwise Initializers์ ์ ๊ทผ๋ ๋ฒจ์ private
- ๋ชจ๋ ์ ์ฅ ํ๋กํผํฐ๊ฐ file private์ผ ๊ฒฝ์ฐ, Default Memberwise Initializers์ ์ ๊ทผ๋ ๋ฒจ์ file private
- ๋ง์ฝ public ๊ตฌ์กฐ์ฒด๊ฐ ๋ค๋ฅธ ๋ชจ๋์์ ์ฌ์ฉ๋ ๋๋ ๋ฐ๋์ Memberwise Initializers๋ฅผ ํ์ ์ ์ ์ํด public์ผ๋ก ์ง์ ํด์ผ ํ๋ค.
-
ํ๋กํ ์ฝ์ ๋ช ์์ ์ ๊ทผ๋ ๋ฒจ์ ํ ๋นํ๋ ค๋ฉด, ํ๋กํ ์ฝ์ด ์ ์๋ ๋ ํ ๋นํด๋ผ.
์ด ๋ฐฉ์์ผ๋ก ํน์ ์ ๊ทผ๋ ๋ฒจ ๋ด์์๋ง ์ฑํํ ์ ์๋ ํ๋กํ ์ฝ์ ๋ง๋ค ์ ์๋ค.
-
ํ๋กํ ์ฝ ์ ์ ๋ด์ ๊ฐ ์๊ตฌ์ฌํญ ์ ๊ทผ์ ํ ์์ค์ ํ๋กํ ์ฝ๊ณผ ๋์ผํ ์์ค์ผ๋ก ์๋ ์ค์
-
ํ๋กํ ์ฝ์ด ์ง์ํ๋ ์ ํ๋ ๋ฒจ๊ณผ ๋ค๋ฅธ ์ ํ๋ ๋ฒจ ์์ค์ผ๋ก ์ค์ ํ ์ ์๋ค.
-
์ด๋ ๊ฒ ํ๋ฉด ํ๋กํ ์ฝ์ ์ฑํํ ์ด๋ค ํ์ ์์๋ ํ๋กํ ์ฝ์ ์๊ตฌ์ฌํญ์ ๋ณผ ์ ์๋ค.
- ๊ธฐ์กด ํ๋กํ ์ฝ๋ก๋ถํฐ ์์ํ ์๋ก์ด ํ๋กํ ์ฝ์ ์ ์ํ๋ค๋ฉด, ์๋ก์ด ํ๋กํ ์ฝ์ ์์๋ฐ์ ํ๋กํ ์ฝ๊ณผ ๊ฑฐ์ ๊ฐ์ ์ ๊ทผ ๋ ๋ฒจ์ ๊ฐ๋๋ค.
- ์์: internal ํ๋กํ ์ฝ๋ก๋ถํฐ ์์ํ๋ public ํ๋กํ ์ฝ์ ๋ถ๊ฐ๋ฅํ๋ค.
- ํ์
์ ํ์
์์ฒด๋ณด๋ค ๋ ๋ฎ์ ์ ๊ทผ ๋ ๋ฒจ(๋ ์ ํ์ )์ผ๋ก ํ๋กํ ์ฝ์ ์ค์ํ ์ ์๋ค.
- ์์: ๋ค๋ฅธ ๋ชจ๋์์ ์ฌ์ฉ๋๋ public ํ์ ์ ์ ์ํ ์ ์์ง๋ง internal ํ๋กํ ์ฝ ์ค์๋ internal ํ๋กํ ์ฝ์ ์ ์ ๋ชจ๋ ๋ด์์๋ง ์ฌ์ฉ๋๋ค.
- ํน์ ํ๋กํ ์ฝ ํ์
์ค์์์ ์ปจํ
์คํธ๋ ํ์
์ ์ ๊ทผ ์์ค๊ณผ ํ๋กํ ์ฝ์ ์ ๊ทผ ์์ค์ ์ต์์ด๋ค.
- ์์: ํ์ ์ด public์ด๋ผ๋ฉด ํ๋กํ ์ฝ์ internal๋ก ์ค์๋๋ฉฐ, ํ์ ์ ํ๋กํ ์ฝ์ ์ค์๋ internal์ด ๋๋ค.
- ํ๋กํ ์ฝ์ ์ค์ํ๋ ํ์
์ ํ์ฅํ๊ฑฐ๋ ์์ฑํ ๋, ๊ฐ๊ฐ์ ํ๋กํ ์ฝ ์๊ตฌ์ฌํญ์ ํ์
๊ตฌํ์ด ์ ์ด๋ ํ๋กํ ์ฝ์ ์ค์ํ๋ ํ์
์ผ๋ก์ ๊ฐ์ ์ ๊ทผ ์์ค์ ๊ฐ์ ธ์ผ ํจ์ ๋ณด์ฅํด์ผ ํ๋ค.
- ์์: ๋ง์ฝ public ํ์ ์ internal ํ๋กํ ์ฝ์ ์ค์ํ๋ค๋ฉด, ๊ฐ๊ฐ์ ํ๋กํ ์ฝ ์๊ตฌ์ฌํญ์ ํ์ ๊ตฌํ์ ์ ์ด๋ โinternalโ์ด ๋์ด์ผ ํ๋ค.
- extension์ผ๋ก ์ถ๊ฐ๋ ๋ชจ๋ ํ์
๋ฉค๋ฒ๋ ์๋ ํ์์์ ์ ์ธ๋ ํ์
๋ฉค๋ฒ๋ค๊ณผ ๋์ผํ ๊ธฐ๋ณธ ์ ๊ทผ ๋ ๋ฒจ์ ๊ฐ๋๋ค.
- ์์: public ํ์ ์ ํ์ฅํ๋ค๋ฉด, ์๋ก์ด ํ์ ๋ฉค๋ฒ๋ internal์ ๊ธฐ๋ณธ ์ ๊ทผ ์์ค์ ๊ฐ์ง๊ฒ ๋๋ค.
- ์์: file-private ํ์ ์ ํ์ฅํ๋ค๋ฉด, ์๋ก์ด ํ์ ๋ฉค๋ฒ๋ file-private ๊ธฐ๋ณธ ์ ๊ทผ ์์ค์ ๊ฐ์ง๊ฒ ๋๋ค.
- extension์ ๋ช ์์ ์ผ๋ก ์ ๊ทผ ๋ ๋ฒจ์ ํ์ํ์ฌ extension ๋ด์ ์ ์๋ ๋ฉค๋ฒ๋ค์๊ฒ ์๋ก์ด ๊ธฐ๋ณธ ์ ๊ทผ ๋ ๋ฒจ์ ์ธํ ํ ์ ์๋ค.
- ์๋ก์ด ๊ธฐ๋ณธ ์ ๊ทผ ์์ค์ ์ฌ์ ํ ๊ฐ๋ณ ํ์ ๋ฉค๋ฒ์ ๋ํ extension ๋ด์์ ์ค๋ฒ๋ผ์ด๋ ๋ ์ ์๋ค.
- extension์ ์ฌ์ฉํ์ฌ ํ๋กํ ์ฝ์ ์ค์ํ๋ ๊ฒฝ์ฐ, ์ ๊ทผ ๋ ๋ฒจ์ ๋ช
์์ ์ผ๋ก ์ง์ ํ ์ ์๋ค.
- ๋์ , ํ๋กํ ์ฝ ์์ฒด์ ์ ๊ทผ ๋ ๋ฒจ์ extension ๋ด์์ ๊ฐ ํ๋กํ ์ฝ ์๊ตฌ ์ฌํญ ๊ตฌํ์ ๋ํ ๊ธฐ๋ณธ ์ ๊ทผ ๋จ๊ณ๋ฅผ ์ ๊ณตํ๋๋ฐ ์ฌ์ฉ๋๋ค.
๋์ผํ ํ์ผ ๋ด์ ์๋ extension์ ๊ทธ ์ฝ๋์ ์๋ณธ ํ์ ์ ์์ ์ผ๋ถ๋ก ์ฐ์ฌ์ง ์ ์๋ค.
- ์๋ณธ ์ ์์ private ๋ฉค๋ฒ๋ก ์ ์ธํ ๊ฒ์ extension์์ ๋ฉค๋ฒ๋ก ์ ๊ทผํ ์ ์๋ค.
- ํ๋์ extension์์ private ๋ฉค๋ฒ๋ก ์ ์ธํ ๊ฒ์ ๊ฐ์ ํ์ผ์ ๋ค๋ฅธ extension์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ํ๋์ extension์์ private ๋ฉค๋ฒ๋ก ์ ์ธํ ๊ฒ์ ์๋ณธ ์ ์ธ์์ ๋ฉค๋ฒ๋ก ์ ๊ทผํ ์ ์์ต๋๋ค.
protocol SomeProtocol {
func doSomething()
}
struct SomeStruct {
private var privateVariable = 12
}
extension SomeStruct: SomeProtocol {
func doSomething() {
print(privateVariable)
}
}- ์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ ์ถฉ์กฑ
์ ๋ค๋ฆญ ํ์ ๋๋ ์ ๋ค๋ฆญ ํจ์๋ฅผ ์ํ ์ ๊ทผ ๋ ๋ฒจ์ ์ ๋ค๋ฆญ ํ์ ๋๋ ํจ์ ์์ ์ ์ ๊ทผ ์์ค๊ณผ ํ์ ์ธ์์ ๋ชจ๋ ํ์ ์ ์ฝ์ ์ ๊ทผ ์์ค์ ์ต์์ด๋ค.
- ์ ์ํ ํ์ ๋ณ์นญ์ ์ก์ธ์ค ์ ์ด๋ฅผ ์ํด ๋ณ๊ฐ์ ์ ํ์ผ๋ก ์ทจ๊ธ๋๋ค.
- ํ์ ๋ณ์นญ์ ์ ํ์ ์ ์ ๊ทผ ๋ ๋ฒจ๋ณด๋ค ๋ํ๊ฑฐ๋ ๊ฐ์ ์์ค์ ๊ฐ์ง ์ ์๋ค.
- ์์: private์ ํ์ ๋ณ์นญ์ผ๋ก private, file-private, internal, public, or open type๋ฅผ ๊ฐ์ง ์ ์๋ค.
- ์์: public์ ํ์ ๋ณ์นญ์ผ๋ก internal, file-private, or private๋ฅผ ๊ฐ์ง ์ ์๋ค.