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

Swift 곡식 λ¬Έμ„œ 정리 - μ„œλΈŒ 슀크립트 (Subscripts)

by BreadDev 2025. 4. 11.
728x90

μ•ˆλ…•ν•˜μ„Έμš”. μ˜€λŠ˜μ€ Swift의 'μ„œλΈŒμŠ€ν¬λ¦½νŠΈ(Subscripts)'에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. λ°°μ—΄μ΄λ‚˜ λ”•μ…”λ„ˆλ¦¬ 같은 μ»¬λ ‰μ…˜ μš”μ†Œμ— μ ‘κ·Όν•  λ•Œ 많이 μ‚¬μš©ν•˜λŠ” κΈ°λŠ₯μΈλ°μš”, μ‹€μ œλ‘œ 이 κΈ°λŠ₯을 직접 κ΅¬ν˜„ν•˜λŠ” 방법에 λŒ€ν•΄ μžμ„Ένžˆ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

πŸ“Œ μ„œλΈŒμŠ€ν¬λ¦½νŠΈλž€?

μ„œλΈŒμŠ€ν¬λ¦½νŠΈλŠ” 클래슀, ꡬ쑰체, μ—΄κ±°ν˜•μ—μ„œ μ»¬λ ‰μ…˜, 리슀트, μ‹œν€€μŠ€μ˜ μš”μ†Œμ— κ°„νŽΈν•˜κ²Œ μ ‘κ·Όν•  수 있게 ν•΄μ£ΌλŠ” νŠΉλ³„ν•œ κΈ°λŠ₯μž…λ‹ˆλ‹€. λ°°μ—΄μ—μ„œ array[index]λ‚˜ λ”•μ…”λ„ˆλ¦¬μ—μ„œ dictionary[key]처럼 λŒ€κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•΄ μš”μ†Œμ— μ ‘κ·Όν•˜λŠ” 것이 λ°”λ‘œ μ„œλΈŒμŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜λŠ” μ˜ˆμž…λ‹ˆλ‹€.

μ„œλΈŒμŠ€ν¬λ¦½νŠΈ(Subscript): λ³„λ„μ˜ λ©”μ„œλ“œ 없이 μΈλ±μŠ€λ‚˜ ν‚€λ₯Ό 톡해 μ»¬λ ‰μ…˜μ˜ μš”μ†Œμ— μ ‘κ·Όν•  수 있게 ν•΄μ£ΌλŠ” νŠΉλ³„ν•œ 문법

πŸ“Œ μ„œλΈŒμŠ€ν¬λ¦½νŠΈ ꡬ문 (Subscript Syntax)

μ„œλΈŒμŠ€ν¬λ¦½νŠΈλ₯Ό μ •μ˜ν•˜λŠ” 문법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

subscript(index: Int) -> Int {
    get {
        // μ μ ˆν•œ 값을 λ°˜ν™˜
    }
    set(newValue) {
        // μ μ ˆν•œ μ„€μ • μž‘μ—… μˆ˜ν–‰
    }
}

μ„œλΈŒμŠ€ν¬λ¦½νŠΈλŠ” 읽기 μ „μš©(read-only)으둜 λ§Œλ“€ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€:

subscript(index: Int) -> Int {
    // μ μ ˆν•œ 값을 λ°˜ν™˜
}

getter와 setter: 계산 ν”„λ‘œνΌν‹°μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μ„œλΈŒμŠ€ν¬λ¦½νŠΈλ„ getter와 setterλ₯Ό κ°€μ§ˆ 수 있으며, 읽기 μ „μš© μ„œλΈŒμŠ€ν¬λ¦½νŠΈλŠ” get 블둝을 μƒλž΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ‹€μ œ 예제: κ³±μ…ˆ ν…Œμ΄λΈ”

λ‹€μŒμ€ μ •μˆ˜μ˜ nλ°° ν…Œμ΄λΈ”μ„ κ΅¬ν˜„ν•˜λŠ” κ°„λ‹¨ν•œ μ˜ˆμ œμž…λ‹ˆλ‹€:

struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}

let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])")
// 좜λ ₯: "six times three is 18"

