본문 바로가기
책 정리/Swift 프로그래밍

스위프트 프로그래밍 [Chap 1~7]

by apple망고 2024. 4. 12.

Chap 1. 스위프트

1급 객체의 조건

  • 전달인자로 전달할 수 있다.
  • 동적 프로퍼티 할당이 가능
  • 변수나 데이터 구조 안에 담을 수 있다.
  • 변환 값으로 사용할 수 있다.
  • 할당 시 사용된 이름과 관계없이 고유한 객체로 구별 가능

함수가 일급 객체가 된다 -> 다양한 종류의 함수를 호출하고, 전달하고, 반환하는 등의 동작만으로도 프로그램을 구현 할 수 있다!

 

함수형 프로그래밍 패러다임으로 프로그램 작성 시 장점

  • 여러 가지 연산 처리 작업이 동시에 이러나는 프로그램을 만들기 쉽다.
  • 멀티 코어 혹은 여러 개 연산 프로세서를 사용하는 시스템에서 효율적인 프로그램을 만들기 쉽다.
  • 상태변환에 따른 부작용에서 자유로워지므로 순수하게 기능 구현에 초점을 맞추어 설계 가능

Chap 2. 스위프트 처음 시작하기


Chap 3. 데이터 기본


Chap 4. 데이터 타입 고급

Set: 순서가 중요하지 않거나 각 요소가 유일한 값이어야 하는 경우 사용

  • 해시 가능한 세트
  • 집합 관계를 표현할 때 유용하다

Enum: 

  1. 제한된 선택지를 주고 싶을 때
  2. 정해진 값 외에는 입력받고 싶지 않을 때
  3. 예상된 입력 값이 한정되어 있을 때
  4.  
  5.  

항목 순회: 열거형에 포함된 모든 케이스를 알아햐 할 때(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 함수와 일급 객체가 아닌 기존 언어의 함수와의 차이

  1. 변수 할당: 함수가 변수나 상수에 할당될 수 있다 -> 함수를 다른 변수에 저장하고, 변수를 통해 함수를 호출 할 수 있다.
  2. 함수의 인자로 전달: 다른 함수의 인자로 함수 전달 가능 -> 함수를 다른 함수에 전달하여, 그 함수 내부에서 이를 호출하거나 조작할 수 있다.(고차 함수)
  3. 한수의 반환값: 다른 함수의 반환값으로 사용될 수 있다 -> 함수가 다른 함수를 생성하고 반환할 수 있다.

일급 객체인 함수의 장점

  • 유연성: 함수를 변수에 할당하거나 다른 함수의 인자로 전달 할 수 있기 때문에, 프로그램의 유연성이 크게 향상된다.
  • 재사용성: 공통 기능을 가진 함수를 다양한 곳에서 재사용할 수 있다.
  • 추상화 수준의 향상: 함수의 추상화를 통해 더 높은 수준의 프로그래밍이 가능해진다.(고차함수를 통해 공통 패턴 추상화)

함수가 일급 객체인 경우 유용하게 사용할 수 있는 상황:

  1. 콜백 함수: 비동기 작업을 다룰 때, 작업 완료 후 실행될 콜백 함수를 인자로 전달할 수 있다.
  2. 고차 함수: 배열의 map, filter, reduce 같은 고차 함수를 통해 코드를 간결하게 만들 수 있다.(다른 함수를 인자로 받아 작업을 수행)
  3. 클로저: 주변 컨텍스트의 변수를 캡처하고 저장할 수 있다. 유연한 코드 작성이 가능하다
  4. 함수형 프로그래밍: 불변성, 순수 함수 등의 개념을 활용하여 더 안전하고 예측 가능한 코드를 작성할 수 있다.

 

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