-
Swift 공식문서 톺아보기 (1) - 둘러보기 1Swift 2025. 4. 18. 23:28
안녕하세요 :) 🧀
매년 초에 버킷 리스트를 작성할 때 빠지지 않고 등장했던 것 중 하나가 “개발 블로그 시작하기” 였는데, 드디어 시작을 하게 되었습니다.
앞으로 블로그를 통해 iOS 개발 관련 지식과 경험을 중심으로 하나씩 차근차근 기록해 나가려고 합니다. 이 블로그가 저와 같은 길을 걷고 있는 분들에게 작은 도움이 된다면 더할 나위 없이 좋을 것 같아요.첫 번째 글로는 Swift 공식 문서를 처음부터 끝까지 읽으면서, 이미 알고 있는 내용은 가볍게 복습하고, 제가 몰랐거나 헷갈리는 문법과 개념들을 꼼꼼히 정리하려 합니다.
아마 굉장히 긴 시리즈가 될 듯💪🏻
그럼, 이제 시작합니다~
Swift 둘러보기 (A Swift Tour)
🎯 여러 줄의 문자열 표현 시 들여 쓰기
let message = """ 개미와 배짱이는 여름 동안 열심히 일하며 겨울을 준비한 개미와, 음악만 즐기며 놀기만 한 배짱이의 이야기예요. 겨울이 오자 준비해 둔 개미는 따뜻하게 지내지만, 배짱이는 먹을 것도 없이 고생하게 돼요. """ print(message)
출력 결과 Swift에서 세 개의 큰따옴표(""")를 사용하여 여러 줄의 문자열을 정의할 때, 문자열의 들여 쓰기는
닫는 큰따옴표(""")의 들여 쓰기를 기준으로 자동으로 조정됩니다.
즉, 닫는 큰따옴표의 위치를 기준으로, 문자열 내 각 줄의 시작 부분에 있는 동일한 양의 공백이 제거된다는 의미입니다.
예를 들어, 세 번째 줄의
"겨울이 오자 준비해 둔 개미는 따뜻하게 지내지만,"이라는 문장이기준 들여 쓰기보다 추가로 더 들여 쓰기 되었다면, 실제 출력에서도 해당 줄은 그만큼 더 들여 쓰기 되어 나타납니다.
추가로 주의할 점은, 닫는 큰따옴표의 기준보다 덜 들여쓰기하면 컴파일에 실패한다는 것입니다.

