λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ₯– Bread Basics/Swift

Swift 곡식 λ¬Έμ„œ 정리 - ν”„λ‘œνΌν‹° (Properties)

by BreadDev 2025. 4. 11.
728x90

μ•ˆλ…•ν•˜μ„Έμš”. μ§€λ‚œ ν¬μŠ€νŒ…μ— 이어 μ˜€λŠ˜μ€ **ν”„λ‘œνΌν‹°(Properties)**에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. ν”„λ‘œνΌν‹°λŠ” 클래슀, ꡬ쑰체, μ—΄κ±°ν˜•μ—μ„œ 값을 μ €μž₯ν•˜κ³  κ³„μ‚°ν•˜λŠ” 방법을 μ œκ³΅ν•˜λŠ” Swift의 μ€‘μš”ν•œ ꡬ성 μš”μ†Œμž…λ‹ˆλ‹€.

πŸ“Œ ν”„λ‘œνΌν‹°λž€?

ν”„λ‘œνΌν‹°λŠ” νŠΉμ • 클래슀, ꡬ쑰체, λ˜λŠ” μ—΄κ±°ν˜•κ³Ό μ—°κ²°λœ κ°’μž…λ‹ˆλ‹€. Swiftμ—μ„œλŠ” λ‹€μ–‘ν•œ μ’…λ₯˜μ˜ ν”„λ‘œνΌν‹°λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€:

  • μ €μž₯된 ν”„λ‘œνΌν‹°(Stored Properties): μΈμŠ€ν„΄μŠ€μ˜ μΌλΆ€λ‘œ 값을 μ €μž₯
  • κ³„μ‚°λœ ν”„λ‘œνΌν‹°(Computed Properties): 값을 μ €μž₯ν•˜μ§€ μ•Šκ³  계산
  • νƒ€μž… ν”„λ‘œνΌν‹°(Type Properties): νƒ€μž… μžμ²΄μ— μ†ν•˜λŠ” ν”„λ‘œνΌν‹°
  • ν”„λ‘œνΌν‹° κ΄€μ°°μž(Property Observers): ν”„λ‘œνΌν‹° κ°’ λ³€ν™”λ₯Ό κ΄€μ°°
  • ν”„λ‘œνΌν‹° 래퍼(Property Wrappers): ν”„λ‘œνΌν‹° μ½”λ“œλ₯Ό μž¬μ‚¬μš©

πŸ“Œ μ €μž₯된 ν”„λ‘œνΌν‹° (Stored Properties)

μ €μž₯된 ν”„λ‘œνΌν‹°λŠ” κ°€μž₯ 기본적인 ν˜•νƒœμ˜ ν”„λ‘œνΌν‹°λ‘œ, ν΄λž˜μŠ€λ‚˜ ꡬ쑰체 μΈμŠ€ν„΄μŠ€μ˜ μΌλΆ€λ‘œ μƒμˆ˜λ‚˜ λ³€μˆ˜ 값을 μ €μž₯ν•©λ‹ˆλ‹€.

struct FixedLengthRange {
    var firstValue: Int  // λ³€μˆ˜ μ €μž₯ ν”„λ‘œνΌν‹°
    let length: Int      // μƒμˆ˜ μ €μž₯ ν”„λ‘œνΌν‹°
}

var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
rangeOfThreeItems.firstValue = 6  // κ°’ λ³€κ²½ κ°€λŠ₯
// rangeOfThreeItems.length = 4   // μ—λŸ¬! μƒμˆ˜ ν”„λ‘œνΌν‹°λŠ” λ³€κ²½ λΆˆκ°€

μ €μž₯된 ν”„λ‘œνΌν‹°(Stored Property): μΈμŠ€ν„΄μŠ€μ˜ μΌλΆ€λ‘œ 값을 μ €μž₯ν•˜λŠ” λ³€μˆ˜λ‚˜ μƒμˆ˜μž…λ‹ˆλ‹€.

