λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🍏 Today I Learned/Swift 문법

[Swift] μ ‘κ·Ό μ œν•œμž

by Joseph Seong 2023. 12. 11.

 

μ ‘κ·Ό μ œν•œμž

 

μ ‘κ·Ό μ œν•œμž

 

  • μ ‘κ·Ό μ œν•œμžλŠ” λ‹€λ₯Έ μ†ŒμŠ€ νŒŒμΌμ΄λ‚˜ λͺ¨λ“ˆμ˜ μ½”λ“œμ—μ„œ μ½”λ“œ 일뢀에 λŒ€ν•œ 접근을 μ œν•œν•œλ‹€.
  • [μ œμ•½μ΄ 적음] open < public < internal < fileprivate < private [μ œμ•½μ΄ 많음]
    • open : λͺ¨λ“  μ†ŒμŠ€ νŒŒμΌμ—μ„œ ν•΄λ‹Ή level μ ‘κ·Ό κ°€λŠ₯ + λͺ¨λ“  κ³³μ—μ„œ μ„œλΈŒν΄λž˜μ‹± κ°€λŠ₯
    • public : λͺ¨λ“  μ†ŒμŠ€ νŒŒμΌμ—μ„œ ν•΄λ‹Ή level μ ‘κ·Ό κ°€λŠ₯ + 같은 λͺ¨λ“ˆ λ‚΄μ—μ„œλ§Œ μ„œλΈŒν΄λž˜μ‹± κ°€λŠ₯
    • internal : 같은 λͺ¨λ“ˆ λ‚΄μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯
    • fileprivate : 같은 μ†ŒμŠ€νŒŒμΌ λ‚΄μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯
    • private : 클래슀 λ‚΄λΆ€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯
  • μ ‘κ·Ό μ œν•œμžλ₯Ό μž‘μ„±ν•˜μ§€ μ•ŠμœΌλ©΄ internal둜 νŒλ‹¨ν•œλ‹€.
  • μƒμœ„ μš”μ†Œλ³΄λ‹€ ν•˜μœ„ μš”μ†Œκ°€ 더 높은 μ ‘κ·Ό μˆ˜μ€€μ„ κ°€μ§ˆ 수 μ—†λ‹€.
private struct Car {	// μƒμœ„λŠ” ν•˜μœ„λ³΄λ‹€ κ°™κ±°λ‚˜ 높은 μˆ˜μ€€μœΌλ‘œ
	  public var model: String // 🚨 μ—λŸ¬
}

 

  • λͺ¨λ“ˆκ³Ό μ†ŒμŠ€νŒŒμΌ
    • λͺ¨λ“ˆ(module)
      • 배포할 μ½”λ“œμ˜ 묢음 λ‹¨μœ„
      • ν•˜λ‚˜μ˜ ν”„λ ˆμž„μ›Œν¬/ 라이브러리/ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λͺ¨λ“ˆ λ‹¨μœ„κ°€ 될 수 μžˆλ‹€.
      • import ν‚€μ›Œλ“œλ₯Ό 톡해 뢈러올 수 μžˆλ‹€.
    • μ†ŒμŠ€νŒŒμΌ
      • ν•˜λ‚˜μ˜ swift μ†ŒμŠ€ μ½”λ“œ νŒŒμΌμ„ μ˜λ―Έν•œλ‹€.
  • public, open
    • λ‘˜ λ‹€ λͺ¨λ“ˆ μ™ΈλΆ€κΉŒμ§€ μ ‘κ·Όν•  수 μžˆλ‹€.
    • open은 ν΄λž˜μŠ€μ™€ 클래슀 λ§΄λ²„μ—μ„œλ§Œ μ‚¬μš©ν•  수 있고 λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ μ„œλΈŒν΄λž˜μ‹±μ΄ κ°€λŠ₯ν•˜μ§€λ§Œ public은 κ·Έλ ‡μ§€ μ•ŠμŠ΅λ‹€.
    • open으둜 클래슀λ₯Ό 개방 μ ‘κ·Ό μˆ˜μ€€μœΌλ‘œ λͺ…μ‹œν•˜λŠ” 것은 κ·Έ 클래슀λ₯Ό λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œλ„ 수퍼클래슀둜 μ‚¬μš©ν•˜κ² λ‹€λŠ” 의미둜 ν•΄λ‹Ή 클래슀λ₯Ό μ„€κ³„ν•˜κ³  λ§Œλ“€μ—ˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€(λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ 상속을 ν—ˆμš©ν•¨)
    • public은 주둜 ν”„λ ˆμž„μ›Œν¬μ—μ„œ 외뢀와 연결될 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ”λ° 많이 μ‚¬μš©ν•œλ‹€.
  • internal
    • λͺ¨λ“  μš”μ†Œμ— μ•”λ¬΅μ μœΌλ‘œ μ§€μ •ν•˜λŠ” λ””ν΄νŠΈ μ ‘κ·Ό μ œμ–΄μžμ΄λ‹€.
    • μ†ŒμŠ€ 파일이 μ†ν•΄μžˆλŠ” λͺ¨λ“ˆ 어디에든 μ ‘κ·Όν•  수 μžˆμ§€λ§Œ μ™ΈλΆ€ λͺ¨λ“ˆμ—μ„œλŠ” μ ‘κ·Όν•  수 μ—†λ‹€.
  • fileprivate
    • μ†ŒμŠ€ 파일 λ‚΄λΆ€μ—μ„œλ§Œ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ„œλ‘œ λ‹€λ₯Έ ν΄λž˜μŠ€κ°€ 같은 ν•˜λ‚˜μ˜ μ†ŒμŠ€ νŒŒμΌμ— μ •μ˜λ˜μ–΄μžˆκ³  fileprivate둜 μ„ μ–Έλ˜μ–΄ μžˆλ‹€λ©΄ 두 ν΄λž˜μŠ€λŠ” μ„œλ‘œ μ ‘κ·Όν•  수 μžˆλ‹€.
  • private
    • κ°€μž₯ μ œν•œμ μΈ μ ‘κ·Όμ œμ–΄μžμ΄λ‹€.
    • fileprivateκ³Ό 달리 같은 파일 μ•ˆμ— μžˆμ–΄λ„ μ„œλ‘œ λ‹€λ₯Έ 클래슀이고 private둜 μ„ μ–Έλ˜μ–΄ μžˆλ‹€λ©΄ 두 μš”μ†ŒλŠ” μ„œλ‘œ μ ‘κ·Όν•  수 μ—†λ‹€.

 

