λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
⌨️ Language/swift

[Swift] ν”„λ‘œνΌν‹°

by hyebin (Helia) 2024. 3. 20.
λ°˜μ‘ν˜•
μ €μž₯ ν”„λ‘œνΌν‹° 계산 ν”„λ‘œνΌν‹°
값을 μ €μž₯ν•˜κ³  μžˆλŠ” ν”„λ‘œνΌν‹° 값을 μ €μž₯ν•˜κ³  μžˆμ§€ μ•Šκ³  νŠΉμ •ν•˜κ²Œ κ³„μ‚°ν•œ 값을 λ°˜ν™˜ν•΄ μ£ΌλŠ” ν”„λ‘œνΌν‹°
ν΄λž˜μŠ€μ™€ κ΅¬μ‘°μ²΄μ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯ 클래슀, ꡬ쑰체, μ—΄κ±°ν˜• λͺ¨λ‘μ—μ„œ μ‚¬μš©κ°€λŠ₯

μ €μž₯ ν”„λ‘œνΌν‹°

letν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄μ„œ μƒμˆ˜ ν˜Ήμ€ varν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄μ„œ λ³€μˆ˜λ‘œ μ„ μ–Έν•΄ μ‚¬μš©

struct FixedLengthRange {
    var firstValue: Int
    let length: Int
}

var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
// λ²”μœ„ 값은 0, 1, 2 μž…λ‹ˆλ‹€.

rangeOfThreeItems.firstValue = 6
// λ²”μœ„ 값은 6, 7, 8 μž…λ‹ˆλ‹€.

 

μƒμˆ˜ ꡬ쑰체 μΈμŠ€ν„΄μŠ€μ˜ μ €μž₯ ν”„λ‘œνΌν‹°

ꡬ쑰체λ₯Ό μƒμˆ˜(let)둜 μ„ μ–Έν•˜λ©΄ κ·Έ ꡬ쑰체 μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œνΌν‹°λ₯Ό λ³€κ²½ν•  수 μ—†μŒ

ν΄λž˜μŠ€λŠ” let으둜 μ„ μ–Έν•˜λ”λΌλ„ ν”„λ‘œνΌν‹°κ°€ λ³€κ²½ κ°€λŠ₯

  • 클래슀 μΈμŠ€ν„΄μŠ€λŠ” μ°Έμ‘° νƒ€μž…μ΄κΈ° λ•Œλ¬Έ
let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)
// λ²”μœ„ 값은 0, 1, 2, 3 μž…λ‹ˆλ‹€.

rangeOfFourItems.firstValue = 6
// μ—λŸ¬ λ°œμƒ!

μ§€μ—° μ €μž₯ ν”„λ‘œνΌν‹°

  • 값이 처음으둜 μ‚¬μš© 되기 μ „μ—λŠ” κ³„μ‚°λ˜μ§€ μ•ŠλŠ” ν”„λ‘œνΌν‹°
  • ν”„λ‘œνΌν‹°μ˜ μ„ μ–Έ μ•žμ— lazy ν‚€μ›Œλ“œλ₯Ό λΆ™μž„
  • λ°˜λ“œμ‹œ λ³€μˆ˜(var)둜 μ„ μ–Έν•΄μ•Ό 함
    • μƒμˆ˜λŠ” μ΄ˆκΈ°ν™”κ°€ λ˜κΈ°μ „μ— 항상 값을 κ°™λŠ” ν”„λ‘œνΌν‹°μΈλ°, μ§€μ—° ν”„λ‘œνΌν‹°λŠ” 처음 μ‚¬μš©λ˜κΈ° μ „μ—λŠ” 값을 κ°–μ§€ μ•ŠλŠ” ν”„λ‘œνΌν‹°μ΄κΈ° λ•Œλ¬Έ

