스위프트의 표준 입력 및 문자열 처리

스위프트의 표준 입력 및 문자열 처리

스위프트의 표준 입력 및 문자열 처리에 대해 정리했습니다.

📙 0. 스위프트의 표준 입력

Swift에서 표준 입력(Standard input)은 프로그램이나 스크립트로 데이터를 입력받는 기본적인 방법을 의미한다.

애플 공식 개발자 사이트에서는 Swift의 문자열을 아래와 같이 소개하고 있다.

문자열은 다국어 및 이모티콘 지원을 위해 유니코드 표준을 따르며, 다양한 사례에 사용할 수 있도록 성능을 최적화하기 위해 UTF-8 기반의 인코딩을 사용합니다.

Swift의 표준 입력 역시 UTF-8 인코딩으로 해석되며, 만약 입력한 입력한 데이터 중에서 UTF-8로 해석될 수 없는 바이트가 있으면, 해당 바이트는 유니코드의 “대체 문자(�, U+FFFD)”로 표현된다.

Swift에서는 readLine() 함수를 사용하여 표준 입력을 읽을 수 있다.

func readLine(strippingNewline: Bool = true) -> String?
  • 매개변수 strippingNewline는 줄 바꿈 문자를 결과에서 제거할지 여부를 결정하는 불리언 값이며, 기본값은 true이다.

  • 표준 입력에서 읽은 문자 문자열을 반환한다. 만약 readLine()이 호출되었을 때 입력 스트림이 EOF에 이미 도달했다면, 결과는 nil이다. -> String? (옵셔널 문자열)

📙 1. String.split(separator:)

split(separator:) 메서드는 주어진 구분자를 기준으로 문자열을 분리하여 부분 문자열의 배열을 반환한다.

func split(
    separator: String,
    maxSplits: Int = .max,
    omittingEmptySubsequences: Bool = true
) -> [Substring]

여기서 주목할 부분은 부분 문자열을 반환한다는 점이다.

substring

Substring 인스턴스는 원본 문자열의 일부를 참조하기 때문에 추가적인 메모리 할당 없이 효율적으로 작동한다.

또한, Substring 역시 StringProtocol 프로토콜을 준수하기 때문에 문자열 조작 작업 역시 보다 빠르게 처리될 수 있다.

📙 2. String.components(separatedBy:)

components(separatedBy:) 메서드는 주어진 구분자를 기준으로 문자열을 분리하여 문자열의 배열을 반환한다.

func components(separatedBy separator: CharacterSet) -> [String]

split(separator:)와 유사하지만, 문자열을 반환하고 있다는 차이가 있다.

📙 3. split(separator:) 메서드와 components(separatedBy:) 메서드의 차이

앞서 살펴보았듯이 Substring은 추가적인 메모리 할당 없이 효율적으로 작동하며, 문자열 조작 작업에 유리하다고 할 수 있다.

그렇다면 split(separator:) 메서드와 유사하지만, 문자열을 반환하는 components(separatedBy:) 메서드가 존재하는 이유는 무엇이고 언제 사용될까?

그 이유는 Substring이 근본적으로 원본 String의 일부 범위를 참조하는 구조체(참조 타입이 아닌 값 타입임에 주의해야 한다)라는 점에서 찾아볼 수 있다.

Substring은 성능 최적화를 위한 일시적인 값으로 설계된 값이며, 원본 문자열이 메모리에서 해제되면 Substring도 더 이상 유효하지 않게 된다.

components(separatedBy:) 메서드를 사용하는 경우

1. 결과를 장기간 유지해야 하는 경우 Substring은 일시적인 값으로 설계된 값이기 때문에, 장기간 사용하려면 별도의 String 인스턴스로 변환해야 하는 번거로움이 있다.

2. 다른 API와 함께 사용하는 경우 많은 Swift API는 String을 요구하기 때문에 Substring을 직접 사용할 수 없는 경우가 많다.

3. 다중 구분자를 사용해야 하는 경우 components(separatedBy:) 메서드는 문자열 뿐만 아니라 문자 세트(CharacterSet)도 구분자로 사용할 수 있기 때문에, 여러 구분자를 한 번에 지정하여 문자열을 분리할 수 있습니다.

4. 모든 구분자를 포함해야 하는 경우 split(separator:) 메서드는 연속된 구분자가 있는 경우 이를 무시하기 때문에 빈 결과를 반환하지 않는다. 만약 모든 구분자를 포함해야 하는 경우 components(separatedBy:) 메서드를 사용하는 것이 더 적합하다.