Swift Access Control
Manage the visibility of code by declaration, file, and module.
1. Access Control ๐ฉโ๐ป
Access Control ์ ๋ค๋ฅธ ์์ค ํ์ผ๊ณผ ๋ชจ๋์์ ์ฝ๋์ ์ ๊ทผํ๋ ๊ฒ์ ์ ํํ๋ค. Access Control ์ ์ด์ฉํด ์ฝ๋๋ฅผ ์๋ํ(hiding) ํ๊ณ ์ ๊ทผํ ์ ์๋ ๊ธฐ๋ณธ ์ธํฐํ์ด์ค๋ฅผ ์ง์ ํ ์ ์๋ค.
์ ๊ทผ ์์ค์ Classes, Structures, Enumerations ๋จ์๋ก ์ ํํ๊ฑฐ๋ ์ด์ ์ํด ์๋ Properties, Methods, Initializers, Subscripts ๋จ์๋ก ์ ํํ๋ ๊ฒ ์ญ์ ๊ฐ๋ฅํ๋ค. ๋ํ Protocols ๋ ํน์ context ๋จ์๋ก ์ ํ๋ ์ ์๋ค.
์ด ๋ฌธ์์์๋ ๊ฐ๊ฒฐ์ฑ์ ์ํด Properties, Types, Functions ๋ฑ๊ณผ ๊ฐ์ด Access Control ์ ์ ์ฉํ ์ ์๋ ๊ฒ๋ค์
Entities
๋ก ํํํ๋ค.
2. Modules and Source Files ๐ฉโ๐ป
Swift ์ Access Control ์ Modules
์ Source Files
์ ๊ฐ๋
์ ๊ธฐ์ด๋ก ํ๋ค.
- Modules : Single unit of code distribution. ์ฆ, ์ฝ๋๊ฐ ๋น๋๋๊ณ ์ ๊ณต๋๋ Framework ๋๋ App ๊ณผ ๊ฐ์ ์ฝ๋์ ๋ฐฐํฌ ๋จ์๋ก
import
keyword ๋ฅผ ์ฌ์ฉํด ๋ค๋ฅธ ๋ชจ๋์ ๊ฐ์ ธ์ ์ฌ์ฉํ๋ค. - Source Files : Modules ๋ด์ Single Swift Source Code File ๋ก ์ค์ ๋ก Framework ๋๋ App ๋ด์ ์๋ Single File ์
์๋ฏธํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ์๋ก ๋ค๋ฅธ Types ๋ ๊ฐ๊ฐ์ Source Files ์ ์ ์ํ์ง๋ง Swift ์์๋
Single Source Code File ์ ์ฌ๋ฌ Types, Functions ๋ฑ์ ๋ํ ์ ์๋ฅผ ํฌํจ
ํ ์ ์๋ค.
3. Access Levels ๐ฉโ๐ป
1. Access Levels
Swift ๋ ์ฝ๋ ๋ด์์ Entities ์ ๋ํด 5๊ฐ์ ๋ค๋ฅธ Access Levels ๋ฅผ ์ ๊ณตํ๋ค. ์ด Access Levels ๋
Modules > Source Files > Entities
์ Hierarchy ๊ตฌ์กฐ์ ๊ด๋ จ๋๋ค.
- Open : Framework Level, App ๋๋ Framework ๋ฅผ ๊ณต๊ฐ๋ ์ธํฐํ์ด์ค๋ก ์ง์ ํ ๋ ์ฌ์ฉํ๋ค.
(Public ๊ณผ ์ ์ฌํ์ง๋ง Open ์ Classes ์ Class Members ์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, ๋ค๋ฅธ ๋ชจ๋์์ Open ์ผ๋ก ์ ์๋ Classes ์ Class Members ๋ฅผ Subclassing, Overriding ํ๋ ๊ฒ์ ํ์ฉํ๋ค.) - Public : Framework Level, App ๋๋ Framework ๋ฅผ ๊ณต๊ฐ๋ ์ธํฐํ์ด์ค๋ก ์ง์ ํ ๋ ์ฌ์ฉํ๋ค.
- Internal : Application Level, ์๋ต์ ์ ์ฉ๋๋ ๊ธฐ๋ณธ ์ ๊ทผ ๋ ๋ฒจ๋ก, ๋์ผ ๋ชจ๋ ๋ด์์ ์์ ๋ก์ด ์ ๊ทผ์ด ๊ฐ๋ฅํ์ง๋ง ์ธ๋ถ ๋ชจ๋์ ์ ๊ทผ์ ์ ํ๋๋ค. ๋ฐ๋ผ์ App ๋๋ Framework ์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํ๋ค.
- File-private : Application Level, Source File ๋ด๋ถ๋ก ์ ๊ทผ์ ์ ํํ๋ค.
- Private : Application Level, Source File ์์์๋ ์ ์๋ฅผ ๋๋ฌ์ผ context ๋ก ๋ด๋ถ๋ก ์ ๊ทผ์ ์ ํํ๋ค.
2. Guiding Principle of Access Levels
Public Variables
๋ Internal, File-private, Private Types ๋ก ์ ์๋ ์ ์๋ค. Public Variables ๋ ์ด๋์๋ ์ฌ์ฉ๋ ์ ์์ง๋ง Access Levels ๋ฅผ ์ด๋ณด๋ค ๋ฎ์ ์์ค์ผ๋ก ๋ณ๊ฒฝํ ๊ฒฝ์ฐ ๊ทธ๋ ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ด๋ค.Functions
๋ Parameter ์ Return Types ๋ณด๋ค ๋์ ์์ค์ Access Levels ๋ฅผ ๊ฐ์ง ์ ์๋ค.
3. Default Access Levels
๋ช
์์ ์ผ๋ก Access Levels ๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด Swift ๋ default ๋ก Internal
์ Access Levels ๋ก ๊ฐ๋๋ก ํ๋ค. ๋ฐ๋ผ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ
Access Levels ๋ฅผ ๋ช
์ํ ํ์๊ฐ ์๋ค.
4. Access Levels for Single-Target Apps
Single-Target App
์ ๋ง๋ค ๋ ์ฑ์ ์ฝ๋๋ ์ฑ ๋ด์ ํฌํจ๋๋ฉฐ ์ฑ์ ์ธ๋ถ ๋ชจ๋์์ ์ฌ์ฉํ๋๋ก ๋ง๋ค ํ์๊ฐ ์๋ค. Swift ์ ์ํด default ๋ก
์ง์ ๋๋ Internal
์ ์ด์ ์ ํฉํ๋ฏ๋ก Access Levels ๋ฅผ ๋ช
์ํ ํ์๊ฐ ์๋ค. ๋จ, ์ฑ์ ๋ชจ๋ ๋ด๋ถ ๋ค๋ฅธ ์ฝ๋์๊ฒ ๊ตฌํ์ ์ธ๋ถ ๋ด์ฉ์ ๊ฐ๋ฆฌ๊ธฐ ์ํด
File Private
, Private
์ ์ด์ฉํด Access Levels ๋ฅผ ์ ํํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
5. Access Levels for Frameworks
Framework ๋ฅผ ๊ฐ๋ฐํ ๋ ๋ค๋ฅธ ๋ชจ๋์์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋๋ก Framework ์ ๊ณต์ฉ ์ธํฐํ์ด์ค๋ฅผ open
๋๋ public
์ผ๋ก ํ์ํ๋ค.
Framework ๋ด์ ํค๋ถ ๊ตฌํ์ Default Access Levels ์ธ
internal
์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, Framework ๋ด๋ถ์์๋ ๋ค๋ฅธ ์ฝ๋ ๋ถ๋ถ์ ๊ฐ๋ฆฌ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋fileprivate
๋๋private
์ ๋ช ์ํ ์ ์๋ค. Framework ๊ฐ ๋ ธ์ถ ์ํฌ API ์ ํด๋นํ๋ Entities ์๋งopen
,public
์ ๋ช ์ํ๋ฉด ๋๋ค.
6. Access Levels for Unit Test Targets
Unit Test Targets ์ ์ด์ฉํด ์ฑ์ ๊ตฌํํ ๋ ํด๋น ์ฝ๋๋ ํ
์คํธ๋ฅผ ์ํด Test ๋ชจ๋ ์์ ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค. ํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก open
๋๋
public
์ผ๋ก ์ ์ธ๋์ง ์์ Entities ๋ ๋ค๋ฅธ ๋ชจ๋์์ ์ฌ์ฉํ ์ ์๋ค.
๋จ, Unit Test Targets ์ ํํด ๋ชจ๋์ import ํ ๋ ์์ @testable
attribute ๋ช
์ํ๋ฉด ํด๋น
๋ชจ๋์ internal entities ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
4. Access Control Syntax ๐ฉโ๐ป
์์์ ์ค๋ช ํ Access Levels ์ ์ค์ ํ๊ธฐ ์ํด open, public, internal, fileprivate, private modifier ๋ฅผ Entities ์ ์ ์ ์์ ๋ช ์ํ๊ธฐ ์ํ Syntax ๋ค.
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 ๋ก ์ ์ธ๋ SomeInternalClass
์ someInternalConstant
๋ ๋ณ๋๋ก ๋ช
์ํ์ง ์๊ณ default Access Levels ๊ฐ
์ ์ฉ๋๋๋ก ๋ค์๊ณผ ๊ฐ์ด ์ ์ธํ ์ ์๋ค.
class SomeInternalClass {} // implicitly internal
let someInternalConstant = 0 // implicitly internal
5. Custom Types ๐ฉโ๐ป
1. Custom Types
User Custom Types ๋ฅผ ์ ์ํ ๋ Access Levels ์ ์ํ๊ณ ์ถ๋ค๋ฉด Types ๋ฅผ ์ ์ํ ๋ ์ง์ ํด์ผํ๋ค. Types ์์ฒด์ ๋ํ Access Levels ๋ ํด๋น Types ๊ฐ ๊ฐ๋ Members(Properties, Methods, Initializers, Subscripts) ์ default Access Levels ์๋ ์ํฅ์ ๋ฏธ์น๋ค.
- Types ๋ฅผ
fileprivate
์ผ๋ก ์ ์ํ๋ฉด, ๊ทธ Members ์ญ์fileprivate
์ด ๋๋ค. - ๋จ, Types ๋ฅผ
public
์ผ๋ก ์ ์ํ๋๋ผ๋ ๊ทธ Members ๋internal
์ด๋ค. ์ด๋ ์ค์๋ก ๋ชจ๋์ API ๊ฐ ์๋ ์ฝ๋ ๋ถ๋ถ์ด ๋ ธ์ถ๋๋ ๊ฒ์ ์๋ฐฉํ๊ธฐ ์ํจ์ด๋ค.
Access Levels
- (open, public) Types = internal Members
- (internal, fileprivate, private) Types = Members
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
}
2. Tuple Types
- Tuples ๋ Classes, Structures, Enumerations, Functions ์ ๋ฌ๋ฆฌ ๋ ๋ฆฝ์ ์ธ ์ ์๊ฐ ์๋ค
- Tuples ์ Access Levels ๋ ๊ตฌ์ฑ๋ Types ๋ก๋ถํฐ ์๋์ผ๋ก ์ ํด์ง๋ฉฐ, ๋ช ์์ ์ผ๋ก ์ง์ ํ ์ ์๋ค.
- Tuples ์ Access Levels ๋ ๊ตฌ์ฑ๋ Types ์ค ๊ฐ์ฅ ๋ฎ์ ์์ค์ Access Levels ๋ก ์๋์ผ๋ก ์ ํด์ง๋ค.
Access Levels
- Tuples โค min(Types1, Types2)
๋ฐ๋ผ์ internal
๊ณผ private
์ผ๋ก ๊ตฌ์ฑ๋ Tuples ์ Access Levels ๋ private
์ด ๋๋ค.
3. Function Types
- Functions ์ Access Levels ๋ Parameter Types ์ Return Types ์ค ๊ฐ์ฅ ๋ฎ์ ์์ค์ Access Levels ๋ก ๊ณ์ฐ๋๋ฉฐ, context ์ Access Levels ์ ์ผ์นํ์ง ์๋๋ค๋ฉด ๋ช ์์ ์ผ๋ก ์ง์ ํด์ผํ๋ค.
Access Levels
- Functions โค min(Parameters, Returns)
1 ) Context ์ Access Levels ์ ์ผ์นํ๋ ๊ฒฝ์ฐ
struct SomeInternalStructure {
func someFunction() -> (SomeInternalClass, SomeInternalClass) {
(SomeInternalClass(), SomeInternalClass())
}
}
context ์ Access Levels ๊ฐ
internal
, Function Parameter Types ์ Return Types ์ Access Levels ๊ฐinternal
์ด๋ฏ๋ก ํจ์๋ ์์์ ์ผ๋กinternal
๋ก ์ ์๋๋ค.
private struct SomePrivateStructure {
func someFunction() -> (SomePrivateClass, SomePrivateClass) {
(SomePrivateClass(), SomePrivateClass())
}
}
context ์ Access Levels ๊ฐ
private
, Function Parameter Types ์ Return Types ์ Access Levels ๊ฐprivate
์ด๋ฏ๋ก ํจ์๋ ์์์ ์ผ๋กprivate
์ผ๋ก ์ ์๋๋ค.
2 ) Context ์ Access levels ์ ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ
struct SomeInternalStructure {
func someFunction() -> (SomeInternalClass, SomePrivateClass) {
(SomeInternalClass(), SomePrivateClass())
} // error: method must be declared fileprivate because its result uses a private type
}
context ์ Access Levels ๋
internal
์ธ๋ฐ, Function Parameter Types ์ Return Types ์ค ๋ฎ์ Access Levels ๊ฐprivate
์ด๋ฏ๋ก Access Levels ์ ๋ค์๊ณผ ๊ฐ์ด ๋ช ์์ ์ผ๋ก fileprivate ๋๋ private ์ผ๋ก ์ง์ ํด์ผํ๋ค.
struct SomeInternalStructure {
fileprivate func someFunctionFirst() -> (SomeInternalClass, SomePrivateClass) {
(SomeInternalClass(), SomePrivateClass())
}
private func someFunctionSecond() -> (SomeInternalClass, SomePrivateClass) {
(SomeInternalClass(), SomePrivateClass())
}
}
let some = SomeInternalStructure()
some.someFunctionFirst()
some.someFunctionSecond() // 'someFunctionSecond' is inaccessible due to 'private' protection level
๊ฐ์ฅ ๋ฎ์ Access Levels ๋ private ์ด์ง๋ง fileprivate ๊น์ง๋ ํ์ฉ์ด ๋๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. ๋ฌผ๋ก , ํจ์๋ฅผ ์ ์ํ ๋ Function Parameter Types ์ Return Types ์ ๋ํด private ๋ณด๋ค ๋์ fileprivate ์ด ํ์ฉ๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ ๊ฒ์ผ ๋ฟ fileprivate ์ผ๋ก ์ ์ธํ๋ฉด ๊ฐ์ ํ์ผ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ฏ๋ก ํด๋น Types ์ธ๋ถ์์ ๋ณผ ๋๋ private ๊ณผ ๋ค๋ฅธ Access Levels ๋ฅผ ๊ฐ๊ฒ ๋๋ค.
4. Enumeration Types
- Enumerations ์ Cases ์ญ์ Enumerations ์ Access Levels ๋ฅผ ์๋์ผ๋ก ๋ฐ๋๋ค.
- Enumerations ์ Cases ๋ Classes ๋ Structures ์ Members ์ ๋ฌ๋ฆฌ Access Levels ๋ฅผ ์ง์ ํ ์ ์๋ค.
- Enumerations ์ ์ฌ์ฉ๋ Associated Values, Raw Values ๋ Enumerations ์ Access Levels ๊ณผ ๊ฐ๊ฑฐ๋ ๋์ ์์ค์ Access Levels ๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.
Access Levels
- Cases ์ Access Levels ์์ ๋ถ๊ฐ
- Enumerations = Cases
- Enumerations โค Associated Values
- Enumerations โค Raw Values
5. Nested Types
- Nested Types ์ญ์ context ์ Access Levels ๋ฅผ ์๋์ผ๋ก ๋ฐ๋๋ค.
- ๋จ, Public Types ์ Nested Types ๋
internal
์ด๋ค. (cf. Custom Types)
Access Levels
- (open, public) Context Types = internal Nested Types
- (internal, fileprivate, private) Context Types = Nested Types
6. Subclassing ๐ฉโ๐ป
- ๋์ผ ๋ชจ๋์ผ ๊ฒฝ์ฐ ํ์ฌ context ๊ฐ ์ ๊ทผ ๊ฐ๋ฅํ ์ด๋ค Class ๋ Subclassing ํด Members ๋ฅผ Overriding ํ ์ ์๋ค.
- ๋ค๋ฅธ ๋ชจ๋์ ๊ฒฝ์ฐ ๋์์ด Open Class ๋ผ๋ฉด Subclassing ํด Members ๋ฅผ Overriding ํ ์ ์๋ค..
- Subclass ๋ ์์ Class ๋ณด๋ค ๋์ Access Levels ๋ฅผ ๊ฐ์ง ์ ์๋ค.
Access Levels
- Subclass โค Superclass
- Overriding ์ ์ด์ฉํด Subclass Members ์ Access Levels ๋ฅผ Superclass ๋ณด๋ค ๋๊ฒ ์ค์ ์ด ๊ฐ๋ฅํ๋ค.
Overriding ์ ์ด์ฉํด ํด๋น Class Member ๋ฅผ ๋ณด๋ค ์ก์ธ์ค ํ๊ธฐ ์ฝ๋๋ก ๋ง๋ค ์ ์๋ค.
public class A {
fileprivate func someMethod() {}
}
internal class B: A {
override internal func someMethod() {}
}
public class A {
fileprivate func someMethod() {}
}
internal class B: A {
override internal func someMethod() {
super.someMethod()
}
}
- Subclassing ๋
Subclass B
๋Superclass A
๋ณด๋ค ๋์ง ์์ Access Levels ๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ค.- Subclassing ์ ํตํด Subclass B ๋
fileprivate
์ผ๋ก ์ ์๋someMethod()
์ Access Levels ๋ฅผ Overriding ์ ํตํดinternal
๋ก ๋์ฌ ๋ณด๋ค ์์ธ์ค ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์๋ค.
7. Members ๐ฉโ๐ป
1. Constants, Variables, Properties, and Subscripts
- ์ ์ธ๋๋ Constants, Variables, Properties ๋ ํ ๋นํ๋ ค๋ Types ๋ณด๋ค ๋์ ์์ค์ Access Levels ๋ฅผ ๊ฐ์ง ์ ์๋ค.
- ์ ์ฌํ๊ฒ Subscripts ๋ Index Types ๋๋ Return Types ๋ณด๋ค ๋์ ์์ค์ Access Levels ๋ฅผ ๊ฐ์ง ์ ์๋ค.
Access Levels
- Constants, Variables, Properties โค Types to assignment
- Subscripts โค min(Index, Return)
var internalInstance = SomePrivateClass() // Variable must be declared private or fileprivate because its type 'SomePrivateClass' uses a private type
fileprivate var fileprivateInstance = SomePrivateClass()
private var privateInstance = SomePrivateClass()
Private Types
๋ฅผ ํ ๋นํ๋ฏ๋ก ์ ์ธ๋๋ Variables ๋private
๋ณด๋ค ๋์ ์์ค์ Access Levels ๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฏ๋ก ๋ฐ๋์private
์ผ๋ก ์ ์ธ๋์ด์ผ ํ๋ค.
Function Types ์์ ๋ณธ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก private ์ด ์์๋๋ ๊ณณ์ fileprivate ๊น์ง๋ ํ์ฉ์ด ๋๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
2. Getters and Setters
- Constants, Variables, Properties, Subscripts ์ ๋ํ
Getters
์Setters
๋ ์ํด ์๋ ๋์์ Access Levels ๋ฅผ ์๋์ผ๋ก ๋ฐ๋๋ค. Setters
์ Access Levels ๋ฅผGetters
์ Access Levels ๋ณด๋ค ๋ฎ๊ฒ ์ ํํ๊ธฐ ์ํดfileprivate(set)
,private(set)
๋๋inernal(set)
์ ์์ฑํด ๋ ๋ฎ์ ์ ๊ทผ ์์ค์ ํ ๋นํ ์ ์๋ค.
Stored Properties ์ ๋ํด ๋ช ์์ ์ผ๋ก Getters ์ Setters ๋ฅผ ์์ฑํ์ง ์์๋ Swift ๋ ๋ด๋ถ์ ์ผ๋ก Stored Properties ์
Backing Storage
์ ๋ํ ์ ๊ทผ์ ์ ๊ณตํ๊ธฐ ์ํด ์์์ ์ผ๋ก Getters ์ Setters ๋ฅผ ์ ๊ณตํ๋ค.
Access Levels
- Getters, Setters of (Constants, Variables, Properties, Subscripts) โค Constants, Variables, Properties, Subscripts
- Getters = Constants, Variables, Properties, Subscripts
- Setters โค Setters
Function Types, Constants, Variables, Properties, and Subscripts ์์ ์์์ ์ผ๋ก private ์ด ์๊ตฌ๋๋ ๊ณณ์ fileprivate ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํ์ฉ๋์์ผ๋ Setter ์ ๊ฒฝ์ฐ ์ข ๋ ์๊ฒฉํ๊ฒ ์ด๋ฅผ ์งํจ๋ค. ์ฆ, private ์ fileprivate โSettersโ ๋ ํ์ฉ๋์ง ์๋๋ค.
fileprivate(set)
, private(set)
, inernal(set)
์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด ์ด๋ค์์ผ๋ก ์๋ํ๋์ง ์ดํด๋ณด์.
1 ) Getters: internal, Setters: internal
class SomeClass {
var id: String = ""
}
์์ ๊ฐ์ด ์ ์๋ SomeClass ๋ ๋ด๋ถ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค.
class SomeClass {
private var _id: String = ""
var id: String {
get {
_id
}
set {
_id = newValue
}
}
}
let someClass = SomeClass()
someClass.id = "A"
print(someClass.id) // A
2 ) Getters: internal, Setters: private
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ Getters ๋ internal ์ Access Levels ๋ฅผ ๊ฐ๊ณ , Setters ๋ private ์ Access Levels ๋ฅผ ๊ฐ๋๋ก ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์ง์ ๊ตฌํํ ์ ์๋ค.
class SomeClass {
private var _id: String = ""
var id: String {
get {
_id
}
}
func setId(_ id: String) {
self._id = id
}
}
let someClass = SomeClass()
someClass.id = "A" // error: cannot assign to property: 'id' is a get-only property
someClass.setId("A")
print(someClass.id) // A
Getters ๋ internal ์ Access Levels ๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์ ์ธ๋ถ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ์ง๋ง, Setters ๋ private ์ Access Levels ๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์
๋ด๋ถ์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํด setId(_:)
๋ฉ์๋๋ฅผ ์ด์ฉํ ์ ๊ทผ๋ง ํ์ฉ๋๋ค.
3 ) internal private(set)
Swift ๋ ์์ ๊ฐ์ด ์๋๋๋ ์๋ก ๋ค๋ฅธ Access Levels ๋ฅผ ๊ฐ๋ Properties ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ ์ ์๋ค.
class SomeClass {
internal private(set) var id: String = ""
func setId(_ id: String) {
self.id = id
}
}
internal
Variables ์ Setters ์ Access Levels ๋ฅผ private
์ผ๋ก ์ ์ธํ๋ฉด Swift ๊ฐ ์ด์ ๋ง๊ฒ Compile ํ๋ค.
(internal Variables ์ Getters ๋ internal ์ด๋ค.)
let someClass = SomeClass()
someClass.id = "A" // error: cannot assign to property: 'id' is a get-only property
someClass.setId("A")
print(someClass.id) // A
4 ) private(set)
๊ทธ๋ฐ๋ฐ SomeClass
Types ์ Access Levels ๊ฐ internal ์ด๋ค.
์์์ ์ค๋ช
ํ๋ฏ์ด Types ์ Access Levels ๊ฐ Open ๋๋ Public ์ผ ๊ฒฝ์ฐ Properties ๊ฐ ์์์ ์ผ๋ก Internal ์ด ๋์ง๋ง Types ์
Access Levels ๊ฐ Internal ์ดํ์ผ ๊ฒฝ์ฐ Properties ๋ ์์์ ์ผ๋ก Types ์ Access Levels ๋ฅผ ๋ฐ๊ฒ ๋๋ค.
๋ฐ๋ผ์ Properties ๊ฐ ์์์ ์ผ๋ก Types ์ Access Levels ๋ฅผ ๋ฐ๋๋ก ์๋ตํ๊ณ Setters ์ Access Levels ๋ง ์ง์ ํด
์งง์ ํํ๋ก ์ ์ํ ์ ์๋ค.
internal private(set)
-> private(set)
class SomeClass {
private(set) var id: String = ""
func setId(_ id: String) {
self.id = id
}
}
let someClass = SomeClass()
someClass.id = "A" // error: cannot assign to property: 'id' is a get-only property
someClass.setId("A")
print(someClass.id) // A
๊ฒฐ๊ตญ Stored Properties ๋ Backing Storage ์ ๋ํ ์ ๊ทผ์ Access Levels ์ ๋ฐ๋ผ ์ ๊ณตํ๊ธฐ ์ํด Computed Properties ์ ์ ์ฌํ ํํ์ ๊ตฌํ์ ์์์ ์ผ๋ก ์ ๊ณตํ๊ณ ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์ฆ, Access Levels ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ๋๋
Getters
์Setters
๋ ๋ช ์์ ์ผ๋ก ๊ตฌํ์ ํ๋ ์์์ ์ผ๋ก ๊ตฌํ์ด ๋๋ Stored Properties ์ Computed Properties ๋ชจ๋์ ์ ์ฉ๋๋ค.
๋ค์ ์์ ๋ โvalueโ ๊ฐ ๋ฐ๋ ๋๋ง๋ค ๋ณ๊ฒฝ ํ์๋ฅผ ์นด์ดํธ ํ๋ โnumberOfEditsโ ๊ฐ 1์ฉ ์ฆ๊ฐํ๋๋ก โvalueโ ์์ ์๊ฒ Observer ๋ฅผ ์ฌ์ฉํ๊ณ ,
numberOfEdits ๋ ๋ด๋ถ์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋๋ก private(set)
์ ์ด์ฉํด ์ ์ํ์๋ค.
struct TrackedString {
private(set) var numberOfEdits = 0
var value: String = "" {
didSet {
numberOfEdits += 1
}
}
}
var tracking = TrackedString()
print(tracking.numberOfEdits) // 0
tracking.value = "A"
print(tracking.numberOfEdits) // 1
tracking.value = "B"
print(tracking.numberOfEdits) // 2
tracking.value += "C"
print(tracking.numberOfEdits) // 3
8. Initializers ๐ฉโ๐ป
1. Initializers
- Custom Initializers ๋ Types ๋ณด๋ค ๋์ ์์ค์ Access Levels ๋ฅผ ๊ฐ์ง ์ ์๋ค.
- ๋จ, Required Initializers ๋ Types ๋ ์์ ์ด ์ํ Class ์ ๋์ผํ Access Level ์ ๊ฐ์ ธ์ผํ๋ค.
- Functions ์ ๋ง์ฐฌ๊ฐ์ง๋ก Parameters ๋ณด๋ค ๋์ ์์ค์ Access Levels ๋ฅผ ๊ฐ์ง ์ ์๋ค. (e.g. Guiding Principle of Access Levels, Function Types)
Access Levels
- Custom Initializers โค Types
- Required Initializers = Types
- Initializers โค Parameters
2. Default Initializers
Default Initializers ๊ฐ ์์ฑ๋๋ ์กฐ๊ฑด์ ๋ง์กฑํ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ Access Levels ๋ฅผ ๊ฐ๋๋ค.
Access Levels
- (internal, fileprivate, private) Default Initializers == Types
- (open, public) Default Initializers = internal
(open, public) Types ์ ์ํด ์์ฑ๋๋ Default Initializers ๋
internal
์ด๋ค. ๋ฐ๋ผ์ ์ธ๋ถ ๋ชจ๋์ arguments ๊ฐ ์๋ (open, public) Initializers ๋ฅผ ์ ๊ณตํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ช ์์ ์ผ๋กno-argument Initializer
๋ฅผ ์ ์ํด์ผํ๋ค.
3. Default Memberwise Initializers for Structure
Access Levels
- Structures ์ ๋ชจ๋ Stored Properties ๊ฐ private -> Default Memberwise Initializers ๋ private
- Structures ์ ๋ชจ๋ Stored Properties ๊ฐ fileprivate -> Default Memberwise Initializers ๋ fileprivate
- ๊ทธ ์ธ -> Default Memberwise Initializers ๋ internal
Default Initializers ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธ๋ถ ๋ชจ๋์ Memberwise Initializers ๋ฅผ ์ ๊ณตํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ช ์์ ์ผ๋ก
Public Memberwise Initializers
๋ฅผ ์ ์ํด์ผํ๋ค.
9. Protocols ๐ฉโ๐ป
1. Protocols
- Protocols ์ ๊ธฐ๋ณธ Access Levels ๋ internal ์ด๋ค.
- Protocols ์ Types ์ ๋ช ์์ ์ผ๋ก Access Levels ๋ฅผ ์ ํํด ํน์ context ๋ด์์๋ง ์ฑํ(adoption)๋ ์ ์๋๋ก ํ ์ ์๋ค.
Access Levels
- Requirements = Protocols
- Requirements ์ Access Levels ๋ฅผ Protocols ์ ๋ค๋ฅด๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
- ๋ค๋ฅธ Types ์ ๋ค๋ฅด๊ฒ Protocols ๊ฐ (open, public) ์ผ ๋ Requirements ์ญ์ ๋์ผํ (open, public) Access Levels ๋ฅผ ๊ฐ๋๋ค.
2. Protocol Inheritance
Access Levels
- Sub Protocols โค Super Protocols
3. Protocol Conformance
Access Levels
- Protocols โค Types
- Requirements = min(Types, Protocols)
protocol SomeProtocol {
var protocolProperty: Int { get }
}
protocol SomePrivateProtocol {
var privateProtocolProperty: Int { get }
}
struct SomeStructure: SomeProtocol, SomePrivateProtocol {
var protocolProperty: Int
var privateProtocolProperty: Int
}
var some = SomeStructure(protocolProperty: 10, privateProtocolProperty: 30)
print(some.protocolProperty) // 10
some.protocolProperty = 5
print(some.protocolProperty) // 5
print(some.privateProtocolProperty) // 30
some.privateProtocolProperty = 50
print(some.privateProtocolProperty) // 50
Setters ๋ฅผ ์ ์ธํ ๋ค๋ฅธ ๊ฒฝ์ฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก Protocols ๊ฐ private ์ด์ด๋ ์ค์ Requirements ๋ fileprivate ๊น์ง๋ ํ์ฉ์ด ๋๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
Objective-C ์ ๋ง์ฐฌ๊ฐ์ง๋ก Protocols ์
Conformance
๋ Global ์ด๋ค. ํ ํ๋ก๊ทธ๋จ ๋ด์์ ์๋ก ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก Protocol ์ ์ค์ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
10. Extensions ๐ฉโ๐ป
1. Extensions
Classes, Structures, Enumerations ๋ฅผ ํ์ฅํ๋ฉด ๊ธฐ์กด Types ์ Members ๊ฐ ๊ฐ๋ default Access Levels ๋ฅผ ๋์ผํ๊ฒ ๊ฐ๋๋ค.
Extensions ์ Access Levels ๋ฅผ ์ ์ํ๋ฉด, Extensions ์ ์ํด ์ถ๊ฐ๋๋ ๊ธฐ๋ฅ์ ๋ํด ์์์ ์ผ๋ก ์ ์๋๋ Access Levels ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
Access Levels
- Extensions โค Types
- (open, public) Types ๋ฅผ Extensions -> internal Members
- (internal, fileprivate, private) Types ๋ฅผ Extensions -> (internal, fileprivate, private) Members
struct SomeStruct {
var number: Int
func double() -> Int { self.number * 2 }
}
private extension SomeStruct {
func triple() -> Int { self.number * 3 }
}
var some = SomeStruct(number: 5)
some.number // 5
some.double() // 10
some.triple() // 15
Extensions ๋ฅผ private ์ผ๋ก ์ ์ํ๋ฉด, Extensions ์ ์ํด ์ถ๊ฐ๋๋ ๊ธฐ๋ฅ์ private ์ผ๋ก ์ ์๋๋ค(๋ฌผ๋ก ์ ๋ค๋ฅธ ๊ฒฝ์ฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก fileprivate ์ ํ์ฉ์ด ๋๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค).
2. Private Members in Extensions
Extensions ์ด Classes, Structures, Enumerations ์ ๊ฐ์ ํ์ผ์ ์กด์ฌ
ํ ๊ฒฝ์ฐ,
Original ๊ณผ Extensions ๋ ์ฒ์๋ถํฐ ๋จ์ผ Original Types ์ ์ ์๋ ๊ฒ์ฒ๋ผ ์๋ํ๋ค.
struct Origin {
private let originNumber = 5
func printExtensionNumber() { print(doubleNumber) }
}
extension Origin {
private var doubleNumber: Int { originNumber * 2 }
func printAnotherExtensionNumber() { print(tripleNumber) }
}
extension Origin {
private var tripleNumber: Int { originNumber * 3 }
func printOriginNumber() { print(originNumber) }
}
var someStructure = Origin()
someStructure.printExtensionNumber() // 10
someStructure.printAnotherExtensionNumber() // 15
someStructure.printOriginNumber() // 5
11. Generics ๐ฉโ๐ป
Generic Types ๋๋ Generic Functions ์ Access Levels ๋ ์๊ธฐ ์์ ๋๋ Type Parameters ์ Constraints ์ค ์ต์๊ฐ์ผ๋ก ์ ํด์ง๋ค.
Access Levels
Generic Types, Generic Functions = min(itself, Type Parameters)
12. Type Aliases ๐ฉโ๐ป
Type Aliases
์ญ์ Swift ์ ๋ค๋ฅธ Types ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ณ ์ ํ Types ๊ฐ ๋๋ค. ๋ฐ๋ผ์ Type Aliases ๋ฅผ ์ฌ์ฉํด ๊ธฐ์กด Types ์
Access Levels ๋ฅผ Original ๊ณผ ๊ฐ๊ฑฐ๋ ๋ฎ๊ฒ ๋ณ๊ฒฝํด ๊ณ ์ ์ Types ๋ฅผ ๋ง๋ค ์ ์๋ค.
Access Levels
Type Aliases โค Types
struct SomeStruct {
var number: Int
func double() -> Int { self.number * 2 }
}
private typealias PrivateStruct = SomeStruct
public typealias PublicStruct = SomeStruct // Type alias cannot be declared public because its underlying
Original Types ๊ฐ internal ์ด๊ธฐ ๋๋ฌธ์ public ์ผ๋ก Access Levels ๋ฅผ ๋ ๊ฐ๋ฐฉํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
var privateStruct = PrivateStruct(number: 5) // error: variable must be declared private or fileprivate because its type 'PrivateStruct' (aka 'SomeStruct') uses a private type
Private Types ์ด๋ฏ๋ก Internal Variables ์ ํ ๋นํ ์ ์๋ค.
private var privateStruct = PrivateStruct(number: 5)
privateStruct.number // 5
privateStruct.double() // 10
์ด Rule ์ Protocols ์ ์ค์์ฑ(conformances)๋ฅผ ์ถฉ์กฑํ๋๋ก ํ๋๋ฐ ์ฌ์ฉ๋๋ Associated Types ์๋ ์ ์ฉ๋๋ค.
Reference
- โAccess Control.โ The Swift Programming Language Swift 5.7. accessed Mar. 29, 2023, Swift Docs Chapter 26 - Access Control.