// open 
open class Vehicle {
    open func startEngine() {
        print("Engine started")
    }
}

open class Car: Vehicle {
    open var carType: String = "Sedan"
}

// public 
public struct Point {
    public var x: Int
    public var y: Int

    public init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }

    public mutating func moveByX(_ deltaX: Int, y deltaY: Int) {	//mutating : structλ‚˜ enum μ•ˆμ— μžˆλŠ” ν”„λ‘œνΌν‹° 값을 λ³€κ²½ν•  λ•Œ
        self.x += deltaX
        self.y += deltaY
    }
}

// internal
internal class InternalClass {
    internal var internalProperty: Int = 10

    internal func doSomethingInternally() {
        print("Internal operation performed")
    }
}

internal let internalConstant = 20

// fileprivate
class OuterClass {
    fileprivate var outerVariable = 30

    fileprivate func outerFunction() {
        print("Outer function called")
    }

    fileprivate class InnerClass {
        fileprivate func innerFunction() {
            print("Inner function called")
        }
    }
}

// private
class MyClass {
    private var privateVariable = 40

    private func privateFunction() {
        print("Private function called")
    }
}

 

mutating

  • Swiftμ—μ„œ mutating ν‚€μ›Œλ“œλŠ” ꡬ쑰체(Structs)λ‚˜ μ—΄κ±°ν˜•(Enum) λ‚΄μ—μ„œ λ©”μ„œλ“œ(Method)κ°€ ν•΄λ‹Ή ꡬ쑰체 λ˜λŠ” μ—΄κ±°ν˜•μ˜ 속성을 μˆ˜μ •ν•  수 μžˆλ„λ‘ ν•˜λŠ” ν‚€μ›Œλ“œ
  • 기본적으둜 Swiftμ—μ„œλŠ” κ΅¬μ‘°μ²΄λ‚˜ μ—΄κ±°ν˜•μ˜ μΈμŠ€ν„΄μŠ€κ°€ μƒμˆ˜λ‘œ μ„ μ–Έλ˜λ©΄ ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€μ˜ 속성을 λ³€κ²½ν•  수 μ—†λ‹€.
  • κ·ΈλŸ¬λ‚˜ λ©”μ„œλ“œ λ‚΄μ—μ„œ ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€μ˜ 속성을 λ³€κ²½ν•˜λ €λ©΄
  • mutating ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ή λ©”μ„œλ“œκ°€ ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€μ˜ 속성을 μˆ˜μ •ν•  수 μžˆλ„λ‘ ν—ˆμš©ν•΄μ•Ό ν•œλ‹€.
// ꡬ쑰체 μ˜ˆμ‹œ
struct Point {
    var x = 0.0, y = 0.0

    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        x += deltaX
        y += deltaY
    }
}

var point = Point(x: 1.0, y: 1.0)
print("Before moving: x = \(point.x), y = \(point.y)")

point.moveBy(x: 2.0, y: 3.0)
print("After moving: x = \(point.x), y = \(point.y)")

// Before moving: x = 1.0, y = 1.0
// After moving: x = 3.0, y = 4.0


// μ—΄κ±°ν˜• μ˜ˆμ‹œ
enum TrafficLight {
    case red, yellow, green

    mutating func next() {
        switch self {
        case .red:
            self = .green
        case .yellow:
            self = .red
        case .green:
            self = .yellow
        }
    }
}

var currentLight = TrafficLight.red
print("Current light is \(currentLight)")

currentLight.next()
print("Next light is \(currentLight)")

// Current light is red
// Next light is green