Skip to content

Latest commit

ย 

History

History
372 lines (258 loc) ยท 17.4 KB

File metadata and controls

372 lines (258 loc) ยท 17.4 KB

Access Control

์ƒ์„ฑ์ผ: 2022๋…„ 7์›” 25์ผ ์˜คํ›„ 10:42

Access Control - The Swift Programming Language (Swift 5.7)

Access Control

  • ํŠน์ • ์ฝ”๋“œ์˜ ์ ‘๊ทผ์„ ๋‹ค๋ฅธ ์†Œ์ŠคํŒŒ์ผ์ด๋‚˜ ๋ชจ๋“ˆ์—์„œ ์ œํ•œํ•˜๋Š” ๊ฒƒ
  • ์„ธ๋ถ€์ ์ธ ๊ตฌํ˜„์€ ๊ฐ์ถ”๊ณ  ํ•„์š”ํ•œ ๋งŒํผ ๊ณต๊ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ๊ฐœ๋ณ„ ํƒ€์ž…(individual types)(ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐ)๋งŒ ์•„๋‹ˆ๋ผ, ํ•ด๋‹น ํƒ€์ž…์— ์†ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ, ๋ฉ”์†Œ๋“œ, ์ด๋‹ˆ์…œ๋ผ์ด์ € ๋ฐ ์ฒจ์ž(subscripts)์— ๋Œ€ํ•ด ํŠน์ • ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ์ง€์ • ๊ฐ€๋Šฅ
  • Swift๋Š” ๋‹ค์–‘ํ•œ ์ˆ˜์ค€์˜ ์ ‘๊ทผ ์ œ์–ด ์™ธ์—๋„ ์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ์ œ๊ณต
    • ๋ช…์‹œ์  ์ ‘๊ทผ ์ œ์–ด ๋ ˆ๋ฒจ์„ ์ง€์ •ํ•  ํ•„์š”์„ฑ์„ ์ค„์—ฌ์คŒ
๐Ÿ’ก ์ ‘๊ทผ ์ œ์–ด๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์˜ ๋‹ค์–‘ํ•œ ์ธก๋ฉด(ํ”„๋กœํผํ‹ฐ, ํƒ€์ž…, ํ•จ์ˆ˜ ๋“ฑ)์„ ๊ฐ„๋‹จํ•˜๊ฒŒ `์—”ํ‹ฐํ‹ฐ` ๋ผ๊ณ  ํ•œ๋‹ค.

Modules and Source Files

  • Swift์˜ ์ ‘๊ทผ ์ œ์–ด๋Š” ๋ชจ๋“ˆ๊ณผ ์†Œ์ŠคํŒŒ์ผ์— ๊ธฐ๋ฐ˜์„ ๋‘๊ณ  ์žˆ๋‹ค.
  • ๋ชจ๋“ˆ: ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋‹จ์ผ ๋‹จ์œ„๋กœ ํ•˜๋‚˜์˜ ํ”„๋ ˆ์ž„์›Œํฌ(UIKit ๋“ฑ)๋‚˜ ์•ฑ / import๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ์†Œ์ŠคํŒŒ์ผ: ๋ชจ๋“ˆ ๋‚ด์˜ ๋‹จ์ผ Swift ์†Œ์Šค ์ฝ”๋“œ ํŒŒ์ผ

Access Levels