ꡬ쑰체와 μƒμˆ˜

κ΅¬μ‘°μ²΄λŠ” κ°’ νƒ€μž…μ΄λ―€λ‘œ, ꡬ쑰체 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμˆ˜λ‘œ μ„ μ–Έν•˜λ©΄ κ·Έ μ•ˆμ˜ λͺ¨λ“  ν”„λ‘œνΌν‹°(λ³€μˆ˜ ν”„λ‘œνΌν‹° 포함)도 λ³€κ²½ν•  수 μ—†κ²Œ λ©λ‹ˆλ‹€.

let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)
// rangeOfFourItems.firstValue = 6  // μ—λŸ¬! ꡬ쑰체가 μƒμˆ˜μ΄λ―€λ‘œ λ³€κ²½ λΆˆκ°€

κ°’ νƒ€μž…κ³Ό μ°Έμ‘° νƒ€μž…μ˜ 차이: κ΅¬μ‘°μ²΄λŠ” κ°’ νƒ€μž…μœΌλ‘œ, μƒμˆ˜λ‘œ μ„ μ–Έ μ‹œ λͺ¨λ“  ν”„λ‘œνΌν‹°κ°€ λΆˆλ³€μ΄ λ©λ‹ˆλ‹€. 반면 ν΄λž˜μŠ€λŠ” μ°Έμ‘° νƒ€μž…μœΌλ‘œ, μƒμˆ˜λ‘œ 선언해도 λ³€μˆ˜ ν”„λ‘œνΌν‹°λŠ” λ³€κ²½ κ°€λŠ₯ν•©λ‹ˆλ‹€.

μ§€μ—° μ €μž₯된 ν”„λ‘œνΌν‹° (Lazy Stored Properties)

μ§€μ—° μ €μž₯된 ν”„λ‘œνΌν‹°λŠ” 처음 μ‚¬μš©λ  λ•ŒκΉŒμ§€ μ΄ˆκΈ°κ°’μ΄ κ³„μ‚°λ˜μ§€ μ•ŠλŠ” ν”„λ‘œνΌν‹°μž…λ‹ˆλ‹€. μ΄ˆκΈ°ν™” λΉ„μš©μ΄ 큰 λ¦¬μ†ŒμŠ€λ‚˜ 섀정에 μœ μš©ν•©λ‹ˆλ‹€.

class DataImporter {
    // μ΄ˆκΈ°ν™”μ— μ‹œκ°„μ΄ 많이 κ±Έλ¦°λ‹€κ³  κ°€μ •
    var filename = "data.txt"
}

class DataManager {
    lazy var importer = DataImporter()  // 처음 μ‚¬μš©λ  λ•ŒκΉŒμ§€ μƒμ„±λ˜μ§€ μ•ŠμŒ
    var data = [String]()
}

let manager = DataManager()
// 아직 importerλŠ” μƒμ„±λ˜μ§€ μ•ŠμŒ
manager.data.append("Some data")
// importer ν”„λ‘œνΌν‹°μ— 처음 μ ‘κ·Όν•  λ•Œ DataImporter μΈμŠ€ν„΄μŠ€κ°€ 생성됨
print(manager.importer.filename)  // "data.txt"

μ§€μ—° ν”„λ‘œνΌν‹°(Lazy Property): lazy ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλ˜λ©°, 처음 μ ‘κ·Όν•  λ•ŒκΉŒμ§€ μ΄ˆκΈ°ν™”λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ°˜λ“œμ‹œ λ³€μˆ˜(var)둜 μ„ μ–Έν•΄μ•Ό ν•©λ‹ˆλ‹€.

πŸ“Œ κ³„μ‚°λœ ν”„λ‘œνΌν‹° (Computed Properties)

