[Swift๐Ÿฆฉ] #27 ์ ‘๊ทผ ์ œ์–ด

๋˜์ƒยท2022๋…„ 4์›” 27์ผ
0

iOS

๋ชฉ๋ก ๋ณด๊ธฐ
43/47
post-thumbnail
  • ๋‹ค๋ฅธ ์†Œ์Šค ํŒŒ์ผ๊ณผ ๋ชจ๋“ˆ์—์„œ ์ฝ”๋“œ์˜ ๋ถ€๋ถ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ์ œ์–ดํ•œ๋‹ค.
  • ์ฝ”๋“œ์˜ ์„ธ๋ถ€ ๊ตฌํ˜„์„ ์ˆจ๊ธฐ๊ณ , ํ•ด๋‹น ์ฝ”๋“œ์˜ ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•œ๋‹ค.
  • ๊ฐœ๋ณ„ ํƒ€์ž… (ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•) ๊ณผ ํ•ด๋‹น ํƒ€์ž… ๋‚ด์— ์žˆ๋Š” property, method, init, subscript ์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ”„๋กœํ† ์ฝœ ์—ญ์‹œ๋„ ํŠน์ • ์ปจํ…์ŠคํŠธ๋กœ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ช…์‹œํ•ด์„œ ์ ‘๊ทผ ์ œ์–ด๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๊ธฐ๋ณธ ์ ‘๊ทผ ์ˆ˜์ค€ ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ๋ชจ๋“ˆ์ด ์•„๋‹Œ ๋‹จ์ผ ์•ฑ์„ ์ž‘์„ฑํ•œ๋‹ค๋ฉด, ์ ‘๊ทผ ์ œ์–ด๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋จ.

1. ๋ชจ๋“ˆ๊ณผ ์†Œ์Šค ํŒŒ์ผ

  • ๋ชจ๋“ˆ
    • ๋‹จ์ผ ๋‹จ์œ„๋กœ ๋นŒ๋“œ๋˜๊ณ  ์ œ๊ณต๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ
    • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ฐ™์€ ์ฝ”๋“œ ๋ฐฐํฌ์˜ ๋‹จ์ผ ๋‹จ์œ„ (ํ”„๋ ˆ์ž„์›Œํฌ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์•ฑ ํ•˜๋‚˜)
    • import ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค
  • ์†Œ์Šค ํŒŒ์ผ
    • ๋ชจ๋“ˆ ๋‚ด์—์„œ ๋‹จ์ผ Swift ์†Œ์Šค ์ฝ”๋“œ ํŒŒ์ผ (์ง„์งœ ํŒŒ์ผ)
    • ํ•˜๋‚˜์˜ ์†Œ์Šค ํŒŒ์ผ ๋‹น ํ•˜๋‚˜์˜ ๊ฐœ๋ณ„ ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š”๊ฒŒ ์ผ๋ฐ˜์ ์ด๋‚˜,
    • ๋‹จ์ผ ์†Œ์Šค ํŒŒ์ผ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ํƒ€์ž…์— ๋Œ€ํ•œ ์ •์˜๋ฅผ ํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค.

2. ์ ‘๊ทผ ๋ ˆ๋ฒจ โญ๏ธ

Swift ๋Š” ์ฝ”๋“œ ๋‚ด entity ์— ๋Œ€ํ•ด ๋‹ค์„ฏ๊ฐ€์ง€ ์ ‘๊ทผ ์ˆ˜์ค€ (Access Level) ์„ ์ œ๊ณตํ•œ๋‹ค.

  • Open / Public
    • ์ •์˜ํ•œ ๋ชจ๋“ˆ ๋‚ด์˜ ๋ชจ๋“  ์†Œ์Šค ํŒŒ์ผ
    • import ๋กœ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜จ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์˜ ์†Œ์ŠคํŒŒ์ผ
  • Internal
    • ์ •์˜ํ•œ ๋ชจ๋“ˆ์˜ ์†Œ์ŠคํŒŒ์ผ (ํ•ด๋‹น ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„  ๋ถˆ๊ฐ€๋Šฅ.)
    • ์•ฑ / ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์ฒด๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ
  • File-private
    • ์ž์ฒด ์ •์˜ํ•œ ์†Œ์Šค ํŒŒ์ผ ๋‚ด์—์„œ
  • private
    • ๋‘˜๋Ÿฌ์‹ธ์ธ ์„ ์–ธ๊ณผ ๊ฐ™์€ ํŒŒ์ผ์— ์žˆ๋Š” ํ•ด๋‹น ์„ ์–ธ์˜ extension
    • ์„ธ๋ถ€ ๋‚ด์šฉ์€ ๋‹จ์ผ ์„ ์–ธ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๊ณ , ๊ธฐ๋Šฅ์˜ ๊ตฌํ˜„ ์„ธ๋ถ€์ •๋ณด๋ฅผ ๊ฐ€๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