๋‹ค์„ฏ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ ˆ๋ฒจ ์กด์žฌ

  • Open / Public : ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • Open์€ ํด๋ž˜์Šค ๋ฐ ํด๋ž˜์Šค ๊ตฌ์„ฑ์›์—๊ฒŒ๋งŒ ์ ์šฉ ๊ฐ€๋Šฅ
    • Open์€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์˜ค๋ฒ„๋ผ์ด๋“œ์™€ ์„œ๋ธŒํด๋ž˜์‹ฑ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, Public์€ ๋ถˆ๊ฐ€๋Šฅ (Public์€ ์ •์˜๋œ ๋ชจ๋“ˆ ๋‚ด์—์„œ๋งŒ ์„œ๋ธŒ ํด๋ž˜์‹ฑ, ์˜ค๋ฒ„๋ผ์ด๋“œ ๊ฐ€๋Šฅ)
    • ํด๋ž˜์Šค๋ฅผ Open์œผ๋กœ ํ‘œ์‹œํ•˜๋ฉด ๋‹ค๋ฅธ ๋ชจ๋“ˆ์˜ ์ฝ”๋“œ๊ฐ€ ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๊ณ ๋ คํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์„ค๊ณ„ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ„
  • Internal : ๊ธฐ๋ณธ ์ ‘๊ทผ๋ ˆ๋ฒจ๋กœ ํ•ด๋‹น ๋ชจ๋“ˆ ์ „์ฒด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • File-private: ํŠน์ • ์—”ํ‹ฐํ‹ฐ๋ฅผ ์„ ์–ธํ•œ ํŒŒ์ผ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • Private: ํŠน์ • ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์„ ์–ธ๋œ ๊ด„ํ˜ธ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
๐Ÿ’ก ์ ‘๊ทผ ๋ ˆ๋ฒจ์€ ์œ„ โ†’ ์•„๋ž˜ ์ˆœ์œผ๋กœ ๋†’๋‹ค(์ œ์•ฝ์ด ์—†๋Š”) โ†’ ๋‚ฎ๋‹ค(์ œ์•ฝ์ด ๋งŽ์€) ์ˆœ

์ ‘๊ทผ๋ ˆ๋ฒจ ๊ฐ€์ด๋“œ ์›์น™ (Guiding Principle of Access Levels)

์ผ๋ฐ˜ ๊ฐ€์ด๋“œ ์›์น™์„ ๋”ฐ๋ฅธ๋‹ค.

โ†’ ๋” ๋‚ฎ์€(๋” ์ œํ•œ์ ) ๋ ˆ๋ฒจ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ์—”ํ‹ฐํ‹ฐ์— ํŠน์ • ์—”ํ‹ฐํ‹ฐ๋ฅผ ์„ ์–ธํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

  • public ๋ณ€์ˆ˜๋Š” ๋‹ค๋ฅธ internal, file-private ํ˜น์€ private ํƒ€์ž…์—์„œ ์ •์˜๋  ์ˆ˜ ์—†๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ ํƒ€์ž…์€ public ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์—†์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—.
  • ํ•จ์ˆ˜๋Š” ๊ทธ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์ด๋‚˜ ๋ฆฌํ„ด ๊ฐ’ ํƒ€์ž…๋ณด๋‹ค ๋” ๋†’์€ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•จ์ˆ˜์—๋Š” ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅ ํ•˜๊ฑฐ๋‚˜ ํ˜น์€ ๋ฐ˜ํ™˜ ๊ฐ’ ํƒ€์ž…๋ณด๋‹ค ์ ‘๊ทผ ๋ ˆ๋ฒจ์ด ๋‚ฎ์•„ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ด€๋ จ ์ฝ”๋“œ์—์„œ ์ด์šฉํ•  ์ˆ˜ ์—†์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—.

๊ธฐ๋ณธ ์ ‘๊ทผ๋ ˆ๋ฒจ (Default Access Levels)

์•„๋ฌด๋Ÿฐ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๋ช…์‹œํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ internal์„ ๊ฐ–๊ฒŒ ๋œ๋‹ค.

๋‹จ์ผ ํƒ€๊ฒŸ ์•ฑ์„ ์œ„ํ•œ ์ ‘๊ทผ๋ ˆ๋ฒจ (Access Levels for Single-Target Apps)

๋‹จ์ผ ํƒ€๊ฒŸ ์•ฑ์—์„œ๋Š” ํŠน๋ณ„ํžˆ ์ ‘๊ทผ๋ ˆ๋ฒจ์„ ๋ช…์‹œํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ ํ•„์š”์— ๋”ฐ๋ผ file-private, private๋“ฑ์„ ์‚ฌ์šฉํ•ด ์•ฑ๋‚ด์—์„œ ๊ตฌํ˜„ ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์œ„ํ•œ ์ ‘๊ทผ๋ ˆ๋ฒจ (Access Levels for Frameworks)

ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ฐœ๋ฐœํ•œ๋‹ค๋ฉด publicํ˜น์€ open์œผ๋กœ ์ง€์ •ํ•ด์„œ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๊ณ  ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