μ§€μ—° μ €μž₯ ν”„λ‘œνΌν‹°μ˜ μ‚¬μš©

  • ν”„λ‘œνΌν‹°κ°€ νŠΉμ • μš”μ†Œμ— μ˜μ‘΄μ μ΄μ–΄μ„œ κ·Έ μš”μ†Œκ°€ λλ‚˜κΈ° 전에 μ μ ˆν•œ 값을 μ•Œμ§€ λͺ»ν•˜λŠ” 경우
  • λ³΅μž‘ν•œ κ³„μ‚°μ΄λ‚˜ λΆ€ν•˜κ°€ 많이 κ±Έλ¦¬λŠ” μž‘μ—…μ„ ν•  λ•Œ μ‚¬μš©ν•˜λ©΄ μ‹€μ œ μ‚¬μš©λ˜κΈ° μ „μ—λŠ” μ‹€ν–‰λ˜μ§€ μ•Šμ•„μ„œ μΈμŠ€ν„΄μŠ€μ˜ μ΄ˆκΈ°ν™” μ‹œμ μ— λ³΅μž‘ν•œ 계산을 ν”Όν•  수 있음

단일 μŠ€λ ˆλ“œμ—μ„œ μ‚¬μš©ν•  λ•Œ

  • μ΄ˆκΈ°ν™”λŠ” ν•œ 번만 μˆ˜ν–‰λ¨
  • 단일 μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλŠ” 처음으둜 μ§€μ—° ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜λŠ” μ‹œμ μ— μ΄ˆκΈ°ν™”κ°€ μˆ˜ν–‰λ˜κ³ , μ΄ν›„μ—λŠ” 이미 μ΄ˆκΈ°ν™”λœ 값이 λ°˜ν™˜λ¨

μ—¬λŸ¬ μŠ€λ ˆλ“œμ—μ„œ μ ‘κ·Όν•  경우

  • μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— ν•΄λ‹Ή μ§€μ—° ν”„λ‘œνΌν‹°λ₯Ό ν‰κ°€ν•˜μ—¬ μ΄ˆκΈ°ν™”λ₯Ό μ‹œλ„ κ°€λŠ₯ => μ—¬λŸ¬ 번의 μ΄ˆκΈ°ν™”κ°€ λ°œμƒν•  수 있음
  • 닀쀑 μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ‚¬μš©ν•  λ•ŒλŠ” λ™μ‹œ 접근에 λŒ€ν•œ 동기화(Synchronization)λ₯Ό κ³ λ €ν•΄μ•Ό 함

 

계산 ν”„λ‘œνΌν‹°

클래슀, ꡬ쑰체, μ—΄κ±°ν˜•μ—μ„œ μ‹€μ œ 값을 μ €μž₯ν•˜κ³  μžˆλŠ” 것이 μ•„λ‹ˆλΌ getter와 optionalν•œ setterλ₯Ό μ œκ³΅ν•΄ 값을 νƒμƒ‰ν•˜κ³  κ°„μ ‘μ μœΌλ‘œ λ‹€λ₯Έ ν”„λ‘œνΌν‹° 값을 μ„€μ •ν•  수 있음

 

Setter μ„ μ–Έμ˜ κ°„λž΅ν•œ ν‘œν˜„

struct AlternativeRect {
    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 {
                origin.x = newValue.x - (size.width / 2)
                origin.y = newValue.y - (size.height / 2)
        }
    }
}

μ½κΈ°μ „μš© 계산 ν”„λ‘œνΌν‹°

getter만 있고 setterλ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠλŠ” 계산 ν”„λ‘œνΌν‹°

μ½κΈ°μ „μš© 계산 ν”„λ‘œνΌν‹°λŠ” λ°˜λ“œμ‹œ λ°˜ν™˜ 값을 μ œκ³΅ν•˜κ³  λ‹€λ₯Έ 값을 μ§€μ •ν•  μˆ˜λŠ” μ—†λŠ” ν”„λ‘œνΌν‹°

주의!
κ³„μ‚°λœ ν”„λ‘œνΌν‹°λ₯Ό μ„ μ–Έμ‹œμ—λŠ” λ°˜λ“œμ‹œ let 이 μ•„λ‹ˆλΌ var 둜 선언해야함
보톡 μ½κΈ°μ „μš©(read-only)이라 함은 ν•œλ²ˆ 값이 μ •ν•΄μ§€λ©΄ λ³€ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— let 으둜 μ„ μ–Έν•˜λŠ” 것이 λ§žμœΌλ‚˜ κ³„μ‚°λœ ν”„λ‘œνΌν‹°λŠ” μ½κΈ°μ „μš©(read-only)이라 ν•˜λ”λΌλ„ 계산 κ°’(width, height, depth λ“±)에 따라 값이 λ³€ν•  수 있기 λ•Œλ¬Έμ— var 둜 선언함

 