<- Open - Public - Internal - File-Private - Private- >

  • Open vs Public
    • Open ์˜ ์ ‘๊ทผ์€ ํด๋ž˜์Šค์™€ ํด๋ž˜์Šค ๋ฉค๋ฒ„์—๋งŒ ์ ์šฉ๋˜๊ณ ,
    • ๋ชจ๋“ˆ ์™ธ๋ถ€์˜ ์ฝ”๋“œ๋ฅผ ์ƒ์†ํ•˜๊ณ  ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Open ์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ๋‹ค? ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ƒ์œ„ ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“ˆ์˜ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ์˜ํ–ฅ์„ ๋ผ์น˜๋Š”์ง€ ๊ณ ๋ คํ•˜๊ณ  ์„ค๊ณ„ํ–ˆ๋‹ค๋Š” ๋œป...... ๊ต‰์žฅํ•œ๋ฐ
    • Public ์€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์ƒ์†์€ ๋ถˆ๊ฐ€๋Šฅ.

์ ‘๊ทผ ๋ ˆ๋ฒจ์˜ ๊ธฐ๋ณธ ์›์น™

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

๊ธฐ๋ณธ ์ ‘๊ทผ ๋ ˆ๋ฒจ

  • ์˜ˆ์™ธ ์‚ฌํ•ญ์ด ์žˆ๊ธด ํ•˜์ง€๋งŒ,
  • ๋Œ€์ฒด๋กœ ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ๋Š” internal

๋‹จ์ผ ํƒ€๊ฒŸ ์•ฑ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ ˆ๋ฒจ

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

ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ ˆ๋ฒจ

  • ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ํ”„๋ ˆ์ž„์›Œํฌ ์ฝ”๋“œ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
  • open, public ์œผ๋กœ ๊ณต์šฉ API ๋ฅผ ํ‘œ๊ธฐํ•œ๋‹ค.
  • ๋‚ด๋ถ€์—์„œ๋Š” internal, private, file-private ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ๊ณต์šฉ API ๋Š” ๋ฌด์กฐ๊ฑดopen, public

์œ ๋‹› ํ…Œ์ŠคํŠธ ํƒ€๊ฒŸ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ ˆ๋ฒจ

  • ์œ ๋‹› ํ…Œ์ŠคํŠธ ํƒ€๊ฒŸ์˜ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ๋ชจ๋“ˆ์—์„œ ์•ฑ์˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ์ด๋ก ์ ์œผ๋กœ๋Š” open, public ์ด ๋งž๋Š”๋ฐ,
  • ํ…Œ์ŠคํŠธ์˜ ๊ฒฝ์šฐ @testable ๋กœ ํ‘œ์‹œ๋ฅผ ํ•ด์ฃผ๋ฉด, ์œ ๋‹› ํ…Œ์ŠคํŠธ ํƒ€๊ฒŸ์ด ๋‚ด๋ถ€ ์—”ํ‹ฐํ‹ฐ์— ์ „๋ถ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

3. ์ ‘๊ทผ ์ œ์–ด ๊ตฌ๋ฌธ

์ ‘๊ทผ ์ œ์–ด ๋ ˆ๋ฒจ๋“ค์„ ํ‚ค์›Œ๋“œ๋กœ ์‚ฌ์šฉํ•ด์„œ class, property, method ์•ž์— ๋ถ™์ธ๋‹ค.
์ˆ˜์‹์–ด๋ฅผ ์•ˆ์“ฐ๋ฉด internal

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() {}

4. ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž…

  • ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž…์„ ์ •์˜ํ•  ๋•Œ, ๋ช…์‹œ์ ์œผ๋กœ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ๋‚ด์˜ ํ”„๋กœํผํ‹ฐ, ๋ฉ”์„œ๋“œ .. ๋Š”
  • file-private, private ์˜ ๊ฒฝ์šฐ์—” ๊ธฐ๋ณธ ์ ‘๊ทผ ์ˆ˜์ค€๋„ file-private, private ์ด ๋˜๊ณ ,
  • internal ์ด์ƒ์˜ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ์ฃผ๋ฉด ์ž๋™์ ์œผ๋กœ internal ์ด ๋œ๋‹ค.
  • ์ง์ ‘ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ์—”, ๋ณธ์ธ๋ณด๋‹ค ๋„“์€ ์ ‘๊ทผ ๋ ˆ๋ฒจ๋กœ๋Š” ์„ค์ •ํ•  ์ˆ˜ ์—†๋‹ค.
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 ๋ฉด ํŠœํ”Œ์€ private

