[Swift] 함수와 자료구조

@inup· 5 min read

앱을 개발한다는 것은 결국 데이터를 담을 그릇(자료구조)을 정의하고, 그 데이터를 조작하는 로직(함수)을 만드는 과정의 연속이다. Swift는 이 기본적인 도구들을 다루는 방식에서도 '가독성'과 '안전성'을 크게 강조한다.

함수 (Function): 읽기 좋은 코드를 위하여

Swift 함수의 가장 독특하고 강력한 특징은 전달 인자 레이블(Argument Label)이다. 이는 함수를 정의할 때 사용하는 매개변수 이름(Parameter Name)과, 함수를 호출할 때 사용하는 이름(Argument Label)을 분리할 수 있는 기능이다.

보통의 언어에서는 함수 내부에서 사용하는 변수명과 호출할 때 사용하는 변수명이 동일하다. 하지만 Swift는 이를 분리함으로써 함수 정의는 구현자 입장에서, 함수 호출은 사용자 입장에서 자연스럽게 읽히도록 돕는다.

// from: 외부에서 호출할 때 사용하는 레이블 (Argument Label)
// hometown: 함수 내부에서 사용하는 변수명 (Parameter Name)
func greet(person: String, from hometown: String) -> String {
    return "Hello \(person)! Glad you could visit from \(hometown)."
}

// 호출 시: 마치 영어 문장을 읽는 것처럼 자연스럽다.
greet(person: "Bill", from: "Cupertino")

만약 호출 시 레이블을 생략하고 싶다면 언더바(_)를 사용하면 된다. 이는 C 계열 언어 스타일의 함수 호출이 필요할 때 유용하다.

컬렉션 타입 (Collection Types)

Swift는 데이터를 저장하고 관리하기 위한 세 가지 주요 컬렉션 타입인 배열(Array), 셋(Set), 딕셔너리(Dictionary)를 제공한다.

이 컬렉션들의 가장 큰 특징은 가변성(Mutability)이 변수 선언 키워드(var, let)에 의해 결정된다는 점이다. var로 선언하면 요소를 추가하거나 삭제할 수 있지만, let으로 선언하면 크기와 내용이 고정된 불변 컬렉션이 된다. 다른 언어에서 불변 리스트를 만들기 위해 별도의 타입을 사용해야 하는 것과 대조적이다.

1. 배열 (Array)

순서가 있는 리스트 컬렉션이다. 동일한 타입의 값들만 저장할 수 있다.

var shoppingList: [String] = ["Eggs", "Milk"]
shoppingList.append("Flour")
shoppingList[0] = "Six Eggs"

// 빈 배열 생성
var emptyDoubles: [Double] = []

2. 딕셔너리 (Dictionary)

키(Key)와 값(Value)의 쌍으로 이루어진 컬렉션이다. 순서가 없으며, 키는 유일해야(Unique) 한다.

주의할 점은 딕셔너리에서 특정 키로 값을 조회할 때, 반환 값이 옵셔널(Optional)이라는 점이다. 해당 키에 매핑된 값이 없을 수도 있기 때문이다.

var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

// 값을 할당
airports["LHR"] = "London Heathrow"

// 값을 조회 (결과는 String? 타입)
if let airportName = airports["DUB"] {
    print("The name of the airport is \(airportName).")
} else {
    print("That airport is not in the airports dictionary.")
}

3. 집합 (Set)

순서가 없고 중복된 값을 허용하지 않는 컬렉션이다. 배열과 비슷해 보이지만, 순서가 중요하지 않거나 데이터의 유일성을 보장해야 할 때 사용한다. 내부적으로 해시(Hash) 값을 사용하여 데이터를 저장하므로 검색 속도가 매우 빠르다.

var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]

// 중복된 값을 넣어도 하나만 유지된다.
favoriteGenres.insert("Rock") 

또한 집합은 합집합(union), 교집합(intersection), 차집합(subtracting) 등의 수학적 집합 연산을 메서드로 제공하여 데이터 처리를 효율적으로 돕는다.

Swift의 컬렉션은 타입 안정성을 보장하므로, 실수로 다른 타입의 데이터를 넣으려 하면 컴파일 에러가 발생한다. 이는 런타임에 발생할 수 있는 타입 관련 버그를 사전에 차단해 주는 역할을 한다.

@inup
언제나 감사합니다 👨‍💻