이 μ˜ˆμ œμ—μ„œ threeTimesTable[6]은 3의 6배인 18을 λ°˜ν™˜ν•©λ‹ˆλ‹€. μ„œλΈŒμŠ€ν¬λ¦½νŠΈλ₯Ό 톡해 배수 ν…Œμ΄λΈ”μ˜ 값을 κ°„λ‹¨ν•˜κ²Œ μ‘°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

읽기 μ „μš© μ„œλΈŒμŠ€ν¬λ¦½νŠΈ: μœ„ 예제의 μ„œλΈŒμŠ€ν¬λ¦½νŠΈλŠ” 값을 λ°˜ν™˜λ§Œ ν•˜κ³  섀정은 ν•  수 μ—†λŠ” 읽기 μ „μš© μ„œλΈŒμŠ€ν¬λ¦½νŠΈμž…λ‹ˆλ‹€.

πŸ“Œ μ„œλΈŒμŠ€ν¬λ¦½νŠΈ μ‚¬μš© (Subscript Usage)

μ„œλΈŒμŠ€ν¬λ¦½νŠΈλŠ” μ»¨ν…μŠ€νŠΈμ— 따라 λ‹€μ–‘ν•˜κ²Œ μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. Swift의 ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œλŠ” λ°°μ—΄κ³Ό λ”•μ…”λ„ˆλ¦¬κ°€ μ„œλΈŒμŠ€ν¬λ¦½νŠΈλ₯Ό ν™œμš©ν•˜λŠ” λŒ€ν‘œμ μΈ μ˜ˆμž…λ‹ˆλ‹€.

var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2  // λ”•μ…”λ„ˆλ¦¬μ— μƒˆ ν‚€-κ°’ 쌍 μΆ”κ°€

이 μ˜ˆμ œμ—μ„œλŠ” λ”•μ…”λ„ˆλ¦¬μ˜ μ„œλΈŒμŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜μ—¬ μƒˆλ‘œμš΄ ν‚€-κ°’ 쌍("bird": 2)을 μΆ”κ°€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

Dictionary μ„œλΈŒμŠ€ν¬λ¦½νŠΈ: Swift의 Dictionary νƒ€μž…μ€ μ˜΅μ…”λ„ 값을 λ°˜ν™˜ν•˜λŠ” μ„œλΈŒμŠ€ν¬λ¦½νŠΈλ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€. μ΄λŠ” λͺ¨λ“  킀에 값이 μžˆμ§€ μ•Šμ„ 수 μžˆμŒμ„ ν‘œν˜„ν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€.

πŸ“Œ μ„œλΈŒμŠ€ν¬λ¦½νŠΈ μ˜΅μ…˜ (Subscript Options)

μ„œλΈŒμŠ€ν¬λ¦½νŠΈλŠ” μ—¬λŸ¬ κ°€μ§€ λ°©μ‹μœΌλ‘œ ν™•μž₯ κ°€λŠ₯ν•©λ‹ˆλ‹€:

  1. μ—¬λŸ¬ νŒŒλΌλ―Έν„° μ‚¬μš©: μ„œλΈŒμŠ€ν¬λ¦½νŠΈλŠ” μ—¬λŸ¬ 개의 νŒŒλΌλ―Έν„°λ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
  2. λ‹€μ–‘ν•œ νƒ€μž…: νŒŒλΌλ―Έν„°μ™€ λ°˜ν™˜ 값은 μ–΄λ–€ νƒ€μž…λ„ κ°€λŠ₯ν•©λ‹ˆλ‹€.
  3. κ°€λ³€ νŒŒλΌλ―Έν„°μ™€ κΈ°λ³Έκ°’: ν•¨μˆ˜μ²˜λŸΌ κ°€λ³€ νŒŒλΌλ―Έν„°μ™€ 기본값을 μ§€μ›ν•©λ‹ˆλ‹€.
  4. μ˜€λ²„λ‘œλ”©: 같은 νƒ€μž…μ— μ—¬λŸ¬ μ„œλΈŒμŠ€ν¬λ¦½νŠΈλ₯Ό μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