ν”„λ‘œνΌν‹° μ˜΅μ €λ²„

  • ν”„λ‘œνΌν‹°μ—λŠ” μƒˆ 값이 μ„€μ •(set) 될 λ•Œλ§ˆλ‹€ 이 이벀트λ₯Ό 감지할 수 μžˆλŠ” μ˜΅μ €λ²„λ₯Ό 제곡 ,μƒˆ 값이 이전 κ°’κ³Ό 같더라도 항상 호좜됨
  • ν”„λ‘œνΌν‹° μ˜΅μ €λ²„λŠ” μ§€μ—° μ €μž₯ ν”„λ‘œνΌν‹°μ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†μŒ
  • κ³„μ‚°λœ ν”„λ‘œνΌν‹°λŠ” setterμ—μ„œ κ°’μ˜ λ³€ν™”λ₯Ό 감지 ν•  수 있기 λ•Œλ¬Έμ— λ”°λ‘œ μ˜΅μ €λ²„λ₯Ό μ •μ˜ν•  ν•„μš”κ°€ μ—†μŒ

willSet

  • 값이 μ €μž₯되기 λ°”λ‘œ 직전에 호좜
  • willSetμ—μ„œλŠ” μƒˆ κ°’μ˜ νŒŒλΌλ―Έν„°λͺ…을 μ§€μ •ν•  수 μžˆλŠ”λ°, μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ κΈ°λ³Έ κ°’μœΌλ‘œ newValueλ₯Ό μ‚¬μš©

didSet

  • μƒˆ 값이 μ €μž₯되고 λ‚œ 직후에 호좜
  • didSetμ—μ„œλŠ” λ°”λ€ŒκΈ° μ „μ˜ κ°’μ˜ νŒŒλΌλ―Έν„°λͺ…을 μ§€μ •ν•  수 μžˆλŠ”λ°, μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ κΈ°λ³Έ κ°’μœΌλ‘œ oldValueλ₯Ό μ‚¬μš©
class StepCounter {
    var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
         print("About to set totalSteps to \\(newTotalSteps)")
        }
        
        didSet {
            if totalSteps > oldValue  {
                print("Added \\(totalSteps - oldValue) steps")
            }
        }
    }
}

let stepCounter = StepCounter()

stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps

stepCounter.totalSteps = 360
// About to set totalSteps to 360
// Added 160 steps

stepCounter.totalSteps = 896
// About to set totalSteps to 896
// Added 536 steps

 

  • willSet → μƒˆλ‘œμš΄ κ°’μ˜ νŒŒλΌλ―Έν„°λͺ…μœΌλ‘œ newTotalStepsλ₯Ό μ§€μ •ν•΄μ„œ μ‚¬μš©
  • didSet → λ³€ν•˜κΈ° μ „μ˜ 값을 μ˜λ―Έν•˜λŠ” νŒŒλΌλ―Έν„°λͺ…을 μ§€μ •ν•˜μ§€ μ•Šκ³  oldValueλΌλŠ” κΈ°λ³Έ νŒŒλΌλ―Έν„°λͺ…을 이용

 

μ „μ—­λ³€μˆ˜μ™€ μ§€μ—­λ³€μˆ˜

ν”„λ‘œνΌν‹°μ™€ ν”„λ‘œνΌν‹° μ˜΅μ €λ²„ κΈ°λŠ₯은 μ „μ—­λ³€μˆ˜μ™€ μ§€μ—­λ³€μˆ˜ λͺ¨λ‘μ—μ„œ 이용 κ°€λŠ₯

 

μ „μ—­ λ³€μˆ˜

  • ν•¨μˆ˜, λ©”μ†Œλ“œ, ν΄λ‘œμ € ν˜Ήμ€ νƒ€μž… μ»¨ν…μŠ€νŠΈ 밖에 μ •μ˜λœ λ³€μˆ˜
  • μ „μ—­ μƒμˆ˜μ™€ λ³€μˆ˜λŠ” lazyν‚€μ›Œλ“œλ₯Ό 뢙일 ν•„μš” 없이 μ§€μ—° μ €μž₯ ν”„λ‘œνΌν‹°μ²˜λŸΌ μ§€μ—° 계산됨