κ³„μ‚°λœ ν”„λ‘œνΌν‹°λŠ” μ‹€μ œ 값을 μ €μž₯ν•˜μ§€ μ•Šκ³ , getter와 setterλ₯Ό 톡해 λ‹€λ₯Έ ν”„λ‘œνΌν‹°λ₯Ό 기반으둜 값을 κ³„μ‚°ν•©λ‹ˆλ‹€.

struct Point {
    var x = 0.0, y = 0.0
}

struct Size {
    var width = 0.0, height = 0.0
}

struct Rect {
    var origin = Point()
    var size = Size()

    // κ³„μ‚°λœ ν”„λ‘œνΌν‹°
    var center: Point {
        get {
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX, y: centerY)
        }
        set(newCenter) {
            origin.x = newCenter.x - (size.width / 2)
            origin.y = newCenter.y - (size.height / 2)
        }
    }
}

var square = Rect(origin: Point(x: 0.0, y: 0.0), size: Size(width: 10.0, height: 10.0))
print(square.center)  // Point(x: 5.0, y: 5.0)
square.center = Point(x: 15.0, y: 15.0)
print(square.origin)  // Point(x: 10.0, y: 10.0)

κ³„μ‚°λœ ν”„λ‘œνΌν‹°(Computed Property): μ‹€μ œ 값을 μ €μž₯ν•˜μ§€ μ•Šκ³  getter와 setterλ₯Ό 톡해 값을 κ³„μ‚°ν•©λ‹ˆλ‹€. 항상 var둜 μ„ μ–Έν•©λ‹ˆλ‹€.

κ°„μ†Œν™”λœ Getter μ„ μ–Έ

κ³„μ‚°λœ ν”„λ‘œνΌν‹°μ˜ getterκ°€ 단일 ν‘œν˜„μ‹μœΌλ‘œ κ΅¬μ„±λ˜λ©΄, return ν‚€μ›Œλ“œλ₯Ό μƒλž΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

struct CompactRect {
    var origin = Point()
    var size = Size()

    var center: Point {
        get {
            Point(x: origin.x + (size.width / 2),
                  y: origin.y + (size.height / 2))
        }
        set {
            origin.x = newValue.x - (size.width / 2)
            origin.y = newValue.y - (size.height / 2)
        }
    }
}

읽기 μ „μš© κ³„μ‚°λœ ν”„λ‘œνΌν‹°

setter 없이 getter만 κ΅¬ν˜„ν•˜λ©΄ 읽기 μ „μš© κ³„μ‚°λœ ν”„λ‘œνΌν‹°κ°€ λ©λ‹ˆλ‹€. get ν‚€μ›Œλ“œμ™€ μ€‘κ΄„ν˜Έλ₯Ό μƒλž΅ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

struct Cuboid {
    var width = 0.0, height = 0.0, depth = 0.0

    // 읽기 μ „μš© κ³„μ‚°λœ ν”„λ‘œνΌν‹°
    var volume: Double {
        return width * height * depth
    }
}

let cuboid = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
print(cuboid.volume)  // 40.0

읽기 μ „μš© κ³„μ‚°λœ ν”„λ‘œνΌν‹°: setter 없이 getter만 κ°€μ§„ κ³„μ‚°λœ ν”„λ‘œνΌν‹°μž…λ‹ˆλ‹€. get ν‚€μ›Œλ“œμ™€ μ€‘κ΄„ν˜Έλ₯Ό μƒλž΅ν•˜μ—¬ 더 κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ ν”„λ‘œνΌν‹° κ΄€μ°°μž (Property Observers)

ν”„λ‘œνΌν‹° κ΄€μ°°μžλŠ” ν”„λ‘œνΌν‹° κ°’μ˜ λ³€ν™”λ₯Ό κ΄€μ°°ν•˜κ³  μ‘λ‹΅ν•©λ‹ˆλ‹€. willSetκ³Ό didSet 두 κ°€μ§€ κ΄€μ°°μžλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

