TIL: 서브스크립트(Subscripts)

Royce·2025년 3월 22일

Swift 문법

목록 보기
31/63

서브스크립트(Subscripts)

  • 서브스크립트(Subscript)는 클래스, 구조체, 열거형에서 대괄호([]) 문법으로 값을 설정하거나 가져오는 기능을 제공한다
  • 인스턴스의 속성이나 메서드를 호출하는 대신, 특정 인덱스 또는 키로 값을 접근할 수 있게 하는 문법이다
  • 배열(array[index]), 딕셔너리(dictionary[key])에서 이미 사용하고 있는 방식이다

서브스크립트 선언 방법

subscript(index: Int) -> Type {
    get {
        // 값 반환 코드
    }
    set(newValue) {
        // 값 설정 코드
    }
}
  • get 블록과 set 블록을 모두 포함하여 읽기/쓰기가 가능한 서브스크립트를 구현한다
  • set 블록을 생략하면 읽기 전용 서브스크립트가 된다
  • newValue 라는 기본 파라미터 이름을 사용하여 값에 접근할 수 있다 (다른 이름으로 변경 가능)

클래스의 서브스크립트

class Book {
    var title: String
    var author: String
    
    init(title: String, author: String) {
        self.title = title
        self.author = author
    }
}

class Library {
    private var books: [String: Book] = [:]  // 책 목록을 저장할 딕셔너리
    
    func addBook(_ book: Book) {
        books[book.title] = book
    }
    
    subscript(title: String) -> Book? {  // 서브스크립트 선언
        get {
            return books[title]
        }
        set {
            books[title] = newValue
        }
    }
}

서브스크립트 사용 방법(클래스)

let library = Library()

let book1 = Book(title: "Swift Programming", author: "Apple Inc.")
let book2 = Book(title: "The Swift Language Guide", author: "Allen")

library.addBook(book1)
library["The Swift Language Guide"] = book2

if let foundBook = library["Swift Programming"] {
    print("책 제목: \(foundBook.title), 저자: \(foundBook.author)")
}
// 출력: 책 제목: Swift Programming, 저자: Apple Inc.

구조체의 서브스크립트

struct Matrix {
    private var grid: [[Int]]
    
    init(size: Int) {
        grid = Array(repeating: Array(repeating: 0, count: size), count: size)
    }
    
    subscript(row: Int, column: Int) -> Int {
        get {
            return grid[row][column]
        }
        set {
            grid[row][column] = newValue
        }
    }
}

서브스크립트 사용 방법

var matrix = Matrix(size: 3)
matrix[0, 1] = 10
matrix[2, 2] = 5

print(matrix[0, 1])  // 출력: 10
print(matrix[2, 2])  // 출력: 5

타입 서브스크립트(Type Subscripts)

  • 인스턴스가 아닌 타입 자체에 대한 서브스크립트를 정의하는 방식이다
  • 클래스, 구조체, 열거형 모두에서 선언할 수 있다
  • static 또는 class 키워드를 사용하여 선언한다 (class는 재정의 가능)
enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
    
    static subscript(index: Int) -> Planet? {
        return Planet(rawValue: index)
    }
}

if let planet = Planet[3] {
    print(planet)  // 출력: earth
}

서브스크립트의 특징

  1. 다중 파라미터 지원
    • 서브스크립트는 하나 이상의 파라미터를 받을 수 있다 (예: matrix[0, 1])
  2. 읽기 전용 서브스크립트
    • get 블록만 구현하여 값을 읽기 전용으로 설정할 수 있다
  3. 쓰기 전용 서브스크립트는 불가능
    • 반드시 값을 읽어올 수 있는 get 블록이 포함되어야 한다
    • 즉, set 블록만 존재하는 서브스크립트는 선언할 수 없다
  4. 파라미터의 타입과 리턴 타입을 모두 지정해야 함
    • Swift의 타입 추론으로는 서브스크립트의 타입을 추정할 수 없기 때문이다

서브스크립트 사용 예시

  • 도서 관리 시스템
  • 행렬 계산
  • 열거형의 타입 서브스크립트
  • 배열, 딕셔너리, 문자열 등 표준 라이브러리에서의 활용

서브스크립트 선언 시 주의사항

  1. 서브스크립트는 반드시 리턴 타입을 명시해야 한다
  2. 인스턴스 서브스크립트와 타입 서브스크립트 모두 구현할 수 있다
  3. static 또는 class 키워드를 사용하여 타입 서브스크립트를 선언한다
  4. newValue를 이용하여 설정 값을 다룰 수 있다 (set 블록에서 사용 가능)
  5. 서브스크립트는 인스턴스 메서드와 비슷하지만, 이름이 없고 대괄호([])로 호출한다

요약

  • 서브스크립트: 인스턴스 또는 타입에 대괄호([]) 문법으로 값을 설정하거나 가져오는 기능
  • 인스턴스 서브스크립트: 클래스, 구조체, 열거형에서 선언 가능
  • 타입 서브스크립트: static 또는 class 키워드를 사용하여 선언
  • 읽기 전용 / 읽기 - 쓰기 모두 가능: getset 블록을 사용
  • 다중 파라미터 지원: 여러 개의 파라미터를 받아 다양한 용도로 활용 가능
profile
iOS 개발자 지망생

0개의 댓글