-
[Swift] Access Control (์ ๊ทผ ์ ์ด)Swift 2022. 2. 28. 16:54
Access Control
์ ๊ทผ ์ ์ด๋ ๋ค๋ฅธ ์์ค ํ์ผ ๋ฐ ๋ชจ๋์ ์๋ ์ฝ๋์ ์ฝ๋ ์ผ๋ถ์ ๋ํ ์ ๊ทผ์ ์ ํํ๋ค. ์ด ๊ธฐ๋ฅ์ ์ฝ๋์ ์ธ๋ถ ๊ตฌํ ์ ๋ณด๋ฅผ ์จ๊ธฐ๊ณ , ํด๋น ์ฝ๋์ ์ ๊ทผํ๊ณ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ณธ ์ธํฐํ์ด์ค๋ฅผ ์ง์ ํ ์ ์๋ค.
๊ฐ๋ณ ํ์ (ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ) ๋ฟ๋ง ์๋๋ผ ํด๋น ํ์ ์ ์ํ๋ ์์ฑ, ๋ฉ์๋, ์ด๋์ ๋ผ์ด์ ๋ฐ ์๋ธ์คํฌ๋ฆฝํธ์๋ ํน์ ์ ๊ทผ ๋ ๋ฒจ์ ์ง์ ํ ์ ์๋ค. ํ๋กํ ์ฝ์ ์ ์ญ ์์, ๋ณ์, ํจ์์ฒ๋ผ ํน์ ์ปจํ ์คํธ๋ก ์ ํ๋ ์ ์๋ค.
Swift๋ ๋ค์ํ ๋ ๋ฒจ์ ์ ๊ทผ ์ ์ด๋ฅผ ์ ๊ณตํ ๋ฟ๋ง ์๋๋ผ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค์ ๋ํ ๊ธฐ๋ณธ ์ ๊ทผ ๋ ๋ฒจ์ ์ ๊ณตํ์ฌ ๋ช ์์ ์ผ๋ก ์ ๊ทผ ์ ์ด ๋ ๋ฒจ์ ์ง์ ํ ํ์์ฑ์ ์ค์ฌ์ค๋ค. ์ค์ ๋ก single-target ์ฑ์ ๋ง๋ค ๊ฒฝ์ฐ, ๋ช ์์ ์ผ๋ก ์ ๊ทผ ์ ์ด ๋ ๋ฒจ์ ์ง์ ํ ํ์๊ฐ ์๋ค.
์ ๊ทผ ์ ์ด๋ฅผ ์ ์ฉํ ์ ์๋ ์ฝ๋์ ๋ค์ํ ์ธก๋ฉด (ํ๋กํผํฐ, ํ์ , ํจ์ ๋ฑ)์ ๊ฐ๋ตํ๊ฒ ํ๊ธฐ ์ํด ์ด์ "Entities"๋ผ๊ณ ํ๋ค.
Modules and Source Files
Swift์ ์ ๊ทผ ์ ์ด ๋ชจ๋ธ์ ๋ชจ๋ ๋ฐ ์์ค ํ์ผ์ ๊ฐ๋ ์ ๊ธฐ์ดํ๋ค.
๋ชจ๋์ ์ฝ๋ ๋ฐฐํฌ์ ๋จ์ผ ๋จ์๋ก ๊ตฌ์ถ๋์ด ์ ๊ณต๋๋ฉฐ Swift์ import ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ๋ชจ๋์์ ๊ฐ์ ธ์ฌ ์ ์๋ ํ๋ ์์ํฌ ๋๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด๋ค.
Xcode์ ๊ฐ ๋น๋ ํ๊ฒ (์ฑ ๋ฒ๋ค ๋๋ ํ๋ ์์ํฌ)์ Swift์์ ๋ณ๋์ ๋ชจ๋๋ก ์ฒ๋ฆฌ๋๋ค. ์ฑ์ ์ฝ๋์ ์ฌ๋ฌ ์ธก๋ฉด์ ๋ ๋ฆฝํ ํ๋ ์์ํฌ๋ก ๊ทธ๋ฃนํํ๋ฉด (์๋ง๋ ์ฌ๋ฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํด๋น ์ฝ๋๋ฅผ ์บก์ํํ์ฌ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด) ํด๋น ํ๋ ์์ํฌ ๋ด์์ ์ ์ํ ๋ชจ๋ ๊ฒ๋ค์ ์ฑ ๋ด์์ ๊ฐ์ ธ์ ์ฌ์ฉํ๊ฑฐ๋ ๋ค๋ฅธ ํ๋ ์์ํฌ ๋ด์์ ์ฌ์ฉ๋ ๋ ๋ณ๋ ๋ชจ๋์ ์ผ๋ถ๊ฐ ๋๋ค.
์์ค ํ์ผ์ ๋ชจ๋ ๋ด์ ๋จ์ผ Swift ์์ค ์ฝ๋ ํ์ผ์ด๋ค (์ฌ์ค์ ์ฑ ๋๋ ํ๋ ์์ํฌ ๋ด์ ๋จ์ผ ํ์ผ). ๊ฐ๋ณ ํ์ ์ ๋ถ๋ฆฌ๋ ์์ค ํ์ผ์ ์ ์ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด์ง๋ง, ํ๋์ ์์ค ํ์ผ์๋ ์ฌ๋ฌ ํ์ , ํจ์ ๋ฑ์ ๋ํ ์ ์๊ฐ ํฌํจ๋ ์ ์๋ค.
Access Levels
Swift๋ ์ฝ๋ ๋ด์ ์ํฐํฐ์ ๋ํด 5๊ฐ์ง ์ ๊ทผ ๋ ๋ฒจ์ ์ ๊ณตํ๋ค. ์ด ์ ๊ทผ ๋ ๋ฒจ๋ค์ ์ํฐํฐ๊ฐ ์ ์๋ ์์ค ํ์ผ๊ณผ ๊ด๋ จ์ด ์์ผ๋ฉฐ, ์์ค ํ์ผ์ด ์ํ ๋ชจ๋๋ค๊ณผ๋ ๊ด๋ จ์ด ์๋ค.
- Open access ์ public access ๋ฅผ ํตํด ์ํฐํฐ๋ฅผ ์ ์ํ ๋ชจ๋์ ์์ค ํ์ผ ๋ด์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ ์ํ ๋ชจ๋์ importํ๋ ๋ค๋ฅธ ๋ชจ๋์ ์์ค ํ์ผ์์๋ ์ฌ์ฉํ ์ ์๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ๋ ์์ํฌ์ ๋ํ ๊ณต์ฉ ์ธํฐํ์ด์ค๋ฅผ ์ง์ ํ ๋ open ๋๋ public ์ ๊ทผ์ ์ฌ์ฉํ๋ค. open ๊ณผ public์ ์ฐจ์ด์ ์ ์๋์ ์ค๋ช ๋์ด์๋ค.
- Internal access ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ํ ๋ชจ๋์ ๋ชจ๋ ์์ค ํ์ผ ๋ด์์ ์ํฐํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง, ํด๋น ๋ชจ๋ ์ธ๋ถ์ ์์ค ํ์ผ์์๋ ์ฌ์ฉํ ์ ์๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฑ ๋๋ ํ๋ ์์ํฌ์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ ์ํ ๋ internal ์ ๊ทผ์ ์ฌ์ฉํ๋ค.
- File-private access ๋ ์ํฐํฐ์ ์ฌ์ฉ์ ์์ฒด์ ์ผ๋ก ์ ์ํ ์์ค ํ์ผ๋ก ์ ํํ๋ค. ํน์ ๊ธฐ๋ฅ์ ์ธ๋ถ ์ ๋ณด๊ฐ ์ ์ฒด ํ์ผ ๋ด์์ ์ฌ์ฉ๋ ๊ฒฝ์ฐ, ํด๋น ์ธ๋ถ ๊ตฌํ ์ ๋ณด๋ฅผ ์จ๊ธธ ๋ file-private access๋ฅผ ์ฌ์ฉํ๋ค.
- Private access ๋ ์ํฐํฐ๋ฅผ ํฌํจํ๋ ์ ์ธ๊ณผ ๊ฐ์ ํ์ผ์ ์๋ ์ ์ธ์ ํ์ฅ์๋ก ์ ํํ๋ค. ํน์ ๊ธฐ๋ฅ์ ๊ตฌํ ์ธ๋ถ ์ ๋ณด๊ฐ ๋จ์ผ ์ ์ธ ๋ด์์๋ง ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ, ์ด๋ฌํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์จ๊ธธ ๋ ์ฌ์ฉํ๋ค.
Open access๋ ๊ฐ์ฅ ๋์ (๊ฐ์ฅ ์ ํ์ ์ด์ง ์์) ์ ๊ทผ ๋ ๋ฒจ์ด๋ฉฐ, private access๊ฐ ๊ฐ์ฅ ๋ฎ์ (๊ฐ์ฅ ์ ํ์ ์ธ) ์ ๊ทผ ๋ ๋ฒจ์ด๋ค.
Open access๋ ํด๋์ค, ํด๋์ค ๋ฉค๋ฒ์๊ฒ๋ง ์ ์ฉ๋๋ฉฐ, Subclassing์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ ๋ชจ๋ ์ธ๋ถ์ ์ฝ๋๊ฐ ์๋ธํด๋์ค์ ์ค๋ฒ๋ผ์ด๋๋ฅผ ํ์ฉํ๊ธฐ ๋๋ฌธ์ public access์๋ ๋ค๋ฅด๋ค. ํด๋์ค๋ฅผ open์ผ๋ก ๋ช ์ํ ๊ฒ์ ํด๋น ํด๋์ค๋ฅผ ์ํผ ํด๋์ค๋ก ์ฌ์ฉํ๋ ๋ค๋ฅธ ๋ชจ๋์ ์ฝ๋๊ฐ ๋ฏธ์น๋ ์ํฅ์ ๊ณ ๋ คํ์ผ๋ฉฐ ์ด์ ๋ฐ๋ผ ํด๋์ค์ ์ฝ๋๋ก ์ค๊ณํ์์ ๋ํ๋ธ๋ค.
open > public > internal > file-private > private
Guiding Principle of Access Levels
Swift์ ์ ๊ทผ ๋ ๋ฒจ์ ์ ๋ฐ์ ์ธ guiding ์์น์ ๋ฐ๋ฅธ๋ค: ๋ ๋ฎ์ (๋ ์ ํ์ ์ธ) ์ ๊ทผ ๋ ๋ฒจ์ ๊ฐ์ง ๋ค๋ฅธ ์ํฐํฐ์ ์ฉ์ด๋ก ์ ์๋ ์ ์๋ ์ํฐํฐ๋ ์๋ค.
์๋ฅผ ๋ค๋ฉด:
- public ๋ณ์๋ internal, file-private ๋๋ private ํ์ ์ ๊ฐ๋ ๊ฒ์ผ๋ก ์ ์ํ ์ ์๋ค. ์ด ํ์ ์ public ๋ณ์๊ฐ ์ฌ์ฉ๋๋ ๋ชจ๋ ๊ณณ์์ ์ฌ์ฉํ ์ ์๋ค.
- ํจ์๋ ์ฃผ๋ณ ์ฝ๋์์ ๊ตฌ์ฑ ํ์ ์ ์ฌ์ฉํ ์ ์๋ ์ํฉ์์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋งค๊ฐ๋ณ์ ํ์ ๋ฐ ๋ฆฌํด ํ์ ๋ณด๋ค ๋์ ์ ๊ทผ ๋ ๋ฒจ์ ๊ฐ์ง ์ ์๋ค.
์ธ์ด์ ๋ค์ํ ์ธก๋ฉด์ ๋ํ ์ด guiding ์์น์ ๊ตฌ์ฒด์ ์ธ ๊ฒ๋ค์์ ์๋์ ์์ธํ ์ค๋ช ๋์ด์๋ค.
Default Access Levels
๋ช ๊ฐ์ง ํน์ ์ํฐํฐ๋ฅผ ์ ์ธํ๊ณ ์ฝ๋์ ๊ฑฐ์ ๋ชจ๋ ์ํฐํฐ๋ ์ฌ์ฉ์๊ฐ ์ง์ ๋ช ์์ ์ผ๋ก ์ ๊ทผ ๋ ๋ฒจ์ ์ง์ ํ์ง ์์๋ default ์์ค์ ์ ๊ทผ ๋ ๋ฒจ์ ๊ฐ๋๋ค. ๋ฐ๋ผ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ฝ๋์ ๋ช ์์ ์ ๊ทผ ๋ ๋ฒจ์ ์ง์ ํ ํ์๊ฐ ์๋ค.
Access Levels for Single-Target Apps
๊ฐ๋จํ single-target ์ฑ์ ์์ฑํ ๋, ์ฑ์ ์ฝ๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ฑ ๋ด์ ์์ฒด์ ์ผ๋ก ํฌํจ๋์ด ์์ผ๋ฏ๋ก ์ฑ ๋ชจ๋ ์ธ๋ถ์์ ์ฌ์ฉํ ์ ์๋๋ก ํ ํ์๊ฐ ์๋ค. ๊ธฐ๋ณธ ์ ๊ทผ ๋ ๋ฒจ์ด ์ด๋ฏธ ์ด ์๊ตฌ์ฌํญ๊ณผ ์ผ์นํ๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์ ์ ์ ์ ๊ทผ ๋ ๋ฒจ์ ์ง์ ํ ํ์๊ฐ ์๋ค. ๊ทธ๋ฌ๋ ์ฑ ๋ชจ๋ ๋ด์ ๋ค๋ฅธ ์ฝ๋๋ก๋ถํฐ ๊ตฌํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์จ๊ธฐ๊ธฐ ์ํด ์ฝ๋์ ์ผ๋ถ๋ฅผ file-private ๋๋ private์ผ๋ก ํ์ํ ์ ์๋ค.
Access Levels for Frameworks
ํ๋ ์์ํฌ๋ฅผ ๊ฐ๋ฐํ ๋, ํด๋น ํ๋ ์์ํฌ์ ๋ํ ๊ณต์ฉ ์ธํฐํ์ด์ค๋ฅผ open ๋๋ public์ผ๋ก ํ์ํ์ฌ ํ๋ ์์ํฌ๋ฅผ importํ๋ ์ฑ๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋ชจ๋์์ ๋ณด๊ณ ์ ๊ทผํ ์ ์๋๋ก ํ๋ค. ์ด public-facing ์ธํฐํ์ด์ค๋ ํ๋ ์์ํฌ๋ฅผ ์ํ API์ด๋ค.
ํ๋ ์์ํฌ์ ๋ชจ๋ ๋ด๋ถ ๊ตฌํ ์ธ๋ถ ์ ๋ณด๋ ์ฌ์ ํ ๊ธฐ๋ณธ ์ ๊ทผ ๋ ๋ฒจ์ธ internal์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ํ๋ ์์ํฌ์ ๋ด๋ถ ์ฝ๋์ ๋ค๋ฅธ ๋ถ๋ถ์์ ์จ๊ธฐ๋ ค๋ฉด private ๋๋ file-private๋ก ๋งํฌํ๋ฉด ๋๋ค. ์ํฐํฐ๊ฐ ํ๋ ์์ํฌ API์ ์ผ๋ถ๊ฐ ๋๊ธฐ๋ฅผ ๋ฐ๋๋ค๋ฉด open ๋๋ public์ผ๋ก ํ์ํด์ผํ๋ค.
Access Levels for Unit Test Targets
๋จ์ ํ ์คํธ ๋์์ผ๋ก ์ฑ์ ์์ฑํ ๋, ํ ์คํธ๋ฅผ ์ํด ์ฑ์ ์ฝ๋๋ฅผ ํด๋น ๋ชจ๋์ ์ ๊ณตํด์ผํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ๋ชจ๋์์๋ open ๋๋ public์ผ๋ก ํ์๋ ์ํฐํฐ๋ง ์ ๊ทผํ ์ ์์๋ค. ํ์ง๋ง @testable ํน์ฑ์ ๊ฐ์ง ํ๋ก๋ํธ ๋ชจ๋์ importํ๊ณ ํ๋ก๋ํธ ๋ชจ๋์ ํ ์คํธ๊ฐ ํ์ฑํ๋ ์ํ๋ก ์ปดํ์ผํ๋ ๊ฒฝ์ฐ, ์ ๋ ํ ์คํธ ๋์์ ๋ด๋ถ ์ํฐํฐ์ ์ ๊ทผํ ์ ์๋ค.
์ ๋ฆฌ
Keyword Access Level Inheritance open ๊ฐ์ฅ ๋์ (์ ํ์ ์ด์ง ์์) ์ ๊ทผ ๋ ๋ฒจ์ผ๋ก, ํด๋์ค์ ํด๋์ค์ ๋ฉค๋ฒ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ. ๋ชจ๋ ์ธ๋ถ์์๋ ์ ๊ทผ ๊ฐ๋ฅ O public ๋ชจ๋ ์ธ๋ถ์์๋ ์ ๊ทผ ๊ฐ๋ฅ.ํด๋์ค์ ๊ตฌ์กฐ์ฒด ๋ชจ๋์์ ์ฌ์ฉ ๊ฐ๋ฅ. O internal ๊ฐ์ ๋ชจ๋ ๋ด๋ถ์์๋ง ์ ๊ทผ ๊ฐ๋ฅ. ๊ธฐ๋ณธ ์ ๊ทผ ๋ ๋ฒจ์ด๋ฏ๋ก ํ๊ธฐํ์ง ์์๋ ๋๋ค. ๋ฒ์ ๋ด์์๋ง ๊ฐ๋ฅ file-private ๊ฐ์ ํ์ผ ๋ด์์๋ง ์ ๊ทผ ๊ฐ๋ฅ ๋ฒ์ ๋ด์์๋ง ๊ฐ๋ฅ private ๊ฐ์ฅ ๋ฎ์ (์ ํ์ ์ธ) ์ ๊ทผ ๋ ๋ฒจ์ผ๋ก, ์ ์ํ ๋ธ๋ก ๋ด๋ถ์์๋ง ์ ๊ทผ ๊ฐ๋ฅ X ใ ค
ใ ค
'Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Delegate, Notification, KVO (0) 2022.03.15 [Swift] Copy On Write (COW) (0) 2022.03.03 [Swift] print ํจ์ (separator, terminator) (0) 2022.02.26 [Swift] UIColor (0) 2022.02.15 [Swift] CGColor (0) 2022.02.15