닀쀑 νŒŒλΌλ―Έν„° μ„œλΈŒμŠ€ν¬λ¦½νŠΈ 예제: ν–‰λ ¬

λ‹€μŒ μ˜ˆμ œλŠ” 2차원 행렬을 ν‘œν˜„ν•˜λŠ” κ΅¬μ‘°μ²΄μ—μ„œ 두 개의 νŒŒλΌλ―Έν„°λ₯Ό κ°€μ§„ μ„œλΈŒμŠ€ν¬λ¦½νŠΈλ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€:

struct Matrix {
    let rows: Int, columns: Int
    var grid: [Double]
    
    init(rows: Int, columns: Int) {
        self.rows = rows
        self.columns = columns
        grid = Array(repeating: 0.0, count: rows * columns)
    }
    
    func indexIsValid(row: Int, column: Int) -> Bool {
        return row >= 0 && row < rows && column >= 0 && column < columns
    }
    
    subscript(row: Int, column: Int) -> Double {
        get {
            assert(indexIsValid(row: row, column: column), "μΈλ±μŠ€κ°€ λ²”μœ„λ₯Ό λ²—μ–΄λ‚¬μŠ΅λ‹ˆλ‹€")
            return grid[(row * columns) + column]
        }
        set {
            assert(indexIsValid(row: row, column: column), "μΈλ±μŠ€κ°€ λ²”μœ„λ₯Ό λ²—μ–΄λ‚¬μŠ΅λ‹ˆλ‹€")
            grid[(row * columns) + column] = newValue
        }
    }
}

ν–‰λ ¬ μš”μ†Œμ— μ ‘κ·Όν•˜κ³  μ„€μ •ν•˜λŠ” 방법:

var matrix = Matrix(rows: 2, columns: 2)
matrix[0, 1] = 1.5  // 첫 번째 ν–‰, 두 번째 열에 1.5 μ„€μ •
matrix[1, 0] = 3.2  // 두 번째 ν–‰, 첫 번째 열에 3.2 μ„€μ •

닀쀑 νŒŒλΌλ―Έν„° μ„œλΈŒμŠ€ν¬λ¦½νŠΈ: 2차원 μ΄μƒμ˜ 데이터 ꡬ쑰에 μ ‘κ·Όν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

assert: 잘λͺ»λœ 인덱슀 접근을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” 디버깅 λ„κ΅¬μž…λ‹ˆλ‹€.

πŸ“Œ νƒ€μž… μ„œλΈŒμŠ€ν¬λ¦½νŠΈ (Type Subscripts)

μ§€κΈˆκΉŒμ§€ λ³Έ μ„œλΈŒμŠ€ν¬λ¦½νŠΈλŠ” λͺ¨λ‘ μΈμŠ€ν„΄μŠ€ μ„œλΈŒμŠ€ν¬λ¦½νŠΈμ˜€μŠ΅λ‹ˆλ‹€. SwiftλŠ” νƒ€μž… μžμ²΄μ—μ„œ ν˜ΈμΆœν•  수 μžˆλŠ” νƒ€μž… μ„œλΈŒμŠ€ν¬λ¦½νŠΈλ„ μ§€μ›ν•©λ‹ˆλ‹€.

enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
    
    static subscript(n: Int) -> Planet {
        return Planet(rawValue: n)!
    }
}

let mars = Planet[4]  // marsλŠ” Planet.mars
print(mars)  // mars

νƒ€μž… μ„œλΈŒμŠ€ν¬λ¦½νŠΈλŠ” subscript ν‚€μ›Œλ“œ μ•žμ— static ν‚€μ›Œλ“œ(ꡬ쑰체와 μ—΄κ±°ν˜•) λ˜λŠ” class ν‚€μ›Œλ“œ(클래슀)λ₯Ό λΆ™μ—¬ μ •μ˜ν•©λ‹ˆλ‹€.

νƒ€μž… μ„œλΈŒμŠ€ν¬λ¦½νŠΈ(Type Subscript): μΈμŠ€ν„΄μŠ€κ°€ μ•„λ‹Œ νƒ€μž… μžμ²΄μ—μ„œ ν˜ΈμΆœλ˜λŠ” μ„œλΈŒμŠ€ν¬λ¦½νŠΈμž…λ‹ˆλ‹€.

