2025/07/23

21. Swift 표준 라이브러리 깊이 보기: 유용한 타입과 함수 활용

안녕하세요! 이번 블로그에서는 우리가 매일 사용하는 Swift 코드의 숨은 영웅인 Swift 표준 라이브러리(Swift Standard Library)를 정리해 보겠습니다. 📚

Swift 표준 라이브러리는 우리가 Int, String, Array, Dictionary와 같은 기본 데이터 타입과 print(), map(), filter()와 같은 함수들을 사용할 수 있게 해주는 Swift 언어의 핵심 부분입니다. 이 라이브러리는 Swift 언어와 함께 자동으로 제공되며, 기본적인 데이터 구조와 알고리즘, 그리고 여러 유틸리티 기능들을 포함하고 있습니다.

표준 라이브러리의 다양한 기능을 이해하고 활용하는 것은 더 효율적이고, 안전하며, 관용적인(idiomatic) Swift 코드를 작성하는 데 필수적입니다. 오늘은 자주 사용되는 중요한 타입과 함수들을 중심으로 그 활용법을 자세히 살펴보겠습니다.

1. 기본 데이터 타입 다시 보기

Swift 표준 라이브러리는 가장 기본적인 데이터 타입들을 정의하고 있습니다. 이들은 모두 값 타입(Value Type)으로, 복사될 때 값이 복제되는 특징을 가집니다.

1.1. 숫자 타입 (Int, Double, Float, Bool)

정수, 부동 소수점, 불리언 값 등을 표현합니다. 이들은 다양한 연산자와 메서드를 제공합니다.

let integer: Int = 100
let floatingPoint: Double = 3.14159
let isSwiftAwesome: Bool = true

// 유용한 확장 (익스텐션) 메서드
if integer.isMultiple(of: 10) { // Int의 isMultiple(of:) 메서드
    print("\(integer)은 10의 배수입니다.")
}

let sum = integer + Int(floatingPoint) // 타입 변환
print("합계: \(sum)") // 출력: 합계: 103

1.2. 문자열 (String)

유니코드를 지원하는 강력한 문자열 타입입니다. 다양한 문자열 조작 메서드와 프로퍼티를 제공합니다.

var greeting = "Hello, Swift!"

// 문자열 속성 및 메서드
print("문자열 길이: \(greeting.count)") // 문자열 길이: 13
print("첫 글자: \(greeting.first!)") // 첫 글자: H

greeting.append("🚀") // 문자열 추가
print("새로운 인사: \(greeting)") // 새로운 인사: Hello, Swift!🚀

let containsSwift = greeting.contains("Swift") // 포함 여부 확인
print("Swift를 포함하는가? \(containsSwift)") // Swift를 포함하는가? true

let reversedGreeting = String(greeting.reversed()) // 문자열 뒤집기
print("뒤집힌 문자열: \(reversedGreeting)") // 뒤집힌 문자열: 🚀!tfiwS ,olleH

1.3. 컬렉션 타입 (Array, Dictionary, Set)

데이터 그룹을 저장하고 관리하는 데 사용되는 핵심 컬렉션 타입입니다.

  • Array (배열): 순서가 있는 동종(homogeneous) 데이터 컬렉션
  • var numbers = [1, 2, 3, 4, 5]
    numbers.append(6) // 요소 추가
    numbers.remove(at: 0) // 요소 제거
    print("배열 첫 요소: \(numbers.first!)") // 배열 첫 요소: 2
    print("배열 포함 여부 (3): \(numbers.contains(3))") // 배열 포함 여부 (3): true
  • Dictionary (딕셔너리): 키-값 쌍으로 이루어진 비순서(unordered) 컬렉션
  • var ages = ["Alice": 30, "Bob": 25]
    ages["Charlie"] = 35 // 요소 추가/업데이트
    print("Bob의 나이: \(ages["Bob"] ?? 0)") // Bob의 나이: 25
    
    for (name, age) in ages {
        print("\(name)의 나이는 \(age)입니다.")
    }
  • Set (세트): 순서가 없고 중복을 허용하지 않는 컬렉션
  • var primeNumbers: Set<Int> = [2, 3, 5, 7, 11]
    primeNumbers.insert(13) // 요소 추가
    primeNumbers.insert(5) // 중복 추가 시 무시됨
    print("세트 요소 개수: \(primeNumbers.count)") // 세트 요소 개수: 6
    print("세트에 7이 포함되어 있는가? \(primeNumbers.contains(7))") // 세트에 7이 포함되어 있는가? true

