Skip to content

Latest commit

ย 

History

History
67 lines (44 loc) ยท 2.59 KB

AccessControl.md

File metadata and controls

67 lines (44 loc) ยท 2.59 KB

์ ‘๊ทผ ์ œ์–ด์ž์˜ ์ข…๋ฅ˜์—” ์–ด๋–ค๊ฒŒ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค

Answer

์ ‘๊ทผ ์ œ์–ด์ž์˜ ๋ฒ”์œ„๋ผ๊ณ  ํ•ด์•ผํ•˜๋‚˜ ์ ‘๊ทผ์ œ์–ด๊ฐ€ ๋ถ€์—ฌ๋  ์ˆ˜ ์žˆ๋Š” ํฐ ๋ฒ”์œ„๋กœ๋Š” module, source file์ด ์žˆ๋‹ค.

Module, Source File

module: ํ•˜๋‚˜์˜ framework๋ฅผ ์˜๋ฏธํ•œ๋‹ค. import ํ‚ค์›Œ๋“œ๋กœ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ๋“ค์„ ๋ชจ๋“ˆ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
source file: module์€ source file๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค. ~.swift ์™€ ๊ฐ™์€ ํŒŒ์ผ๋“ค์„ ์˜ˆ๋กœ ๋“ค ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

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

์ ‘๊ทผ ์ œ์–ด์ž์˜ ์ข…๋ฅ˜์—๋Š” 5๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • open, public
    ํ”„๋กœ์ ํŠธ ๋‚ด์˜ ๋ชจ๋“  module์—์„œ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ€์žฅ ๊ฐœ๋ฐฉ์ ์ธ ์ œ์–ด์ž์ด๋‹ค.

  • internal(default)
    ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋œ module์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋ณ„๋„๋กœ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด internal ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™๊ฒŒ๋œ๋‹ค.

  • fileprivate
    ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋œ source file ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ์–ดํ•œ๋‹ค. ๊ฐ™์€ source file์ด๋ผ๋ฉด ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ผ๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

  • private
    ๊ฐ€์žฅ ํ์‡„์ ์ธ ์ ‘๊ทผ ์ œ์–ด์ž์ด๋‹ค. ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋œ ๊ฐ์ฒด ์•ˆ์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    fileprivate์™€ ๋‹ค๋ฅด๊ฒŒ private ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์—ˆ๋‹ค๋ฉด ๊ฐ™์€ source file์ด๋ผ๋„ ์„œ๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์žˆ๋Š” ๊ฒฝ์šฐ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค.

open, public

๋‘˜์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

open ํ‚ค์›Œ๋“œ๋Š”

  • class ์•ž์—๋งŒ ๋ถ™์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์™œ๋ƒ๋ฉด open ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์—ˆ๋‹ค๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ subclassing์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋ชจ๋“ˆ A์—์„œ ๋งŒ๋“ค์–ด๋‘” class๋ฅผ ๋ชจ๋“ˆ B์—์„œ subclassingํ•˜์—ฌ superClass๋กœ ์‚ผ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋“ˆ A์˜ class๊ฐ€ open ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋˜์–ด์•ผ ํ•œ๋‹ค.

์ ‘๊ทผ ์ œ์–ด์ž์˜ ์†Œ์†Œํ•œ ํŠน์ด์ 

  • setter๋Š” getter๋ณด๋‹ค ๋” ์ œํ•œ์ ์ธ ์ ‘๊ทผ ์ œ์–ด์ž๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

    // get์€ internal set์€ private  
    private (set) var name: String
  • protocol์—์„œ ์œ„๋ฅผ ํ™œ์šฉํ•˜๋ ค๋ฉด ์„œ๋กœ ๊ทœ์น™์„ ์ง€์ผœ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

private (set)์„ ํ”„๋กœํ† ์ฝœ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด protocol ์กฐ๊ฑด์„ ์ž˜ ๋งž์ถ”์–ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ protocol ๊ตฌํ˜„์ฒด์—์„œ set์— ๋Œ€ํ•ด private ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ด๊ณ  ์‹ถ๋‹ค๋ฉด protocol์—์„œ ๋˜ํ•œ { get set }์ด ์•„๋‹Œ { get }๋งŒ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

protocol Game {
    var theShow: String { get }
}

struct Ps5: Game {
    private (set) theShow: String
}
  • Unit Test๋ฅผ ํ•  ๋•Œ์—๋Š” @testable ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ž„์œผ๋กœ์จ public๊ณผ open์ด ์•„๋‹Œ entity๋“ค๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒํ•ด์ค๋‹ˆ๋‹ค.
@testable import {target_name}