iOS/Swift

[Swift] split과 components

최지철 2024. 9. 16. 23:53
728x90
반응형

Swift의 split과 components 비교: 문자열을 나누는 두 가지 방법

문자열을 특정 기준으로 나누는 작업이 매우 빈번하게 이루어집니다.
이때 주로 사용되는 두 가지 방법이 있습니다: split 메서드와 components(separatedBy:) 메서드입니다.
이 두 메서드는 기능적으로 비슷하지만, 사용 목적과 반환 값에서 차이가 있습니다

 

split

func split(separator: Character, omittingEmptySubsequences: Bool = true, maxSplits: Int = Int.max) -> [Substring]
  • separator: 나눌 기준이 되는 문자 (Character)
  • omittingEmptySubsequences: 빈 결과를 생략할지 여부 (기본값: true)
  • maxSplits: 최대 분할 횟수 (기본값: 제한 없음)
let sentence = "아 정말 배가 고프다"
let words = sentence.split(separator: " ")
print(words)  // ["아", "정말", "배가", "고프다"]
  • 여기서 유의할 점은 split이 배열을 반환하지만, 반환 타입이 [Substring]이라는 점입니다.
  • Substring은 메모리 효율성을 높이기 위해 원본 문자열의 일부를 공유합니다. 만약 Substring을 일반 문자열로 변환하고 싶다면, String()으로 감싸야 합니다.
let wordsAsString = words.map { String($0) }

 

클로저를 사용한 조건부 분할

let complexString = "apple123banana456cherry"
let splitByNumbers = complexString.split { $0.isNumber }
print(splitByNumbers)  // ["apple", "banana", "cherry"]
  • split 메서드는 단순한 구분자가 아닌 클로저를 통해 복잡한 규칙을 적용할 수 도 있습니다.
 

components(separatedBy:)

components는 Foundation 프레임워크에 포함된 메서드로, 문자열을 정확한 구분자 문자열을 기준으로 나눕니다.
components는 주로 문자열을 특정 구분자를 기준으로 분리할 때 간편하게 사용할 수 있습니다.
func components(separatedBy separator: String) -> [String]
  • separator: 나눌 기준이 되는 문자열 (String)
let sentence = "Swift,is,a,powerful,and,intuitive,language"
let words = sentence.components(separatedBy: ",")
print(words)  // ["Swift", "is", "a", "powerful", "and", "intuitive", "language"]
  • components(separatedBy:) 메서드는 문자열을 구분자로 나누고, 결과를 [String] 배열로 반환합니다.
  • 반환 타입이 이미 String이므로 split처럼 추가 변환 작업이 필요하지 않습니다.

 

split vs components 차이점

빈 문자열 처리

let text = "apple,,banana,,cherry"
let result = text.components(separatedBy: ",")
print(result)  // ["apple", "", "banana", "", "cherry"]
  • components는 구분자 사이에 빈 문자열이 있을 때도 이를 결과에 포함시킵니다.split은 기본적으로 빈 결과를 생략합니다. 물론, split에서도 빈 문자열을 포함하도록 설정할 수 있습니다
특성 Split components
반환타입 [SubString] [String]
구분자 타입 Char또는 조건부 클로저 String
빈 문자열 처리 기본적으로 생략 (omittingEmptySubsequences) 빈 문자열도 포함
구분자 조건 단일 문자 또는 클로저를 통한 복잡한 규칙 정확한 문자열로 구분
속도 및 메모리 효율성 원본 문자열 메모리 공유 (SubString) 별도의 문자열 생성
추가 변환 작업 필요 여부 String()으로 변환 필요 바로 String 배열로 사용 가능

 

 

언제 무엇을 사용할까?

  • split은 고급 분할이 필요한 경우, 특히 조건부 클로저를 통해 복잡한 규칙을 적용할 때 유리합니다. 예를 들어, 문자열의 특정 패턴(숫자, 공백, 특수 문자 등)을 기준으로 분리할 때 강력한 도구입니다.
  • components(separatedBy:)정확한 구분자 문자열을 기준으로 나눌 때 적합합니다. 파일 경로나 CSV 파일을 파싱할 때처럼 고정된 구분자가 있는 경우 간편하고 직관적으로 사용할 수 있습니다.

성능 비교

두 메서드는 각자의 용도에 따라 다르게 최적화되어 있습니다. splitSubstring을 반환하여 메모리 효율성을 높이는 반면, components(separatedBy:)바로 String 배열을 반환하여 추가적인 변환 작업 없이 사용할 수 있습니다.

 

 

  • split은 대용량 문자열 처리 시 더 나은 메모리 효율성을 제공할 수 있습니다.
  • components(separatedBy:)는 간단한 문자열 분리에 더 직관적이고 빠른 선택일 수 있습니다.

 

결론

Swift에서 문자열을 나누는 두 가지 대표적인 메서드인 split과 components(separatedBy:)는 각기 다른 목적과 기능을 제공합니다. split은 더 고급스럽고 유연한 조건부 분할이 가능하며, 메모리 효율성을 제공하는 반면, components(separatedBy:)는 고정된 구분자에 대한 직관적인 사용성을 갖추고 있습니다.
따라서 문자열을 나눌 때 어떤 구분 규칙을 사용할지, 빈 문자열 처리를 어떻게 할지 등을 고려하여 두 메서드를 선택하는 것이 중요합니다.

 

728x90
반응형