Chap 1. 스위프트
1급 객체의 조건
- 전달인자로 전달할 수 있다.
- 동적 프로퍼티 할당이 가능
- 변수나 데이터 구조 안에 담을 수 있다.
- 변환 값으로 사용할 수 있다.
- 할당 시 사용된 이름과 관계없이 고유한 객체로 구별 가능
함수가 일급 객체가 된다 -> 다양한 종류의 함수를 호출하고, 전달하고, 반환하는 등의 동작만으로도 프로그램을 구현 할 수 있다!
함수형 프로그래밍 패러다임으로 프로그램 작성 시 장점
- 여러 가지 연산 처리 작업이 동시에 이러나는 프로그램을 만들기 쉽다.
- 멀티 코어 혹은 여러 개 연산 프로세서를 사용하는 시스템에서 효율적인 프로그램을 만들기 쉽다.
- 상태변환에 따른 부작용에서 자유로워지므로 순수하게 기능 구현에 초점을 맞추어 설계 가능
Chap 2. 스위프트 처음 시작하기
Chap 3. 데이터 기본
Chap 4. 데이터 타입 고급
Set: 순서가 중요하지 않거나 각 요소가 유일한 값이어야 하는 경우 사용
- 해시 가능한 세트
- 집합 관계를 표현할 때 유용하다
Enum:
- 제한된 선택지를 주고 싶을 때
- 정해진 값 외에는 입력받고 싶지 않을 때
- 예상된 입력 값이 한정되어 있을 때
항목 순회: 열거형에 포함된 모든 케이스를 알아햐 할 때(CaseIterable 프로토콜 채택)
enum school: CaseIterable {
case primary
case middle
}
let allCase: [School] = School.allCases
순환 열거형: 열겨형 항목의 연관 값이 열거형 자신의 값이고자 할때 사용(indirect 키워드 사용), 이진 트리 등의 순환 알고리즘에 사용
비교 가능한 열거형: 각 케이스를 비교하고 싶을 때(Comparable 프로토콜 채택)
Chap 5. 연산자
Chap 6. 흐름 제어
unkown
enum Menu {
case chicken
case pizza
case hamburger
}
let lunchMenu: Menu = .chicken
switch lunchMenu {
case .chicken:
print("반반 무많이")
case .pizza:
print("핫 소스 많이")
@unkown case _:
print("오늘 메뉴가 뭐죠?")
}
차후에 Menu 열거형에 추가한 case를 처리하지 않으면 경고를 표시하는 unkown
구문 이름표[이중 for문 탈출 방법]
var numbers: [Int] = [3, 2352, 5, 2131]
func loop() {
numberLoop: for num in numbers {
print("아웃 \(num)")
if num % 2 == 0 {
inLoop: for i in 0..<4 {
if i % 2 == 1 {
break numberLoop
}
print("나는 inLoop \(i)")
}
}
}
}
Chap 7. 함수
7.2.4 전달인자 레이블과 함수 타입
전달인자 레이블은 함수 타입의 구성요소가 아니므로 함수 타입을 작성할 때는 전달인자 레이블을 써줄 수 없다.
let someFunction: (lhs: Int, rhs: Int) -> Int // X
let someFunction: (_ lhs: Int, _ rhs: Int) -> Int // O
let someFunction: (Int, Int) -> Int // O
일급 객체가 아닌 기존 언어의 함수와 swift함수와의 차이가 무엇인지, 어떤 점이 좋은지 생각해보자
함수가 일급 객체인 경우 어떤 상황에서 유용하게 사용할 수 있을지 생각해보자
Swift 함수와 일급 객체가 아닌 기존 언어의 함수와의 차이
- 변수 할당: 함수가 변수나 상수에 할당될 수 있다 -> 함수를 다른 변수에 저장하고, 변수를 통해 함수를 호출 할 수 있다.
- 함수의 인자로 전달: 다른 함수의 인자로 함수 전달 가능 -> 함수를 다른 함수에 전달하여, 그 함수 내부에서 이를 호출하거나 조작할 수 있다.(고차 함수)
- 한수의 반환값: 다른 함수의 반환값으로 사용될 수 있다 -> 함수가 다른 함수를 생성하고 반환할 수 있다.
일급 객체인 함수의 장점
- 유연성: 함수를 변수에 할당하거나 다른 함수의 인자로 전달 할 수 있기 때문에, 프로그램의 유연성이 크게 향상된다.
- 재사용성: 공통 기능을 가진 함수를 다양한 곳에서 재사용할 수 있다.
- 추상화 수준의 향상: 함수의 추상화를 통해 더 높은 수준의 프로그래밍이 가능해진다.(고차함수를 통해 공통 패턴 추상화)
함수가 일급 객체인 경우 유용하게 사용할 수 있는 상황:
- 콜백 함수: 비동기 작업을 다룰 때, 작업 완료 후 실행될 콜백 함수를 인자로 전달할 수 있다.
- 고차 함수: 배열의 map, filter, reduce 같은 고차 함수를 통해 코드를 간결하게 만들 수 있다.(다른 함수를 인자로 받아 작업을 수행)
- 클로저: 주변 컨텍스트의 변수를 캡처하고 저장할 수 있다. 유연한 코드 작성이 가능하다
- 함수형 프로그래밍: 불변성, 순수 함수 등의 개념을 활용하여 더 안전하고 예측 가능한 코드를 작성할 수 있다.
7.4 종료되지 않는 함수(정상적으로 끝나지 않는 함수)
func crashAndBurn() -> Never {
fatalError("Something very, very bad happened")
}
반환 타입을 Never로 명시한다.
7.5 반환 값을 무시할 수 있는 함수
@discardableResult func say(_ something: String) -> String {
print(something)
return something
}
say("hello") // 반환값을 사용하지 않는다는 것을 알려 컴파일러가 경고하지 않음
@discardableResult 속성을 선언한다.
'책 정리 > Swift 프로그래밍' 카테고리의 다른 글
Chap 9. 구조체와 클래스 (0) | 2024.05.04 |
---|---|
Chap 8. 옵셔널 (0) | 2024.04.12 |