๐Ÿ’ก ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ตฌ์ฒด์  ๊ตฌํ˜„์„ ๊ฐ์ถ”๊ณ  ์‹ถ์€ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ๊ทธ ๋ถ€๋ถ„์€ `internal`๋กœ ์„ ์–ธํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋…ธ์ถœ ์‹œํ‚ค๊ณ  ์‹ถ์€ API๋งŒ `public` ํ˜น์€ `open`์œผ๋กœ ์ง€์ •ํ•œ๋‹ค.

์œ ๋‹›ํ…Œ์ŠคํŠธ ํƒ€๊ฒŸ์„ ์œ„ํ•œ ์ ‘๊ทผ๋ ˆ๋ฒจ (Access Levels for Unit Test Targets)

๊ธฐ๋ณธ์ ์œผ๋กœ open์ด๋‚˜ public์œผ๋กœ ์ง€์ •๋œ ์—”ํ‹ฐํ‹ฐ๋งŒ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์œ ๋‹›ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“ˆ import ์•ž์— @testable์ด๋ผ๋Š” ์—ํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด ํ•ด๋‹น ๋ชจ๋“ˆ์„ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“ˆ๋กœ ์ปดํŒŒ์ผํ•ด ์‚ฌ์šฉ****

์ ‘๊ทผ์ œ์–ด ๋ฌธ๋ฒ• (Access Control 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 ์ ‘๊ทผ๋ ˆ๋ฒจ์€ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.

์ปค์Šคํ…€ ํƒ€์ž… (Custom Types)

  • ์ปค์Šคํ…€ ํด๋ž˜์Šค์— ํŠน์ • ์ ‘๊ทผ๋ ˆ๋ฒจ ์ง€์ • ๊ฐ€๋Šฅ

โ†’ ํŠน์ • ํƒ€์ž…์˜ ์ ‘๊ทผ ๋ ˆ๋ฒจ ์ง€์ •์„ ํ•˜๋Š” ๊ฒƒ์€ ๊ทธ ํƒ€์ž… ๋ฉค๋ฒ„(ํ”„๋กœํผํ‹ฐ, ๋ฉ”์†Œ๋“œ ์ดˆ๊ธฐํ™”, ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ)์˜ ์ ‘๊ทผ ๋ ˆ๋ฒจ์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค.

  • ์˜ˆ์‹œ: file-private ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ–ˆ๋‹ค๋ฉด, file-private ํด๋ž˜์Šค๊ฐ€ ์ •์˜๋œ ์†Œ์Šค ํŒŒ์ผ ์•ˆ์—์„œ ํ”„๋กœํผํ‹ฐ, ๋˜๋Š” ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฐ˜ํ™˜๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๐Ÿ’ก public ํƒ€์ž…์€ ๊ธฐ๋ณธ์ ์œผ๋กœ internal ๋ฉค๋ฒ„๋ฅผ ๊ฐ–๋Š”๋‹ค. โ†’ public API๋ฅผ ๋งŒ๋“ค์‹œ ๋…ธ์ถœ๋˜์ง€ ๋ง์•„์•ผ ํ•  API๊ฐ€ ์‹ค์ˆ˜๋กœ ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋…ธ์ถœ์‹œํ‚ค๊ณ  ์‹ถ์€ ๋ฉค๋ฒ„๋Š” ๋ช…์‹œ์ ์œผ๋กœ `public` ์ ‘๊ทผ์ œ์–ด์ž๋ฅผ ๋ถ™์—ฌ์ค˜์•ผ ํ•œ๋‹ค.
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
}

Tuple Types