2. 고차 함수 (Higher-Order Functions): 컬렉션 변환 및 필터링

Swift 표준 라이브러리의 컬렉션 타입(Array, Dictionary, Set)은 고차 함수라는 강력한 메서드들을 제공합니다. 이들은 함수를 인자로 받거나 함수를 반환하는 함수로, 데이터 컬렉션을 효율적으로 조작할 수 있게 해줍니다. 함수형 프로그래밍 패러다임의 핵심 요소입니다.

2.1. map: 컬렉션의 각 요소를 변환

컬렉션의 각 요소에 변환 클로저를 적용하여 새로운 컬렉션을 반환합니다.

let numbers = [1, 2, 3, 4, 5]

// 각 숫자에 2를 곱하여 새로운 배열 생성
let doubledNumbers = numbers.map { $0 * 2 }
print("두 배 된 숫자: \(doubledNumbers)") // 출력: 두 배 된 숫자: [2, 4, 6, 8, 10]

let strings = ["apple", "banana", "cherry"]
// 각 문자열의 길이를 계산하여 새로운 배열 생성
let lengths = strings.map { $0.count }
print("문자열 길이: \(lengths)") // 출력: 문자열 길이: [5, 6, 6]

2.2. filter: 컬렉션에서 조건에 맞는 요소만 추출

컬렉션의 각 요소에 조건 클로저를 적용하여 true를 반환하는 요소들로만 이루어진 새로운 컬렉션을 반환합니다.

let temperatures = [22, 18, 25, 15, 28, 20]

// 온도가 20도 이상인 것만 필터링
let warmTemperatures = temperatures.filter { $0 >= 20 }
print("따뜻한 온도: \(warmTemperatures)") // 출력: 따뜻한 온도: [22, 25, 28, 20]

let products = ["Laptop", "Mouse", "Keyboard", "Monitor", "Webcam"]
// 'M'으로 시작하는 제품만 필터링
let mProducts = products.filter { $0.hasPrefix("M") }
print("'M'으로 시작하는 제품: \(mProducts)") // 출력: 'M'으로 시작하는 제품: ["Mouse", "Monitor"]

2.3. reduce: 컬렉션의 모든 요소를 하나의 값으로 결합

컬렉션의 모든 요소를 초기 값과 결합 클로저를 사용하여 하나의 단일 값으로 줄입니다.

let scores = [80, 90, 75, 95]

// 모든 점수의 합계 계산
let totalScore = scores.reduce(0) { (currentSum, score) in
    currentSum + score
}
print("총 점수: \(totalScore)") // 출력: 총 점수: 340

// 문자열 배열을 하나의 큰 문자열로 결합 (공백으로 구분)
let words = ["Hello", "World", "Swift"]
let combinedString = words.reduce("") { (currentString, word) in
    currentString.isEmpty ? word : currentString + " " + word
}
print("결합된 문자열: \(combinedString)") // 출력: 결합된 문자열: Hello World Swift

2.4. compactMap: nil 값을 제거하며 변환

map과 유사하지만, 클로저가 nil을 반환하는 경우 해당 요소를 결과 컬렉션에서 제외합니다. 주로 옵셔널 값을 언래핑하고 유효한 값만 남길 때 사용합니다.

let stringNumbers = ["1", "2", "abc", "4", "5.5"]

// 문자열을 Int로 변환하되, 변환 불가능한(nil이 되는) 요소는 제거
let validNumbers = stringNumbers.compactMap { Int($0) }
print("유효한 숫자: \(validNumbers)") // 출력: 유효한 숫자: [1, 2, 4]