class StepCounter {
    var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
            print("κ³§ totalStepsκ°€ \(newTotalSteps)둜 λ³€κ²½λ©λ‹ˆλ‹€.")
        }
        didSet {
            if totalSteps > oldValue {
                print("\(totalSteps - oldValue)걸음 좔가됨")
            }
        }
    }
}

let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// 좜λ ₯: "κ³§ totalStepsκ°€ 200둜 λ³€κ²½λ©λ‹ˆλ‹€."
// 좜λ ₯: "200걸음 좔가됨"

stepCounter.totalSteps = 360
// 좜λ ₯: "κ³§ totalStepsκ°€ 360둜 λ³€κ²½λ©λ‹ˆλ‹€."
// 좜λ ₯: "160걸음 좔가됨"

willSet: 값이 μ €μž₯되기 직전에 ν˜ΈμΆœλ©λ‹ˆλ‹€. μƒˆ 값이 newValue(λ˜λŠ” μ‚¬μš©μž μ§€μ • λ§€κ°œλ³€μˆ˜ 이름)둜 μ œκ³΅λ©λ‹ˆλ‹€.

didSet: μƒˆ 값이 μ €μž₯된 직후 ν˜ΈμΆœλ©λ‹ˆλ‹€. 이전 값이 oldValue둜 μ œκ³΅λ©λ‹ˆλ‹€.

πŸ“Œ ν”„λ‘œνΌν‹° 래퍼 (Property Wrappers)

ν”„λ‘œνΌν‹° λž˜νΌλŠ” ν”„λ‘œνΌν‹° μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ„ 높이고 속성에 λŒ€ν•œ 관리 μ½”λ“œλ₯Ό μΊ‘μŠν™”ν•©λ‹ˆλ‹€.

@propertyWrapper
struct TwelveOrLess {
    private var number = 0

    var wrappedValue: Int {
        get { return number }
        set { number = min(newValue, 12) }
    }
}

struct SmallRectangle {
    @TwelveOrLess var height: Int
    @TwelveOrLess var width: Int
}

var rectangle = SmallRectangle()
rectangle.height = 10  // 정상 μ„€μ •
rectangle.width = 24   // 12둜 μ œν•œλ¨
print(rectangle.height, rectangle.width)  // 10 12

ν”„λ‘œνΌν‹° 래퍼(Property Wrapper): @propertyWrapper μ†μ„±μœΌλ‘œ μ •μ˜λ˜λ©°, μ—¬λŸ¬ ν”„λ‘œνΌν‹°μ— λŒ€ν•œ μ½”λ“œ 쀑볡을 쀄이고 관리 λ‘œμ§μ„ μž¬μ‚¬μš©ν•  수 있게 ν•©λ‹ˆλ‹€.

ν”„λ‘œνΌν‹° 래퍼 μ΄ˆκΈ°κ°’ μ„€μ •

ν”„λ‘œνΌν‹° λž˜νΌλŠ” μ΄ˆκΈ°ν™” ꡬ문을 톡해 μΆ”κ°€ 섀정을 μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@propertyWrapper
struct SmallNumber {
    private var maximum: Int
    private var number: Int

    var wrappedValue: Int {
        get { return number }
        set { number = min(newValue, maximum) }
    }

    init() {
        maximum = 12
        number = 0
    }

    init(wrappedValue: Int) {
        maximum = 12
        number = min(wrappedValue, maximum)
    }

    init(wrappedValue: Int, maximum: Int) {
        self.maximum = maximum
        number = min(wrappedValue, maximum)
    }
}

// μ΄ˆκΈ°ν™” 방법 1: κΈ°λ³Έ μ΄ˆκΈ°ν™”
struct ZeroRectangle {
    @SmallNumber var height: Int
    @SmallNumber var width: Int
}

// μ΄ˆκΈ°ν™” 방법 2: μ΄ˆκΈ°κ°’ μ§€μ •
struct UnitRectangle {
    @SmallNumber var height: Int = 1
    @SmallNumber var width: Int = 1
}