ํ•จ์ˆ˜

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

Enum

  • Enum ์˜ ๊ฐœ๋ณ„ ์ผ€์ด์Šค๋Š” Enum ๊ณผ ๊ฐ™์€ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๊ฐ€์ง„๋‹ค.
  • ๊ฐœ๋ณ„ ์ผ€์ด์Šค์— ๋Œ€ํ•ด์„œ๋Š” ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๋‹ค๋ฅด๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์—†๋‹ค.
public enum CompassPoint {
    case north
    case south
    case east
    case west
}
  • associated value ์˜ ๊ฒฝ์šฐ, enum ๋ณด๋‹ค ๋„“์€ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.

Nested Types

  • Nested Type์„ ๊ฐ์‹ธ๋Š” ํƒ€์ž…์ด public ์ด ์•„๋‹Œ ๊ฒฝ์šฐ, ๊ฐ์‹ธ๋Š” ํƒ€์ž…๊ณผ ๋™์ผํ•˜๋‹ค.
  • public ์ธ ๊ฒฝ์šฐ์—๋Š” internal (public ์ด์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค? -> ๋ช…์‹œํ•ด์ฃผ์ž.)

5. ์„œ๋ธŒ ํด๋ž˜์‹ฑ

  • ์–ด๋–ค ํด๋ž˜์Šค๊ฐ€
  • ์ ‘๊ทผ ์ปจํ…์ŠคํŠธ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ ,
  • ํ•˜์œ„ ํด๋ž˜์Šค์™€ ๋™์ผํ•œ ๋ชจ๋“ˆ์— ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉด
  • ํ•˜์œ„ ํด๋ž˜์Šค์— ์ƒ์†ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ƒ์œ„ ํด๋ž˜์Šค๋ณด๋‹ค ๋„“์€ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค.
  • ๊ฐ™์€ ๋ชจ๋“ˆ์— ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉด, ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ, ํ”„๋กœํผํ‹ฐ, init, subscript ๋ฅผ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉด ์ ‘๊ทผ ๋ ˆ๋ฒจ์ด open ์ธ ํด๋ž˜์Šค ๋ฉค๋ฒ„๋ฅผ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์žฌ์ •์˜๋ฅผ ํ•  ๋•Œ, ์ƒ์œ„ ํด๋ž˜์Šค์— ์ •์˜๋œ ๊ฒƒ๋ณด๋‹ค ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๋„“๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•ด๋‹น 'ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์ ‘๊ทผ ๋ ˆ๋ฒจ'๋ณด๋‹ค ์ข๊ฒŒ๋งŒ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.
  • ์ƒ์œ„ ํด๋ž˜์Šค์— ์›๋ž˜ ์ •์˜๋œ ํด๋ž˜์Šค ๋ฉค๋ฒ„์˜ ์ ‘๊ทผ ๋ ˆ๋ฒจ์€ ์ƒ๊ด€ ์—†๋‹ค.
public class A {
    fileprivate func someMethod() {}
}

internal class B: A {
    override internal func someMethod() {} 
    // public ์ผ ์ˆœ ์—†์Œ. -> B๊ฐ€ internal ์ด๋‹ˆ๊นŒ.
    // ํ•˜์ง€๋งŒ A์—์„œ fileprivate ์ธ ๊ฒƒ์€ ์ƒ๊ด€์—†์Œ.
}
  • ์ ‘๊ทผ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋งž๊ธฐ๋งŒ ํ•˜๋ฉด, ํ•˜์œ„ ํด๋ž˜์Šค๋ฉค๋ฒ„๋ณด๋‹ค ๋” ๋‚ฎ์€ ์ƒ์œ„ ํด๋ž˜์Šค๋ฉค๋ฒ„์—๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
public class A {
    fileprivate func someMethod() {}
}

