특정 문자들을 조합하여 만들어진 문자열(String)은 배열(Array)과 같은 데이터 바구니의 개념을 내포하고 있으므로 인덱스를 사용할 수 있습니다.
하지만 배열의 인덱스(Array Index)와 문자열의 인덱스(String Index)의 사용법은 서로 다릅니다.
배열의 경우에는 정수(Int)형 인덱스 번호를 사용하여 원하는 값을 반환 받지만, 문자열의 경우에는 정수형 인덱스 번호를 사용할 수 없습니다.
문자열의 경우에는 문자열 인덱스 타입(String.Index)
을 사용하여 원하는 값을 반환 받습니다.
(문자열 인덱스 타입(String.Index)
은 문자열의 인덱스 관련 속성과 메서드를 이용하여 생성)
🤔 왜 문자열(String)에서는 정수(Int)형 인덱스 번호를 사용하지 못할까??
배열의 경우 데이터를 일정한 간격으로 메모리에 저장하지만, 문자열의 경우에는 데이터를 메모리에 일정하지 않은 간격으로 데이터를 저장하기 때문입니다.
-> 결합형 문자(ㅎ+ㅏ+ㄴ = 한)와 특수 문자(😀)처럼 저장공간이 일정하지 않은 문자가 존재
✅ 문자열.startIndex
.startIndex
속성을 사용하면 문자열의 첫 번째 인덱스를 반환받을 수 있습니다.var str = "Hello kim" var someIndex = str.startIndex str[someIndex] // H
✅ 문자열.endIndex
.endIndex
속성을 사용하면 문자열의 마지막 인덱스를 반환받을 수 있습니다.마지막 인덱스는 메모리 주소의 끝을 의미하기 때문에 서브 스크립트([ ]) 안에서 사용할 수 없으며,
문자열.endIndex
의 반환 값을 서브 스크립트([ ]) 안에서 사용할 때는 특정 작업을 거쳐야 합니다.var str = "Hello kim" var someIndex = str.endIndex // 문자열.endIndex는 str[someIndex] // 에러 발생
✅ 문자열.index(문자열.인덱스 시작 위치, offsetBy: n)
.index(문자열.인덱스 시작 위치, offsetBy: n)
메서드를 사용하면 문자열의 시작 위치를 기점으로 n번째 인덱스를 반환받을 수 있습니다.첫 번째 위치에서 시작
var str = "Hello kim" var someIndex = str.index(str.startIndex, offsetBy: 4) str[someIndex] // o
마지막 위치에서 시작
var str = "Hello kim" var someIndex = str.index(str.endIndex, offsetBy: -1) str[someIndex] // m
✅ 문자열.index(after: 문자열.인덱스 시작 위치)
.index(after: 문자열.인덱스 시작 위치)
메서드를 사용하면 시작 위치 인덱스의 다음 인덱스를 반환받을 수 있습니다.
.index(after: 문자열.인덱스 시작 위치)
메서드의 시작 위치는문자열.endIndex
가 들어올 수 없습니다. (마지막 인덱스의 다음 인덱스는 존재하지 않음)var str = "Hello kim" var someIndex = str.index(after: str.startIndex) str[someIndex] // e
✅ 문자열.index(before: 문자열.인덱스 시작 위치)
.index(before: 문자열.인덱스 시작 위치)
메서드를 사용하면 시작 위치 인덱스의 이전 인덱스를 반환받을 수 있습니다.
.index(before: 문자열.인덱스 시작 위치)
메서드의 시작 위치는문자열.startIndex
가 들어올 수 없습니다. (첫 번째 인덱스의 이전 인덱스는 존재하지 않음)var str = "Hello kim" var someIndex = str.index(before: str.endIndex) str[someIndex] // m
✅ 문자열.indices
.indices
속성을 사용하면 문자열의 모든 인덱스를 반환받을 수 있습니다.
.indices
속성으로 반환된 인덱스의 타입은DefaultIndices<String>
타입입니다.var str = "Hello kim" var someIndex = str.indices for i in someIndex{ print(str[i], terminator: " ") } /* 출력 결과 H e l l o k i m */
✅ 문자열.firstIndex(of: 문자)
.firstIndex(of: X)
메서드를 사용하면 문자열의 앞부분부터 조회하여 원하는 문자(X)의 인덱스를 옵셔널 타입으로 반환받을 수 있습니다.var str = "Hello kim" var someIndex = str.firstIndex(of: "k")! // 문자 k의 인덱스 값을 옵셔널 타입으로 반환 print(str[someIndex]) // k
✅ 문자열.lastIndex(of: 문자)
.firstIndex(of: X)
메서드를 사용하면 문자열의 끝부분부터 역으로 조회하여 원하는 문자(X)의 인덱스를 옵셔널 타입으로 반환받을 수 있습니다.var str = "Hello kim" var someIndex = str.lastIndex(of: "k")! // 문자 k의 인덱스 값을 옵셔널 타입으로 반환 print(str[someIndex]) // k
✅ 문자열.range(of: 원하는 문자열)
.range(of: 원하는 문자열)
메서드를 사용하면 문자열의 원하는 문자열의 범위를 옵셔널 타입으로 반환받을 수 있습니다.var str = "Hello kim" var someRange = str.range(of: "kim")! print(someRange) // 문자열 인덱스의 범위 print(str[someRange]) /*출력 결과 Index(_rawBits: 393216)..<Index(_rawBits: 589824) kim */
.range(of: 원하는 문자열)
메서드에options: [.caseInsensitive]
파라미터를 추가하면 대/소문자 구분 없이 원하는 문자열의 범위를 옵셔널 타입으로 반환받을 수 있습니다.var str = "Hello kim" var someRange = str.range(of: "KIM", options: [.caseInsensitive])! // 대/소문자 구별 X print(someRange) // 문자열 인덱스의 범위 print(str[someRange]) /*출력 결과 Index(_rawBits: 393216)..<Index(_rawBits: 589824) kim */
문자열 인덱스 반환
문자열 범위 반환