// μ΄ˆκΈ°ν™” 방법 3: μΆ”κ°€ λ§€κ°œλ³€μˆ˜ 제곡
struct NarrowRectangle {
    @SmallNumber(wrappedValue: 2, maximum: 5) var height: Int
    @SmallNumber(wrappedValue: 3, maximum: 4) var width: Int
}

let narrowRect = NarrowRectangle()
print(narrowRect.height, narrowRect.width)  // 2 3

투영된 κ°’ (Projected Value)

ν”„λ‘œνΌν‹° λž˜νΌλŠ” projectedValue ν”„λ‘œνΌν‹°λ₯Ό 톡해 μΆ”κ°€ 정보λ₯Ό λ…ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@propertyWrapper
struct SmallNumber {
    private var number: Int
    private(set) var projectedValue: Bool

    var wrappedValue: Int {
        get { return number }
        set {
            if newValue > 12 {
                number = 12
                projectedValue = true
            } else {
                number = newValue
                projectedValue = false
            }
        }
    }

    init() {
        self.number = 0
        self.projectedValue = false
    }
}

struct SomeStructure {
    @SmallNumber var someNumber: Int
}

var someStruct = SomeStructure()
someStruct.someNumber = 4
print(someStruct.$someNumber)  // false - 값이 μ œν•œλ˜μ§€ μ•ŠμŒ

someStruct.someNumber = 55
print(someStruct.$someNumber)  // true - 값이 12둜 μ œν•œλ¨

투영된 κ°’(Projected Value): ν”„λ‘œνΌν‹° λž˜νΌκ°€ μΆ”κ°€ 정보λ₯Ό λ…ΈμΆœν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. $ 접두사λ₯Ό μ‚¬μš©ν•˜μ—¬ μ ‘κ·Όν•©λ‹ˆλ‹€.

πŸ“Œ νƒ€μž… ν”„λ‘œνΌν‹° (Type Properties)

νƒ€μž… ν”„λ‘œνΌν‹°λŠ” μΈμŠ€ν„΄μŠ€κ°€ μ•„λ‹Œ νƒ€μž… μžμ²΄μ— μ†ν•˜λŠ” ν”„λ‘œνΌν‹°μž…λ‹ˆλ‹€. λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅μœ ν•˜λŠ” 값을 μ €μž₯ν•˜λŠ” 데 μœ μš©ν•©λ‹ˆλ‹€.

struct AudioChannel {
    // νƒ€μž… ν”„λ‘œνΌν‹°
    static let thresholdLevel = 10
    static var maxInputLevelForAllChannels = 0

    // μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°
    var currentLevel: Int = 0 {
        didSet {
            // μ΅œλŒ€ μž„κ³„κ°’ μ œν•œ
            if currentLevel > AudioChannel.thresholdLevel {
                currentLevel = AudioChannel.thresholdLevel
            }
            // μ΅œλŒ€ μž…λ ₯ 레벨 μ—…λ°μ΄νŠΈ
            if currentLevel > AudioChannel.maxInputLevelForAllChannels {
                AudioChannel.maxInputLevelForAllChannels = currentLevel
            }
        }
    }
}

var leftChannel = AudioChannel()
var rightChannel = AudioChannel()

leftChannel.currentLevel = 7
print(AudioChannel.maxInputLevelForAllChannels)  // 7

rightChannel.currentLevel = 11  // 10으둜 μ œν•œλ¨
print(AudioChannel.maxInputLevelForAllChannels)  // 10

νƒ€μž… ν”„λ‘œνΌν‹°(Type Property): static ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλ˜λ©°, μΈμŠ€ν„΄μŠ€κ°€ μ•„λ‹Œ νƒ€μž… μžμ²΄μ— μ†ν•©λ‹ˆλ‹€. λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅μœ ν•˜λŠ” 값을 μ •μ˜ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

