서브스크립트(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)")
}
구조체의 서브스크립트
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])
print(matrix[2, 2])
타입 서브스크립트(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)
}
서브스크립트의 특징
- 다중 파라미터 지원
- 서브스크립트는 하나 이상의 파라미터를 받을 수 있다 (예:
matrix[0, 1])
- 읽기 전용 서브스크립트
get 블록만 구현하여 값을 읽기 전용으로 설정할 수 있다
- 쓰기 전용 서브스크립트는 불가능
- 반드시 값을 읽어올 수 있는
get 블록이 포함되어야 한다
- 즉,
set 블록만 존재하는 서브스크립트는 선언할 수 없다
- 파라미터의 타입과 리턴 타입을 모두 지정해야 함
- Swift의 타입 추론으로는 서브스크립트의 타입을 추정할 수 없기 때문이다
서브스크립트 사용 예시
- 도서 관리 시스템
- 행렬 계산
- 열거형의 타입 서브스크립트
- 배열, 딕셔너리, 문자열 등 표준 라이브러리에서의 활용
서브스크립트 선언 시 주의사항
- 서브스크립트는 반드시 리턴 타입을 명시해야 한다
- 인스턴스 서브스크립트와 타입 서브스크립트 모두 구현할 수 있다
static 또는 class 키워드를 사용하여 타입 서브스크립트를 선언한다
newValue를 이용하여 설정 값을 다룰 수 있다 (set 블록에서 사용 가능)
- 서브스크립트는 인스턴스 메서드와 비슷하지만, 이름이 없고 대괄호(
[])로 호출한다
요약
- 서브스크립트: 인스턴스 또는 타입에 대괄호(
[]) 문법으로 값을 설정하거나 가져오는 기능
- 인스턴스 서브스크립트: 클래스, 구조체, 열거형에서 선언 가능
- 타입 서브스크립트:
static 또는 class 키워드를 사용하여 선언
- 읽기 전용 / 읽기 - 쓰기 모두 가능:
get과 set 블록을 사용
- 다중 파라미터 지원: 여러 개의 파라미터를 받아 다양한 용도로 활용 가능