ํŠœํ”Œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ํƒ€์ž…์˜ ์ ‘๊ทผ๋ ˆ๋ฒจ ์ค‘ ๊ฐ€์žฅ ์ œํ•œ์ ์ธ ์ ‘๊ทผ๋ ˆ๋ฒจ์„ ๊ฐ–๋Š”๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋งŒ์•ฝ ํ•˜๋‚˜๋Š” internal ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” private ์ ‘๊ทผ ๊ถŒํ•œ์„ ๊ฐ–๋Š” 2๊ฐœ์˜ ํƒ€์ž…์œผ๋กœ ๊ตฌ์„ฑ๋œ ํŠœํ”Œ์€ ๋” ๋‚ฎ์€ ๋ ˆ๋ฒจ์ธ private ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ํŠœํ”Œ์€ ์ž์ฒด์ ์œผ๋กœ ์ ‘๊ทผ๋ ˆ๋ฒจ์„ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜• ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜ ๋“ฑ์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์ตœ์†Œ ์ ‘๊ทผ๋ ˆ๋ฒจ์„ ๋ถ€์—ฌ ๋ฐ›๋Š”๋‹ค. ์ฆ‰, ํŠœํ”Œ์€ ๋ช…์‹œ์ ์œผ๋กœ ์ ‘๊ทผ๊ถŒํ•œ์„ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค.

Function Types

  • ํ•จ์ˆ˜ ํƒ€์ž…์˜ ์ ‘๊ทผ ๋ ˆ๋ฒจ์€ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…๊ณผ ๋ฆฌํ„ด ํƒ€์ž…์˜ ์ ‘๊ทผ๋ ˆ๋ฒจ ์ค‘ ๊ฐ€์žฅ ์ œํ•œ์ ์ธ ์ ‘๊ทผ๋ ˆ๋ฒจ๋กœ ๊ณ„์‚ฐ๋ผ ์‚ฌ์šฉ
  • ๊ทธ๊ฒƒ์— ๋งž๋Š” ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ํ•จ์ˆ˜ ์•ž์— ๋ช…์‹œํ•ด ์ค˜์•ผ ํ•œ๋‹ค.
func someFunction() -> (SomeInternalClass, SomePrivateClass) {
    // function implementation goes here
}
  • ๋ช…์‹œ์ ์ธ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๋ช…์‹œํ•˜์ง€ ์•Š์€ ํ•จ์ˆ˜๋กœ ์ปดํŒŒ์ผ์‹œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ
  • ๋ฐ˜ํ™˜๊ฐ’ ์ค‘์— ์ ‘๊ทผ๋ ˆ๋ฒจ์ด private์ธ SomePrivateClass๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— someFunction() ์€ internal ์ ‘๊ทผ๋ ˆ๋ฒจ๋กœ ์„ ์–ธ๋  ์ˆ˜ ์—†๋‹ค.
private func someFunction() -> (SomeInternalClass, SomePrivateClass) {
    // function implementation goes here
}
  • ํ•จ์ˆ˜ ์•ž์— private ์ ‘๊ทผ๋ ˆ๋ฒจ์„ ์ง€์ •ํ•ด ์ค˜์•ผ ํ•œ๋‹ค.

Enumeration Types

์—ด๊ฑฐํ˜•์—์„œ ๊ฐ case๋Š” enum์˜ ์ ‘๊ทผ๋ ˆ๋ฒจ์„ ๋”ฐ๋ฅด๊ณ  ๊ฐœ๋ณ„์ ์œผ๋กœ ๋‹ค๋ฅธ ์ ‘๊ทผ๋ ˆ๋ฒจ์„ ์ง€์ •ํ•  ์ˆ˜ ์—†๋‹ค.

public enum CompassPoint {
    case north
    case south
    case east
    case west
}
  • ๊ฐ case๋Š” enum์˜ ์ ‘๊ทผ๋ ˆ๋ฒจ public์„ ๋”ฐ๋ผ ๋ชจ๋‘ public์ ‘๊ทผ๋ ˆ๋ฒจ์„ ๊ฐ–๋Š”๋‹ค.

Raw Values and Associated Values

์—ด๊ฑฐํ˜• ๋‚ด์˜ ๊ณ ์œ ๊ฐ’๊ณผ ์—ฐ๊ด€๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฐ˜๋“œ์‹œ ์—ด๊ฑฐํ˜•๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ๋†’์€ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.

์ฆ‰, internal ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ์—ด๊ฑฐํ˜• ํƒ€์ž…์—์„œ private ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๊ฐ–๋Š” ๊ณ ์œ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.****