ν΄λž˜μŠ€μ—μ„œμ˜ νƒ€μž… ν”„λ‘œνΌν‹°: ν΄λž˜μŠ€μ—μ„œλŠ” static뿐만 μ•„λ‹ˆλΌ class ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•  수 있으며, class ν‚€μ›Œλ“œλŠ” ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ κ°€λŠ₯ν•œ νƒ€μž… ν”„λ‘œνΌν‹°λ₯Ό λ§Œλ“­λ‹ˆλ‹€.

πŸ“Œ μ „μ—­ 및 μ§€μ—­ λ³€μˆ˜

Swiftμ—μ„œλŠ” ν”„λ‘œνΌν‹°μ™€ μœ μ‚¬ν•˜κ²Œ μ „μ—­ 및 μ§€μ—­ λ³€μˆ˜μ—λ„ κ³„μ‚°λœ λ³€μˆ˜λ‚˜ κ΄€μ°°μžλ₯Ό μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

// μ „μ—­ 계산 λ³€μˆ˜
var globalComputedValue: Int {
    return 42
}

func someFunction() {
    // μ§€μ—­ λ³€μˆ˜μ— ν”„λ‘œνΌν‹° 래퍼 적용
    @SmallNumber var localNumber: Int = 0

    localNumber = 10  // 정상 μ„€μ •
    localNumber = 24  // 12둜 μ œν•œλ¨
    print(localNumber)  // 12
}

μ „μ—­ λ³€μˆ˜(Global Variable): ν•¨μˆ˜, λ©”μ„œλ“œ, ν΄λ‘œμ €, νƒ€μž… μ»¨ν…μŠ€νŠΈ 외뢀에 μ •μ˜λœ λ³€μˆ˜μž…λ‹ˆλ‹€.

μ§€μ—­ λ³€μˆ˜(Local Variable): ν•¨μˆ˜, λ©”μ„œλ“œ, ν΄λ‘œμ € 내뢀에 μ •μ˜λœ λ³€μˆ˜μž…λ‹ˆλ‹€.


μš”μ•½

Swift의 ν”„λ‘œνΌν‹° μ‹œμŠ€ν…œμ€ κ°•λ ₯ν•˜κ³  μœ μ—°ν•©λ‹ˆλ‹€. λ‹¨μˆœν•œ κ°’ μ €μž₯λΆ€ν„° 계산, κ΄€μ°°, νƒ€μž…λ³„ 곡유 κ°’κΉŒμ§€ λ‹€μ–‘ν•œ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

  • μ €μž₯된 ν”„λ‘œνΌν‹°λŠ” 값을 직접 μ €μž₯ν•˜λ©°, lazy ν‚€μ›Œλ“œλ‘œ μ§€μ—° μ΄ˆκΈ°ν™”κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • κ³„μ‚°λœ ν”„λ‘œνΌν‹°λŠ” 값을 μ €μž₯ν•˜μ§€ μ•Šκ³  λ‹€λ₯Έ ν”„λ‘œνΌν‹°λ₯Ό 기반으둜 κ³„μ‚°ν•©λ‹ˆλ‹€.
  • ν”„λ‘œνΌν‹° κ΄€μ°°μžλ‘œ κ°’ λ³€ν™”λ₯Ό κ°μ§€ν•˜κ³  λŒ€μ‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν”„λ‘œνΌν‹° λž˜νΌλŠ” ν”„λ‘œνΌν‹° 관리 μ½”λ“œλ₯Ό μž¬μ‚¬μš© κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€.
  • νƒ€μž… ν”„λ‘œνΌν‹°λŠ” λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅μœ ν•˜λŠ” 값을 μ •μ˜ν•©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ λ‹€μ–‘ν•œ ν”„λ‘œνΌν‹° μœ ν˜•μ„ 적절히 ν™œμš©ν•˜λ©΄ Swift둜 더 효율적이고 μ•ˆμ „ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.