문자열의 인덱스(String Index)

썹스·2022년 12월 11일
0

Swift 문법

목록 보기
54/68

문자열의 인덱스(String Index)

특정 문자들을 조합하여 만들어진 문자열(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
 */

요약

문자열 인덱스 반환

문자열 범위 반환

profile
응애 나 코린이(비트코인X 코딩O)

0개의 댓글