Nested Types

  • private๋กœ ์„ ์–ธ๋œ ํƒ€์ž…์˜ ์ค‘์ฒฉ ํƒ€์ž…์€ ์ž๋™์œผ๋กœ private์ ‘๊ทผ๋ ˆ๋ฒจ์„ ๊ฐ–๋Š”๋‹ค.****
  • file-private์œผ๋กœ ์„ ์–ธ๋œ ๊ฒฝ์šฐ ์ค‘์ฒฉํƒ€์ž…์€ file-private์„ ๊ฐ–๋Š”๋‹ค.
  • public ํ˜น์€ internal๋กœ ์„ ์–ธ๋œ ํƒ€์ž…์—์„œ ์ค‘์ฒฉํƒ€์ž…์€ ์ž๋™์œผ๋กœ internal์ ‘๊ทผ๋ ˆ๋ฒจ์„ ๊ฐ–๋Š”๋‹ค.
    • public์œผ๋กœ ์„ ์–ธ๋œ ํƒ€์ž…์—์„œ public์œผ๋กœ ์„ ์–ธ๋œ ์ค‘์ฒฉํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์œผ๋ฉด ๋ช…์‹œ์ ์œผ๋กœ public์ ‘๊ทผ์ž๋ฅผ ์ค‘์ฒฉํƒ€์ž…์— ์ ์–ด์ค˜์•ผ ํ•œ๋‹ค.

Subclassing

  • ์„œ๋ธŒํด๋ž˜์Šค๋Š” ์Šˆํผํด๋ž˜์Šค๋ณด๋‹ค ๋” ๋†’์€(๋œ ์ œํ•œ์ ์ธ) ์ ‘๊ทผ๋ ˆ๋ฒจ์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค.
  • ์˜ˆ์‹œ: ์Šˆํผํด๋ž˜์Šค๊ฐ€ 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()
    }
}

Constants, Variables, Properties, and Subscripts

์ƒ์ˆ˜, ๋ณ€์ˆ˜, ํ”„๋กœํผํ‹ฐ ๋“ฑ์€ ๊ทธ ํƒ€์ž…๋ณด๋‹ค ๋” ๋†’์€ ์ ‘๊ทผ๋ ˆ๋ฒจ์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค.

์ฆ‰, private ํƒ€์ž…์—์„œ public ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด private ํด๋ž˜์Šค ๋ณ€์ˆ˜์˜ ์ ‘๊ทผ๋ ˆ๋ฒจ์€ private์ด ๋ผ์•ผ ํ•œ๋‹ค.

private class SomePrivateClass {}

private var privateInstance = SomePrivateClass() // ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฏธ๋ฐœ์ƒ
public var privateInstance = SomePrivateClass() // ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฐœ์ƒ

Getters and Setters

์ƒ์ˆ˜, ๋ณ€์ˆ˜, ํ”„๋กœํผํ‹ฐ ๊ทธ๋ฆฌ๊ณ  ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ์˜ ๊ฒŒํ„ฐ์™€ ์„ธํ„ฐ๋Š” ์ž๋™์œผ๋กœ ํ•ด๋‹น ์ƒ์ˆ˜, ๋ณ€์ˆ˜, ํ”„๋กœํผํ‹ฐ ๊ทธ๋ฆฌ๊ณ  ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ฐ–๋Š” ์ ‘๊ทผ๋ ˆ๋ฒจ์„ ๋™์ผํ•˜๊ฒŒ ๊ฐ–๋Š”๋‹ค.

ํ•„์š”์— ๋”ฐ๋ผ ์„ธํ„ฐ์˜ ์ ‘๊ทผ๋ ˆ๋ฒจ์„ ๊ฒŒํ„ฐ๋ณด๋‹ค ๋‚ฎ๊ฒŒ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • 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() {}
}
  • ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ฒŒํ„ฐ ๋ ˆ๋ฒจ๋„ ์„ค์ • ๊ฐ€๋Šฅ

Initializers