internal class B: A {
    override internal func someMethod() {
        super.someMethod()
        // A ์˜ someMethod ๊ฐ€ private ์ด๋ฉด ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ. ์ ‘๊ทผ ์ปจํ…์ŠคํŠธ๊ฐ€ ์•ˆ๋งž์Œ.
        // ํ•˜์ง€๋งŒ fileprivate ์ด๋ผ override ํ•œ ์ ‘๊ทผ ๋ ˆ๋ฒจ๊ณผ๋Š” ๊ด€๊ณ„ ์—†์ด ์ ‘๊ทผ ๊ฐ€๋Šฅ.
        // ๋งŒ์•ฝ B๊ฐ€ ๋‹ค๋ฅธ ํŒŒ์ผ์— ์žˆ๋”ฐ๋ฉด... ์ ‘๊ทผ ๋ถˆ๊ฐ€.
    }
}

6. let, var, method, subscript

  • ํ•ด๋‹น ํƒ€์ž…๋ณด๋‹ค ๋” ๋„“์€ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๊ฐ€์งˆ ์ˆ˜๋Š” ์—†๋‹ค.
  • ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ๋Š” ์ธ๋ฑ์Šค, return ํƒ€์ž…๋ณด๋‹ค ๋” ๋„“์€ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๊ฐ€์งˆ ์ˆ˜๋Š” ์—†๋‹ค.
  • ๋‚ฎ์€ ๋ ˆ๋ฒจ๋กœ ๋ช…์‹œ ๊ฐ€๋Šฅ.
private var privateInstance = SomePrivateClass()

getter, setter

  • getter, setter ์—ญ์‹œ ์ƒ์ˆ˜, ๋ณ€์ˆ˜, ํ”„๋กœํผํ‹ฐ, ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ์™€ ๊ฐ™์€ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.
  • ์ฝ๊ธฐ, ์“ฐ๊ธฐ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด์„œ setter ๋ฅผ getter ๋ณด๋‹ค ๋” ์ข๊ฒŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.
  • fileprivate(set), private(set), internal(set)

NOTE: ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋งŒ์ด ์•„๋‹ˆ๋ผ ๊ณ„์‚ฐ ํ”„๋กœํผํ‹ฐ์—๋„ ์ ์šฉ๋œ๋‹ค.

struct TrackedString {
    // ๊ฐ™์€ ๋ชจ๋“ˆ ๋‹ค๋ฅธ ์†Œ์ŠคํŒŒ์ผ์—์„œ get ์€ ๊ฐ€๋Šฅํ•˜๋‚˜, set ์€ ์ด ๊ตฌ์กฐ์ฒด ์•ˆ์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
    private(set) var numberOfEdits = 0
    var value: String = "" {
        didSet {
            numberOfEdits += 1 // value ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ๋ฐ”๋€œ.
        }
    }
}

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"

getter, setter ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๋‘˜ ๋‹ค ์ •์˜ํ•ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.

public struct TrackedString {
    public private(set) var numberOfEdits = 0
    public var value: String = "" {
        didSet {
            numberOfEdits += 1
        }
    }
    public init() {}
}

7. init

  • ์ดˆ๊ธฐํ™”ํ•˜๋Š” ํƒ€์ž…๋ณด๋‹ค ๋” ์ข๊ฑฐ๋‚˜ ๊ฐ™์€ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • ํ•˜์ง€๋งŒ required init ์€ ๋ฌด์กฐ๊ฑด ์ž์‹ ์ด ์†ํ•œ ํด๋ž˜์Šค์™€ ๋™์ผํ•œ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ , ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ ‘๊ทผ ๋ ˆ๋ฒจ์ด ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์˜ ์ ‘๊ทผ ๋ ˆ๋ฒจ๋ณด๋‹ค ๋” ์ข์œผ๋ฉด ์•ˆ๋œ๋‹ค.

Default Init

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

Memberwise init for struct

  • member-wise init ์˜ ๊ฒฝ์šฐ๋Š”,
  • ๊ตฌ์กฐ์ฒด ๋‚ด ๋ชจ๋“  ์ €์žฅ๋œ ํ”„๋กœํผํ‹ฐ๊ฐ€ private ์ด๋ฉด private, file-private ๋ฉด file-private
  • ์•„๋‹ˆ๋ฉด internal ์ด๋‹ค.
  • public ์œผ๋กœ ์ œ๊ณตํ•ด์•ผ ํ•˜๋ฉด, ์—ญ์‹œ ๋ช…์‹œ์ ์œผ๋กœ public init ์„ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