static vs class: static은 μ˜€λ²„λΌμ΄λ”©μ„ ν—ˆμš©ν•˜μ§€ μ•Šμ§€λ§Œ, ν΄λž˜μŠ€μ—μ„œ class ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μ„œλΈŒμŠ€ν¬λ¦½νŠΈλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ μ„œλΈŒμŠ€ν¬λ¦½νŠΈμ˜ ν™œμš©

μ„œλΈŒμŠ€ν¬λ¦½νŠΈλŠ” λ‹€μŒκ³Ό 같은 μƒν™©μ—μ„œ 특히 μœ μš©ν•©λ‹ˆλ‹€:

  1. μ»€μŠ€ν…€ μ»¬λ ‰μ…˜ νƒ€μž… κ΅¬ν˜„: μžμ‹ λ§Œμ˜ μ»¬λ ‰μ…˜ νƒ€μž…μ„ λ§Œλ“€ λ•Œ μš”μ†Œ μ ‘κ·Ό 방법을 μ§κ΄€μ μœΌλ‘œ 제곡
  2. λ³΅μž‘ν•œ 데이터 ꡬ쑰 μ ‘κ·Ό: 닀차원 λ°°μ—΄, ν–‰λ ¬ 등에 κ°„νŽΈν•˜κ²Œ μ ‘κ·Ό
  3. 특수 인덱싱 κ΅¬ν˜„: ν‘œμ€€ 인덱싱 방식이 μ•„λ‹Œ νŠΉλ³„ν•œ λ°©μ‹μ˜ 인덱싱 제곡
  4. 계산 기반 μš”μ†Œ μ ‘κ·Ό: μ‹€μ œ μ €μž₯된 값이 μ•„λ‹Œ κ³„μ‚°λœ 값을 λ°˜ν™˜ν•˜λŠ” μ„œλΈŒμŠ€ν¬λ¦½νŠΈ κ΅¬ν˜„

πŸ“Œ 정리

μ„œλΈŒμŠ€ν¬λ¦½νŠΈλŠ” Swiftμ—μ„œ μ»¬λ ‰μ…˜ μš”μ†Œμ— μ§κ΄€μ μœΌλ‘œ μ ‘κ·Όν•  수 있게 ν•΄μ£ΌλŠ” κ°•λ ₯ν•œ κΈ°λŠ₯μž…λ‹ˆλ‹€. λ°°μ—΄μ΄λ‚˜ λ”•μ…”λ„ˆλ¦¬μ™€ 같은 ν‘œμ€€ μ»¬λ ‰μ…˜ νƒ€μž…μ—μ„œ 자주 μ‚¬μš©λ˜λ©°, μ‚¬μš©μž μ •μ˜ νƒ€μž…μ—λ„ 이 κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ„œλΈŒμŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜λ©΄:

  • λŒ€κ΄„ν˜Έ ꡬ문으둜 μš”μ†Œμ— μ ‘κ·Ό κ°€λŠ₯
  • μ—¬λŸ¬ νŒŒλΌλ―Έν„°λ₯Ό μ§€μ›ν•˜λŠ” 닀차원 μ ‘κ·Ό κ°€λŠ₯
  • 읽기 μ „μš© λ˜λŠ” 읽기-μ“°κΈ° κ°€λŠ₯ν•œ μ ‘κ·Ό 방식 κ΅¬ν˜„ κ°€λŠ₯
  • μΈμŠ€ν„΄μŠ€ μˆ˜μ€€ 및 νƒ€μž… μˆ˜μ€€μ—μ„œ κ΅¬ν˜„ κ°€λŠ₯

μ΄λŸ¬ν•œ μœ μ—°μ„± 덕뢄에 μ„œλΈŒμŠ€ν¬λ¦½νŠΈλŠ” Swiftμ—μ„œ μ»¬λ ‰μ…˜κ³Ό μ‹œν€€μŠ€λ₯Ό λ‹€λ£° λ•Œ μ½”λ“œμ˜ 가독성과 ν‘œν˜„λ ₯을 크게 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.