컴파일 단계에서 에러 발생 🎯 Switch문의 패턴 매칭
let fruit = "청포도" switch fruit { case "사과": print("🍎") case "바나나": print("🍌") case let x where x.hasSuffix("포도"): print("맛있는 \(x)") default: print("알 수 없는 과일") } // Prints >> 맛있는 청포도case let x where x.hasSuffix("포도"):구문을 살펴보면,- let x를 사용하여 매칭된 케이스의 값을 상수 x에 바인딩합니다.
- 추가로 where 절을 사용하여 더 세부적인 조건을 검사합니다. 여기서는 바인딩된 문자열 x가 “포도”로 끝나는지 검사합니다.
평소에 switch 문을 사용할 때 바인딩을 통한 패턴 매칭은 자주 사용했지만,
이처럼 조건을 추가로 검사하는 방식은 살짝 낯설었습니다..
🎯 Dictionary도 컬렉션이다
let capitalsDict = [ "대한민국": "서울", "일본": "도쿄", "프랑스": "파리" ] for (country, capital) in capitalsDict { print("\(country)의 수도는 \(capital)입니다.") } /* 프랑스의 수도는 파리입니다. 대한민국의 수도는 서울입니다. 일본의 수도는 도쿄입니다. */딕셔너리 역시 배열(Array)과 마찬가지로 컬렉션의 한 종류이기 때문에,
이렇게 for-in 구문을 사용할 수 있다는 사실을 다시 한번 리마인드 했습니다.
단, 딕셔너리는 배열과 달리 순서가 보장되지 않는다는 점만 주의!
🎯 Swift의 do-while (repeat while) 문
보통의
while문은 반복문 실행 전에 조건을 검사합니다.하지만 반복문 구문을 한 번 실행하고 조건을 비교할 때 다른 언어에서는
do-while문을 사용하곤 했습니다.Swift에서는 아래와 같이
repeat while문을 사용합니다.(실무 하면서 한 번도 사용한 기억은 없지만, 알고리즘 문제나 코딩 테스트를 볼 때 필요할 것 같아서 메모)
var count = 0 repeat { print("count: \(count)") count += 1 } while count < 3 /* count: 0 count: 1 count: 2 */🎯 항상 헷갈리는 범위 연산자
..<는 가장 상위의 값을 생략한다!…는 가장 상위의 값도 포함한다!
var total = 0 // 0, 1, 2, 3 for i in 0..<4 { total += i } print(total) // Prints >> 6 total = 0 // 0, 1, 2, 3, 4 for i in 0...4 { total += i } print(total) // Prints >> 10🎯 중첩되는 함수
Swift에서 함수는 중첩되어 선언이 가능합니다.
내부 함수인
add()에서 외부 함수 변수인y를캡처해서 사용합니다. (클로저와 유사한 방식)
캡슐화와 지역화에 장점이 있지만, 과도한 중첩으로 인한 가독성 저하와
한정된 스코프로 인해 외부에서 접근이 어려워 디버깅에 어려울 수 있음!func returnFifteen() -> Int { var y = 10 func add() { y += 5 } add() return y } print(returnFifteen()) // Prints >> 15🎯 Swift의 함수는 1급 시민(First-class Citizen)이며 1급 함수(First-class Functions)다…? 👀
뭔 소리죠????🙋🏻
일단 Swift라는 언어는 객체지향 프로그래밍과 함수형 프로그래밍 두 가지 패러다임을 모두 지원하는 다중 패러다임 언어다.
- 객체지향 프로그래밍(OOP)
- Swift는
class,struct,protocol등 객체지향의 개념을 통해 코드의 캡슐화, 상속, 다형성 등을 지원
- Swift는
- 함수형 프로그래밍(FP)
- 동시에 Swift는 함수가 1급 시민으로 취급되며,
closure, 고차함수(map,filter,reduce등)를 통해 함수형 프로그래밍 스타일을 적극 지원
- 동시에 Swift는 함수가 1급 시민으로 취급되며,
여기까지 이해 완료
그렇다면, 1급 함수는 무슨 뜻일까?
그전에 우선 1급 시민(First-class Citizen)이라는 개념을 알아야겠어요🥺
함수형 프로그래밍에서 1급 시민 또는 1급 객체로 표현하는 것 같은데, 이 글에서는 1급 시민으로 표현하겠습니다.
1급 시민이 되기 위한 조건
First-class citizen - Wikipedia
From Wikipedia, the free encyclopedia Concept in programming language design In a given programming language design, a first-class citizen[a] is an entity which supports all the operations generally available to other entities. These operations typically i
en.wikipedia.org
요약하면
- 변수에 할당할 수 있어야 한다.
- 다른 함수의 인자로 전달할 수 있어야 한다.
- 함수의 반환값으로 사용할 수 있어야 한다.
얼핏 봐도
Int,String이런 타입들은 충분히 조건을 만족하는 것 같아 보이죠?그렇다면 함수도??
네 맞습니다.
1급 함수는 Swift의 함수가 위의 1급 시민의 조건을 만족한다는 의미!
Swift의 함수는 변수에 할당하여 다른 함수에 인자로 전달하고 리턴도 받을 수 있다는 뜻
클로저를 사용해서 콜백처리를 하는 게 이러한 패러다임을 적용한 사례라고 볼 수 있죠!?
func makeIncrementer() -> (Int) -> Int { func addOne(number: Int) -> Int { return 1 + number } // 3. 함수의 반환값으로 사용할 수 있어야한다. ✅ return addOne } // 1. 변수에 할당할 수 있어야한다. ✅ var increment: (Int) -> Int = makeIncrementer() print(increment(100)) // Prints >> 101즉,
increment(100)은 사실상addOne(100)이 실행되어 101을 반환하게 된답니다.func greet(to name: String) { print("안녕하세요, \(name)님") } func goToWork(greet: (String) -> Void) { greet("치즈") } // 2. 다른 함수의 인자로 전달할 수 있어야한다. ✅ goToWork(greet: greet) // Prints >> 안녕하세요, 치즈님위 코드에서
goToWork(greet: greet)를goToWork(greet: greet(to: "치즈"))로 변경해서 실행하면 에러가 발생한다. 왜 그럴까요??정답 🙋🏻♂️
greet(to: "치즈")는 함수를 호출하여 이미 실행된 결과(Void)가 반환됨.그러나
goToWork함수는 매개변수로(String) -> Void타입, 즉 함수 자체를 기대하고 있음이렇게 Swift의 함수는 다른 기본 데이터 타입들과 마찬가지로 자유롭게 다룰 수 있고,
이로 인해 보다 유연하고 모듈화 된 코드를 작성할 수 있다는 말이었습니다.
객체지향의 장점을 살리면서 함수형의 간결함을 곁들인 느낌이랄까나?
마치며
아직 둘러봤을 뿐인데, 새로운 내용들을 많이 배운 것 같아요!..
그동안 실무를 하면서 너무 기능위주로 속도를 냈던 과거의 저를 조금은 반성하게 되었습니다.
긴 여정이 되겠지만 공식문서를 완독 하는 날까지🔥
참조
Documentation
docs.swift.org
'Swift' 카테고리의 다른 글
Swift 공식문서 톺아보기 (4) - Collection Types (1) 2025.11.03 Swift 공식문서 톺아보기 (3) - Strings and Characters (2) 2025.09.16 SPM 라이브러리 생성부터 GitHub 배포까지 (2) 2025.07.30 Swift 공식문서 톺아보기 (2) - 둘러보기 2 (0) 2025.06.18