2.5. forEach: 각 요소에 대해 작업 수행 (반환 값 없음)

컬렉션의 각 요소에 대해 작업을 수행하지만, 값을 반환하지 않습니다. 부수 효과(side effect)를 위해 사용됩니다.

let names = ["Alice", "Bob", "Charlie"]

names.forEach { name in
    print("안녕하세요, \(name)!")
}
// 출력:
// 안녕하세요, Alice!
// 안녕하세요, Bob!
// 안녕하세요, Charlie!

3. 기타 유용한 전역 함수 및 타입

Swift 표준 라이브러리는 위에서 언급된 것 외에도 다양한 유용한 함수와 타입들을 제공합니다.

  • min(), max(): 컬렉션이나 인자들 중 최소/최대 값을 찾습니다.
  • print("최대값: \(max(10, 20, 5))") // 출력: 최대값: 20
    let numbers = [5, 1, 8, 2]
    if let maxInArray = numbers.max() { // 컬렉션에도 max() 메서드 있음
        print("배열의 최대값: \(maxInArray)") // 출력: 배열의 최대값: 8
    }
  • abs(): 절대값을 반환합니다.
  • print("절대값: \(abs(-15))") // 출력: 절대값: 15
  • zip(): 두 시퀀스의 요소들을 튜플로 묶어 새로운 시퀀스를 생성합니다.
  • let names = ["Apple", "Banana", "Cherry"]
    let prices = [1000, 2000, 3000]
    
    for (name, price) in zip(names, prices) {
        print("\(name)의 가격은 \(price)원입니다.")
    }
    // 출력:
    // Apple의 가격은 1000원입니다.
    // Banana의 가격은 2000원입니다.
    // Cherry의 가격은 3000원입니다.
  • Optional: 옵셔널 값을 다루는 데 사용되는 열거형입니다.
  • let optionalInt: Int? = 10
    if let value = optionalInt {
        print("값이 있습니다: \(value)")
    } else {
        print("값이 없습니다.")
    }
  • Result: 성공 또는 실패 중 하나의 값을 캡슐화하는 열거형입니다. 오류 처리에 유용합니다.
  • enum MyError: Error {
        case failedToProcess
    }
    
    func processData(input: String) -> Result<String, MyError> {
        if input.isEmpty {
            return .failure(.failedToProcess)
        }
        return .success("Processed: \(input)")
    }
    
    let result1 = processData(input: "Hello")
    switch result1 {
    case .success(let data):
        print("성공: \(data)")
    case .failure(let error):
        print("실패: \(error)")
    }
    // 출력: 성공: Processed: Hello

정리하며

오늘은 Swift 개발의 숨은 조력자인 Swift 표준 라이브러리의 핵심 기능들을 깊이 들여다보았습니다.
  • 기본 데이터 타입: Int, String, Array, Dictionary, Set 등 Swift의 근간을 이루는 타입들을 이해하고 활용하는 방법을 복습했습니다.
  • 고차 함수: map, filter, reduce, compactMap, forEach와 같은 강력한 함수들을 사용하여 컬렉션을 효율적으로 변환하고 조작하는 방법을 배웠습니다. 이들은 함수형 프로그래밍 스타일을 가능하게 합니다.
  • 기타 유용한 함수 및 타입: min(), max(), abs(), zip(), Optional, Result 등 다양한 유틸리티들을 살펴보았습니다.
Swift 표준 라이브러리는 우리가 더 적은 코드로 더 많은 일을 할 수 있게 해주는 보물 창고와 같습니다. 이들을 숙지하고 적극적으로 활용하면 여러분의 Swift 코드는 훨씬 더 간결하고, 강력하며, Swift의 특징을 잘 살린 관용적인 코드로 발전할 것입니다.

궁금한 점이 있다면 언제든지 댓글로 남겨주세요. 감사합니다.

0 comments:

댓글 쓰기