μ§€μ—­ λ³€μˆ˜

  • ν•¨μˆ˜, λ©”μ†Œλ“œ, ν΄λ‘œμ € ν˜Ήμ€ νƒ€μž… μ»¨ν…μŠ€νŠΈ μ•ˆμ— μ„ μ–Έλœ λ³€μˆ˜
  • μ§€μ—­ μƒμˆ˜μ™€ λ³€μˆ˜λŠ” μ§€μ—° 계산될 수 μ—†μŒ

 

νƒ€μž… ν”„λ‘œνΌν‹°

  • νƒ€μž… ν”„λ‘œνΌν‹°λŠ” νŠΉμ • νƒ€μž…μ— μ†ν•œ ν”„λ‘œνΌν‹°λ‘œ κ·Έ νƒ€μž…μ— ν•΄λ‹Ήν•˜λŠ” 단 ν•˜λ‚˜μ˜ ν”„λ‘œνΌν‹°λ§Œ 생성
  • νŠΉμ • νƒ€μž…μ˜ λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ— κ³΅ν†΅μœΌλ‘œ μ‚¬μš©λ˜λŠ” 값을 μ •μ˜ν• λ•Œ μœ μš©ν•¨
주의!
νƒ€μž… ν”„λ‘œνΌν‹°λŠ” 항상 μ΄ˆκΈ°κ°’μ„ μ§€μ •ν•΄μ„œ μ‚¬μš©ν•΄μ•Όν•¨ → νƒ€μž… μžμ²΄μ—λŠ” 초기자(Initializer)κ°€ μ—†μ–΄ μ΄ˆκΈ°ν™” ν•  곳이 μ—†κΈ° λ•Œλ¬Έ

νƒ€μž… ν”„λ‘œνΌν‹° ꡬ문

static ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©

struct SomeStructure {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
            return 1
    }
}

enum SomeEnumeration {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
            return 6
    }
}

class SomeClass {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
            return 27
    }
    class var overrideableComputedTypeProperty: Int {
            return 107
    }
}

νƒ€μž… ν”„λ‘œνΌν‹°μ˜ μ ‘κ·Όκ³Ό μ„€μ •

점 문법을 μ‚¬μš©ν•˜μ—¬ ν”„λ‘œνΌν‹°μ˜ 값을 κ°€μ Έμ˜€κ³  ν• λ‹Ή

print(SomeStructure.storedTypeProperty)
// Prints "Some value."

SomeStructure.storedTypeProperty = "Another value."

print(SomeStructure.storedTypeProperty)
// Prints "Another value."

print(SomeEnumeration.computedTypeProperty)
// Prints "6"

print(SomeClass.computedTypeProperty)
// Prints "27"

 

νƒ€μž… ν”„λ‘œνΌν‹° μž₯점

  • λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅μœ ν•˜λŠ” 값이기 λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ μ‚¬μš©μ„ 효율적으둜 관리 κ°€λŠ₯
    • μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ μ€‘λ³΅λœ 값을 μ €μž₯ν•  ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ μ ˆμ•½ κ°€λŠ₯
  • λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ λ™μΌν•œ νƒ€μž… ν”„λ‘œνΌν‹° 값을 μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ—, μ˜ˆμƒμΉ˜ λͺ»ν•œ κ°’μ˜ μ°¨μ΄λ‚˜ 뢈일치 λ°©μ§€ κ°€λŠ₯
λ°˜μ‘ν˜•

'⌨️ Language > swift' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Swift] μ„œλΈŒμŠ€ν¬λ¦½νŠΈ  (0) 2024.03.22
[Swift] λ©”μ„œλ“œ  (0) 2024.03.21
[Swift] ν΄λž˜μŠ€μ™€ ꡬ쑰체  (0) 2024.03.19
[Swift] ν΄λ‘œμ €  (1) 2024.03.18
[Swift] μ˜ˆμ™Έ μ²˜λ¦¬μ™€ ν•¨μˆ˜  (4) 2024.03.17