오늘은 Swift의 서브 스크립트(subscript)에 대해서 알아보려고 합니다!
사실은 Struct와 Class의 차이에 대해 포스팅을 하려고 관련 자료를 찾아보다가 두 개의 공통점으로 서브 스크립트 구문을 사용하여 값에 접근을 제공하는 서브 스크립트 정의 라는 문장이 보이더라구요!
그래서 먼저 서브 스크립트에 대해서 학습을 하고 나서 Struct와 Class 의 차이에 대해서 포스팅을 해보려고 합니다!
1. 서브 스크립트란?
콜렉션의 요소에 접근합니다.
클래스, 구조체, 그리고 열거형은 콜렉션, 리스트, 또는 시퀀스의 멤버 요소에 접근할 수 있는 단축키인 서브 스크립트 (subscripts) 를 정의할 수 있습니다. 설정과 검색을 위한 별도의 메서드 없이 인덱스로 값을 설정하고 조회하기 위해 서브 스크립트를 사용합니다.
말은 어렵지만 사실 우리는 이미 서브 스크립트를 써오고 있었다는 사실 알고 계셨나요? (저는 몰랐어요 ㅎ)
저희가 흔히 배열의 index를 통해 인스턴스에 접근하거나, 딕셔너리에서 key 값을 통해서 인스턴스에 접근하는게 모두 서브 스크립트를 사용하는 것이라고 합니다!
var streets = ["Adams", "Bryant", "Channing", "Douglas", "Evarts"]
streets[1] = "Butler"
print(streets[1])
배열의 특정 원소에 접근하기 위해서 [ ]를 사용해서 접근하는 것이 서브 스크립트라는 거죠!
공식 문서에도 나와있듯이 index를 넣어주면 Element를 리턴하는 이것이 서브 스크립트입니다!
저희가 배열의 특정 구간을 슬라이싱 하는 경우도 있잖아요??
let arr = [0, 1, 2, 3, 4]
print(arr[1...3])
이런 경우도 서브 스크립트를 사용한다는 사실!
2. 서브 스크립트 구문
자 이제 서브 스크립트가 뭔지 조금이나마 알게 되었으니 서브 스크립트 구문에 대해서 알아보겠습니다!
subscript 키워드로 서브 스크립트 정의를 작성하고 인스턴스 메서드와 같은 방법으로 하나 이상의 입력 파라미터와 반환 타입을 작성합니다. 인스턴스 메서드와 다르게 서브 스크립트는 읽기-쓰기 또는 읽기전용이 될 수 있습니다. (쓰기 전용은 불가능!!) 이러한 동작은 계산된 프로퍼티와 같은 방법으로 getter와 setter를 통해 동작합니다.
그러니까 서브 스크립트를 사용하기 위해서는 subscript 키워드로 시작하고, 함수를 정의할 때 파라미터를 넣어주듯이 1개 이상의 파라미터를 넣어주면 된다는 소리에요!
subscript(index: Int) -> Int {
get {
// 적절한 서브 스크립트 값을 반환합니다.
}
set(newValue) {
// 적절한 설정 작업 값이 수행됩니다.
}
}
이런 식으로 기본적인 구조가 되어있구요 get-only 일 경우 get 구문의 생략도 가능합니다.
subscript(index: Int) -> Int {
}
이런 식으로요!
3. 서브 스크립트 사용법
자 이제 그럼 서브 스크립트 사용법을 간단하게 알아보겠습니다!
struct TimeTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
TimeTable 이라는 구조체를 만들어준 뒤 subscript 구문을 사용해서 index의 배수만큼 곱해서 리턴하는 서브 스크립트를 만들어 봤습니다.
let timeTable = TimeTable(multiplier: 3)
print(timeTable[6])
말한 대로 동일하게 multiplier = 3 을 가지는 timeTable 인스턴스에 [6] 을 넣어주어 리턴값 18을 얻는 것을 확인할 수 있었습니다!
그런데 위에서 서브 스크립트의 파라미터는 1개 이상 가능하다고 했죠? 그렇다면 익숙하지는 않지만 이런 것도 가능합니다.
struct Worker {
let name: String
subscript(job: String, times: Int) -> String {
return ("\(name)'s job is a \(job) and he works \(times) a day.")
}
}
파라미터로 name을 가지는 Worker 구조체를 정의해주었고, 서브 스크립트 파라미터로 job과 times를 받아서 worker의 직업과 하루에 얼마나 일하는 지를 알려주는 문자열을 리턴해주도록 하였습니다.
let worker = Worker(name: "bob")
print(worker["programmer", 8])
이제 실제 worker 객체를 만들고 서브 스크립트를 통해 리턴 된 값을 출력해보면?!
아주 잘 되는 것을 확인할 수 있네요!
.
.
.
오늘은 서브 스크립트에 대해서 알아봤습니다.
사실 구조체와 클래스의 공통점과 차이점에 대해 공부하면서 서브 스크립트가 뭐지..? 하고 찾아본 것이어서 실제로 어떤 경우에 커스텀해서 사용할 지는 잘 감이 안오지만... 개념을 알고 있으면 언젠간 써먹을 수 있겠죠!
오늘 포스팅 봐주셔서 감사합니다!
'Swift' 카테고리의 다른 글
[Swift] Core Data 기본(Core Data Stack과 NSManagedObjectContext) (0) | 2024.11.17 |
---|---|
Electron 앱과 Swift Native 앱간 통신하기 (0) | 2024.09.04 |
[Swift] Struct vs Class (0) | 2024.08.22 |
[Swift] Picker 숫자에 간격 주기 (0) | 2024.08.02 |
[Swift] UIViewController를 SwiftUI에서 사용하는 법 (0) | 2024.08.02 |