์ดˆ๊ธฐ์ž์˜ ์ ‘๊ทผ๋ ˆ๋ฒจ์€ ํƒ€์ž…์˜ ๋ ˆ๋ฒจ๊ณผ ๊ฐ™๊ฑฐ๋‚˜ ๋‚ฎ๋‹ค(๋” ์ œํ•œ์ ).

  • ํ•œ ๊ฐ€์ง€ ์˜ˆ์™ธ: ์ง€์ • ์ดˆ๊ธฐ์ž(required Initializer) - ๋ฐ˜๋“œ์‹œ ์†ํ•œ ํƒ€์ž…๊ณผ ์ ‘๊ทผ๋ ˆ๋ฒจ์ด ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

Default Initializers

  • ํƒ€์ž…์˜ ์ ‘๊ทผ๋ ˆ๋ฒจ์ด public์ด ์•„๋‹ˆ๋ฉด ํƒ€์ž…๊ณผ ๊ฐ™์€ ์ ‘๊ทผ๋ ˆ๋ฒจ์„ ๊ฐ–๋Š”๋‹ค.
  • ํƒ€์ž…์˜ ์ ‘๊ทผ๋ ˆ๋ฒจ์ด public์ด๋ฉด ๊ธฐ๋ณธ ์ดˆ๊ธฐ์ž๋Š” internal ์ ‘๊ทผ๋ ˆ๋ฒจ์„ ๊ฐ–๋Š”๋‹ค.

Default Memberwise Initializers for Structure Types

  • ๋ชจ๋“  ์ €์žฅ ํ”„๋กœํผํ‹ฐ๊ฐ€ private์ผ ๊ฒฝ์šฐ, Default Memberwise Initializers์˜ ์ ‘๊ทผ๋ ˆ๋ฒจ์€ private
  • ๋ชจ๋“  ์ €์žฅ ํ”„๋กœํผํ‹ฐ๊ฐ€ file private์ผ ๊ฒฝ์šฐ, Default Memberwise Initializers์˜ ์ ‘๊ทผ๋ ˆ๋ฒจ์€ file private
  • ๋งŒ์•ฝ public ๊ตฌ์กฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉ๋  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ Memberwise Initializers๋ฅผ ํƒ€์ž…์„ ์ •์˜ํ•ด public์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

Protocols

  • ํ”„๋กœํ† ์ฝœ์— ๋ช…์‹œ์  ์ ‘๊ทผ๋ ˆ๋ฒจ์„ ํ• ๋‹นํ•˜๋ ค๋ฉด, ํ”„๋กœํ† ์ฝœ์ด ์ •์˜๋  ๋•Œ ํ• ๋‹นํ•ด๋ผ.

    ์ด ๋ฐฉ์‹์œผ๋กœ ํŠน์ • ์ ‘๊ทผ๋ ˆ๋ฒจ ๋‚ด์—์„œ๋งŒ ์ฑ„ํƒํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํ† ์ฝœ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

  • ํ”„๋กœํ† ์ฝœ ์ •์˜ ๋‚ด์˜ ๊ฐ ์š”๊ตฌ์‚ฌํ•ญ ์ ‘๊ทผ์ œํ•œ ์ˆ˜์ค€์€ ํ”„๋กœํ† ์ฝœ๊ณผ ๋™์ผํ•œ ์ˆ˜์ค€์œผ๋กœ ์ž๋™ ์„ค์ •

  • ํ”„๋กœํ† ์ฝœ์ด ์ง€์›ํ•˜๋Š” ์ œํ•œ๋ ˆ๋ฒจ๊ณผ ๋‹ค๋ฅธ ์ œํ•œ๋ ˆ๋ฒจ ์ˆ˜์ค€์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์—†๋‹ค.

  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•œ ์–ด๋–ค ํƒ€์ž…์—์„œ๋„ ํ”„๋กœํ† ์ฝœ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ก public ํ”„๋กœํ† ์ฝœ์„ ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ, ํ”„๋กœํ† ์ฝœ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ•  ๋•Œ, ํ•ด๋‹น ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•œ public ์ ‘๊ทผ๋ ˆ๋ฒจ์„ ์š”๊ตฌํ•œ๋‹ค. ์ด ๋™์ž‘์€ public ํƒ€์ž…์œผ๋กœ ์ •์˜๋  ๋•Œ ๊ทธ ํƒ€์ž…์˜ ๋ฉค๋ฒ„๊ฐ€ internal์ด๋˜ ๋‹ค๋ฅธ ํƒ€์ž…๊ณผ๋Š” ๋‹ค๋ฅด๋‹ค.