8. Protocol

  • ํ”„๋กœํ† ์ฝœ ํƒ€์ž…์— ๋ช…์‹œ์ ์œผ๋กœ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด ํ”„๋กœํ† ์ฝœ์„ ์ •์˜ํ•  ๋•Œ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค.
  • ํŠน์ • ์ ‘๊ทผ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ๋งŒ ์ฑ„ํƒ๋  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํ† ์ฝœ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ”„๋กœํ† ์ฝœ ์ •์˜ ๋‚ด์˜ ์š”๊ตฌ์‚ฌํ•ญ์€ ํ”„๋กœํ† ์ฝœ๊ณผ ๊ฐ™์€ ์ ‘๊ทผ ๋ ˆ๋ฒจ์„ ๊ฐ€์ง„๋‹ค.
  • ๋‹ค๋ฅด๊ฒŒ ์„ค์ •์€ ๋ถˆ๊ฐ€๋Šฅ ํ•˜๋‹ค.
  • public ์ด๋ฉด public ์ž„!!!

ํ”„๋กœํ† ์ฝœ ์ƒ์†

  • ์ƒ์†ํ•˜๋Š” ๊ฒฝ์šฐ, ์ƒ์†๋œ ํ”„๋กœํ† ์ฝœ๊ณผ ๋™์ผํ•˜๊ฑฐ๋‚˜ ๋” ์ข์€ ์ ‘๊ทผ ์ˆ˜์ค€์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.

ํ”„๋กœํ† ์ฝœ ์ค€์ˆ˜

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

NOTE : ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ์—์„œ ํƒ€์ž…์ด ๋‘๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•  ์ˆ˜๋Š” ์—†๋‹ค. ํ•œ๋ฒˆ internal ์ด๋ฉด public ์œผ๋ก  ์ค€์ˆ˜ํ•  ์ˆ˜ ์—†๋‹ค..


9. Extension

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

Private Members in Extension

ํ™•์žฅ์˜ ๊ฒฝ์šฐ ๊ธฐ์กด ํƒ€์ž…์˜ ์„ ์–ธ๋ถ€์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๊ฒŒ ๋œ๋‹ค.
๊ทธ๋ž˜์„œ ๊ฐ€๋Šฅํ•œ ๊ฒƒ๋“ค.

  • ๊ธฐ์กด ์„ ์–ธ์—์„œ private ๋ฉค๋ฒ„๋ฅผ ์„ ์–ธํ•˜๊ณ , ๊ฐ™์€ ํŒŒ์ผ์˜ Extension ์—์„œ ํ•ด๋‹น ๋ฉค๋ฒ„ ์ ‘๊ทผ
  • ํ•œ Extension์—์„œ private ๋ฉค๋ฒ„๋ฅผ ์„ ์–ธํ•˜๊ณ , ๊ฐ™์€ ํŒŒ์ผ์˜ ๋‹ค๋ฅธ Extension ์—์„œ ํ•ด๋‹น ๋ฉค๋ฒ„ ์ ‘๊ทผ
  • Extension ์—์„œ private ๋ฉค๋ฒ„๋ฅผ ์„ ์–ธํ•˜๊ณ , ๊ฐ™์€ ํŒŒ์ผ์˜ ๊ธฐ์กด ์„ ์–ธ์—์„œ ํ•ด๋‹น ๋ฉค๋ฒ„ ์ ‘๊ทผ.

-> private ์˜ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„ ์—†์ด ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅ.

protocol SomeProtocol {
    func doSomething()
}

struct SomeStruct {
    private var privateVariable = 12
}

extension SomeStruct: SomeProtocol {
    func doSomething() {
        print(privateVariable) // ๊ธฐ์กด ์„ ์–ธ์˜ private ๋ฉค๋ฒ„์— ์ ‘๊ทผ ๊ฐ€๋Šฅ.
    }
}

10. Generic

  • min(ํ•จ์ˆ˜ ์ž์ฒด์˜ ์ ‘๊ทผ ๋ ˆ๋ฒจ, ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•œ ๋ชจ๋“  ํƒ€์ž… ์ œ์•ฝ์กฐ๊ฑด์˜ ์ ‘๊ทผ ๋ ˆ๋ฒจ)

11. Type Alias

  • ๊ณ ์œ ํ•œ ํƒ€์ž…์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š”๋ฐ,
  • ์›๋ž˜ ํƒ€์ž…์˜ ์ ‘๊ทผ ๋ ˆ๋ฒจ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์„ ์ˆ˜ ์žˆ๋‹ค.



์งˆ๋ฌธ

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

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



์ฐธ๊ณ 
https://bbiguduk.gitbook.io/swift/language-guide-1/access-control

profile
0๋…„์ฐจ iOS ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€