Protocol Inheritance

  • ๊ธฐ์กด ํ”„๋กœํ† ์ฝœ๋กœ๋ถ€ํ„ฐ ์ƒ์†ํ•œ ์ƒˆ๋กœ์šด ํ”„๋กœํ† ์ฝœ์„ ์ •์˜ํ•œ๋‹ค๋ฉด, ์ƒˆ๋กœ์šด ํ”„๋กœํ† ์ฝœ์€ ์ƒ์†๋ฐ›์€ ํ”„๋กœํ† ์ฝœ๊ณผ ๊ฑฐ์˜ ๊ฐ™์€ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๊ฐ–๋Š”๋‹ค.
  • ์˜ˆ์‹œ: internal ํ”„๋กœํ† ์ฝœ๋กœ๋ถ€ํ„ฐ ์ƒ์†ํ•˜๋Š” public ํ”„๋กœํ† ์ฝœ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

Protocol Conformance

  • ํƒ€์ž…์€ ํƒ€์ž… ์ž์ฒด๋ณด๋‹ค ๋” ๋‚ฎ์€ ์ ‘๊ทผ ๋ ˆ๋ฒจ(๋” ์ œํ•œ์ )์œผ๋กœ ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์˜ˆ์‹œ: ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” public ํƒ€์ž…์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ internal ํ”„๋กœํ† ์ฝœ ์ค€์ˆ˜๋Š” internal ํ”„๋กœํ† ์ฝœ์˜ ์ •์˜ ๋ชจ๋“ˆ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค.
  • ํŠน์ • ํ”„๋กœํ† ์ฝœ ํƒ€์ž… ์ค€์ˆ˜์—์„œ ์ปจํ…์ŠคํŠธ๋Š” ํƒ€์ž…์˜ ์ ‘๊ทผ ์ˆ˜์ค€๊ณผ ํ”„๋กœํ† ์ฝœ์˜ ์ ‘๊ทผ ์ˆ˜์ค€์˜ ์ตœ์†Œ์ด๋‹ค.
    • ์˜ˆ์‹œ: ํƒ€์ž…์ด public์ด๋ผ๋ฉด ํ”„๋กœํ† ์ฝœ์€ internal๋กœ ์ค€์ˆ˜๋˜๋ฉฐ, ํƒ€์ž…์˜ ํ”„๋กœํ† ์ฝœ์— ์ค€์ˆ˜๋Š” internal์ด ๋œ๋‹ค.
  • ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ํƒ€์ž…์„ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ์ž‘์„ฑํ•  ๋•Œ, ๊ฐ๊ฐ์˜ ํ”„๋กœํ† ์ฝœ ์š”๊ตฌ์‚ฌํ•ญ์˜ ํƒ€์ž… ๊ตฌํ˜„์ด ์ ์–ด๋„ ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ํƒ€์ž…์œผ๋กœ์„œ ๊ฐ™์€ ์ ‘๊ทผ ์ˆ˜์ค€์„ ๊ฐ€์ ธ์•ผ ํ•จ์„ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค.
    • ์˜ˆ์‹œ: ๋งŒ์•ฝ public ํƒ€์ž…์€ internal ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•œ๋‹ค๋ฉด, ๊ฐ๊ฐ์˜ ํ”„๋กœํ† ์ฝœ ์š”๊ตฌ์‚ฌํ•ญ์˜ ํƒ€์ž… ๊ตฌํ˜„์€ ์ ์–ด๋„ โ€œinternalโ€์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.

Extensions

  • extension์œผ๋กœ ์ถ”๊ฐ€๋œ ๋ชจ๋“  ํƒ€์ž… ๋ฉค๋ฒ„๋Š” ์›๋ž˜ ํ˜•์‹์—์„œ ์„ ์–ธ๋œ ํƒ€์ž… ๋ฉค๋ฒ„๋“ค๊ณผ ๋™์ผํ•œ ๊ธฐ๋ณธ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๊ฐ–๋Š”๋‹ค.
    • ์˜ˆ์‹œ: public ํƒ€์ž…์„ ํ™•์žฅํ•œ๋‹ค๋ฉด, ์ƒˆ๋กœ์šด ํƒ€์ž… ๋ฉค๋ฒ„๋Š” internal์˜ ๊ธฐ๋ณธ ์ ‘๊ทผ ์ˆ˜์ค€์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.
    • ์˜ˆ์‹œ: file-private ํƒ€์ž…์„ ํ™•์žฅํ•œ๋‹ค๋ฉด, ์ƒˆ๋กœ์šด ํƒ€์ž… ๋ฉค๋ฒ„๋Š” file-private ๊ธฐ๋ณธ ์ ‘๊ทผ ์ˆ˜์ค€์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.
  • extension์— ๋ช…์‹œ์ ์œผ๋กœ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ํ‘œ์‹œํ•˜์—ฌ extension ๋‚ด์— ์ •์˜๋œ ๋ฉค๋ฒ„๋“ค์—๊ฒŒ ์ƒˆ๋กœ์šด ๊ธฐ๋ณธ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ์„ธํŒ…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ๊ธฐ๋ณธ ์ ‘๊ทผ ์ˆ˜์ค€์€ ์—ฌ์ „ํžˆ ๊ฐœ๋ณ„ ํƒ€์ž… ๋ฉค๋ฒ„์— ๋Œ€ํ•œ extension ๋‚ด์—์„œ ์˜ค๋ฒ„๋ผ์ด๋“œ ๋  ์ˆ˜ ์žˆ๋‹ค.
  • extension์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ฒฝ์šฐ, ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์—†๋‹ค.
    • ๋Œ€์‹ , ํ”„๋กœํ† ์ฝœ ์ž์ฒด์˜ ์ ‘๊ทผ ๋ ˆ๋ฒจ์€ extension ๋‚ด์—์„œ ๊ฐ ํ”„๋กœํ† ์ฝœ ์š”๊ตฌ ์‚ฌํ•ญ ๊ตฌํ˜„์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ ‘๊ทผ ๋‹จ๊ณ„๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

Private Members in Extensions

๋™์ผํ•œ ํŒŒ์ผ ๋‚ด์— ์žˆ๋Š” 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)
    }
}
  • ์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ ์ถฉ์กฑ

Generics

์ œ๋„ค๋ฆญ ํƒ€์ž… ๋˜๋Š” ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ์œ„ํ•œ ์ ‘๊ทผ ๋ ˆ๋ฒจ์€ ์ œ๋„ค๋ฆญ ํƒ€์ž… ๋˜๋Š” ํ•จ์ˆ˜ ์ž์‹ ์˜ ์ ‘๊ทผ ์ˆ˜์ค€๊ณผ ํƒ€์ž… ์ธ์ž์— ๋ชจ๋“  ํƒ€์ž… ์ œ์•ฝ์˜ ์ ‘๊ทผ ์ˆ˜์ค€์˜ ์ตœ์†Œ์ด๋‹ค.

Type Aliases

  • ์ •์˜ํ•œ ํƒ€์ž… ๋ณ„์นญ์€ ์•ก์„ธ์Šค ์ œ์–ด๋ฅผ ์œ„ํ•ด ๋ณ„๊ฐœ์˜ ์œ ํ˜•์œผ๋กœ ์ทจ๊ธ‰๋œ๋‹ค.
  • ํƒ€์ž… ๋ณ„์นญ์€ ์› ํƒ€์ž…์˜ ์ ‘๊ทผ ๋ ˆ๋ฒจ๋ณด๋‹ค ๋œํ•˜๊ฑฐ๋‚˜ ๊ฐ™์€ ์ˆ˜์ค€์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ์˜ˆ์‹œ: private์˜ ํƒ€์ž… ๋ณ„์นญ์œผ๋กœ private, file-private, internal, public, or open type๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ์˜ˆ์‹œ: public์˜ ํƒ€์ž… ๋ณ„์นญ์œผ๋กœ internal, file-private, or private๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค.