ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 4주차
    iOS 2025. 9. 23. 16:29

    주제: 반복문에서 빠져나오기 (break)

    1. break란?

    • 반복문(for, while)이 끝까지 실행되기 전에 조건을 만족하면 강제로 반복문을 종료하는 키워드.
    • 특히 무한 루프 방지조건부 종료에 자주 사용돼요.

    2. 잘못된 코드 (이미지 속 예제)

     
    for i in 1..<10 { if i > 5 break // ❌ 오류 발생 print(i) }

    ➡️ 오류 메시지:

     
    error: expected '{' after 'if' condition

    즉, Swift에서는 if문 뒤 실행할 코드가 한 줄이라도 반드시 중괄호 {} 로 감싸야 합니다.
    (C/Java는 한 줄이면 중괄호 생략 가능하지만, Swift는 불가능)


    3. 올바른 코드 수정

     
    for i in 1..<10 { if i > 5 { break } print(i) }

    4. 실행 결과

    위 코드는 i가 1부터 시작해서 10 미만까지 반복되지만,
    i > 5가 되는 순간 break로 반복문 종료:

     
    1 2 3 4 5

    즉, i = 6 이상일 때는 반복을 아예 중단합니다.


    5. 핵심 포인트

    1. Swift에서는 if 조건문 안에서 실행문이 하나라도 반드시 {} 필요
    2. break는 현재 반복문만 종료 (중첩 반복문일 경우, 바깥 반복문까지 종료하려면 label break 사용)
    3. print(i)는 break 조건에 걸리기 전까지만 실행됨

    1. 기본적인 if 조건문

     
    var x = 1 var y = 2 if x == 1 && y == 2 { // && 로 두 조건을 묶음 print(x, y) }
    • &&(AND 연산자)는 논리식을 연결할 때 사용.
    • x == 1과 y == 2가 모두 true일 때 실행.

    2. Condition-list (콤마 , 사용)

     
    if x == 1, y == 2 { // 두 조건을 콤마로 나열 print(x, y) }

    👉 Swift에서는 if문 안에서 여러 조건을 ,로 나열할 수 있습니다.
    이때 ,는 논리적 AND와 비슷한 역할을 합니다.

    ✅ 특징:

    • 단순한 true/false 비교뿐만 아니라
    • 옵셔널 바인딩 (if let) + 다른 조건을 함께 묶을 때 유용함.

    3. 옵셔널 바인딩과 함께 쓰는 예시

     
    if let s = Optional("Apple"), s.count > 3 { print(s) }
    • let s = Optional("Apple") : 옵셔널 바인딩 (값이 있으면 s에 할당)
    • s.count > 3 : 추가 조건
    • 둘 다 만족해야 블록 실행

    👉 여기서는 콤마(,) 를 써야 하고, &&를 쓰면 에러가 납니다.


    4. 잘못된 예시

     
    var a: Int? = 1 var b: Int? = 2 if let a1 = a && let b1 = b { // ❌ 오류 print(a1, b1) }

    ➡️ 오류:

     
    error: expected ',' joining parts of a multi-clause condition

    이유

    • let a1 = a 와 let b1 = b는 논리식이 아니라 옵셔널 바인딩 문.
    • &&는 Bool 논리식만 연결 가능.
    • 따라서 옵셔널 바인딩은 반드시 콤마(,) 로 연결해야 함.

    ✅ 올바른 코드:

     
    if let a1 = a, let b1 = b { print(a1, b1) }

    5. 핵심 정리

    • && : 단순 Bool 조건 연결 (true/false)
    • , : 조건 리스트 (condition-list) 연결 → 옵셔널 바인딩, 패턴 매칭, Bool 조건 등을 한 번에 묶을 때 사용
    • Swift는 안전성 때문에 옵셔널 바인딩은 반드시 , 사용해야 함

    👉 정리하면:

    • if x == 1 && y == 2 → 논리식끼리 연결할 때
    • if let a1 = a, let b1 = b, b1 > 0 → 바인딩 + 조건 연결할 때

    부가적인 조건을 써줄 때 사용

     

    📌 예제: for문 + where

     
    let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] // 짝수만 출력하기 for num in numbers where num % 2 == 0 { print("짝수:", num) }

    ✅ 실행 결과:

     

    짝수: 2 짝수: 4 짝수: 6 짝수: 8 짝수: 10

    📌 추가 예시들 (과제 확장 아이디어)

    1) switch + where

     
    let score = 85 switch score { case let x where x >= 90: print("A 학점") case let x where x >= 80: print("B 학점") default: print("C 이하 학점") }

    2) guard + where

     
    func greet(_ name: String?) { guard let n = name, !n.isEmpty else { print("이름이 없습니다") return } print("안녕하세요, \(n)님!") } greet("수인") // 출력: 안녕하세요, 수인님! greet(nil) // 출력: 이름이 없습니다
     

     

    1. 비유로 먼저 이해하기 🍜

    • 파라미터: 메뉴판에 적힌 "라면에 들어갈 재료 이름"
    • 아규먼트: 실제로 요리할 때 주방에 건네는 "실제 재료"

    예를 들어, 메뉴판에는

    라면(재료1, 재료2)

    이렇게 적혀 있고, 실제 주문할 때는

    라면(계란, 파)

    라고 주는 거예요.

    2. 코드 예시

     
    // 함수 정의 (파라미터) func greet(name: String) { print("안녕하세요, \(name)님!") } // 함수 호출 (아규먼트) greet(name: "수인")
    • name: String 👉 파라미터 (함수가 기대하는 값의 이름/형태)
    • "수인" 👉 아규먼트 (함수에 실제로 전달한 값)

    3. 차이를 한 줄로 정리

    • 파라미터(Parameter) = 함수 정의할 때 쓰는 "변수 이름"
    • 아규먼트(Argument) = 함수 호출할 때 넘기는 "실제 값"

    4. 더 쉬운 비유 ✉️

    • 편지 봉투에 "받는 사람: OOO" 👉 파라미터
    • 실제로 편지를 보낼 때 "받는 사람: 문수인" 👉 아규먼트

    👉 정리하면, 파라미터는 함수가 요구하는 틀(변수명), 아규먼트는 그 틀에 담겨서 들어가는 실제 값이에요.

     

    func sayHello() -> Void {

        print("Hello")

    }

    sayHello()

    1. C 언어 함수

     
    int add(int x, int y) { // C 함수 정의 return (x + y); } add(10, 20); // 호출
    • 리턴 타입: int
    • 파라미터: (int x, int y)
    • 호출 방식: add(10, 20)

    2. Swift 함수

     
    func add(x: Int, y: Int) -> Int { return (x + y) } add(x: 10, y: 20) // 호출
    • 리턴 타입: -> Int
    • 파라미터: (x: Int, y: Int)
    • 호출 방식: 파라미터 이름까지 써야 함 → add(x: 10, y: 20)

    3. 함수의 타입 (Function Type)

    Swift에서는 함수도 하나의 자료형으로 다뤄집니다.

    • add 함수는 정수 2개 → 정수 1개로 반환하므로:
     
    (Int, Int) -> Int

    4. 과제 풀이

     
    print(type(of: add))

    ✅ 실행 결과:

     
    (Int, Int) -> Int

    5. 추가 포인트

    • 만약 리턴값이 없다면 Void 또는 () 로 표기:
     
    func hello(name: String) { print("안녕, \(name)") } print(type(of: hello)) // (String) -> ()

    👉 정리하면:

    • C의 int add(int x, int y) → Swift에서는 func add(x: Int, y: Int) -> Int
    • add 함수의 자료형은 (Int, Int) -> Int

     

     

    tableView(_:numberOfRowsInSection:)

    좋은 질문이에요 👍 올려주신 함수는 iOS 개발에서 UITableViewDataSource 프로토콜의 필수 메서드 중 하나입니다.
    바로 이거예요:

     
    func tableView( _ tableView: UITableView, numberOfRowsInSection section: Int ) -> Int
     
    func tableView(
        _ tableView: UITableView,
        numberOfRowsInSection section: Int
    ) -> Int

    📌 함수 자료형(Function Type)

    Swift에서 함수의 타입

     
    (파라미터 타입들) -> 리턴 타입

    형태로 표현됩니다.

    여기서는:

    • 첫 번째 파라미터: UITableView
    • 두 번째 파라미터: Int
    • 리턴 타입: Int

    따라서 자료형은:

     
    (UITableView, Int) -> Int

    📌 의미

    • UITableView 객체와 section 번호(Int)를 받아서
    • 해당 섹션에 들어갈 행(row)의 개수(Int) 를 리턴하는 함수

    📌 실제 사용 예시

     
    class MyViewController: UIViewController, UITableViewDataSource { let items = ["A", "B", "C"] func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return items.count // 3을 반환 } }
     
    class MyViewController: UIViewController, UITableViewDataSource {
        let items = ["A", "B", "C"]

        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return items.count   // 3을 반환
        }
    }

    ✅ 정리

    • 함수 정의: func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    • 함수 자료형: (UITableView, Int) -> Int

    tableView(_:cellForRowAt:)

    func tableView(
        _ tableView: UITableView,
        cellForRowAt indexPath: IndexPath
    ) -> UITableViewCell
    이에요.

    📌 함수 자료형 (Function Type)
    파라미터: (UITableView, IndexPath)

    리턴: UITableViewCell

    따라서 자료형은:

    objectivec
    코드 복사
    (UITableView, IndexPath) -> UITableViewCell
    📌 역할
    numberOfRowsInSection이 몇 개의 행(row)을 만들지 알려주면

    cellForRowAt은 각 행에 어떤 셀을 보여줄지 만들어서 반환

    📌 예제 코드
    swift
    코드 복사
    class MyViewController: UIViewController, UITableViewDataSource {
        let items = ["A", "B", "C"]

        // 몇 개의 행을 만들까?
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return items.count   // 3
        }

        // 각 행에 어떤 셀을 보여줄까?
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
            cell.textLabel?.text = items[indexPath.row]
            return cell
        }
    }
    ✅ 정리

    numberOfRowsInSection → (UITableView, Int) -> Int

    cellForRowAt → (UITableView, IndexPath) -> UITableViewCell

     

    📌 1. if let

     
    if let lName = lastName { print(lName, firstName) } else { print("성이 없네요!") }
    • lastName이 nil이 아니면 → 바인딩 성공 → if 블록 안 실행
    • nil이면 → else 블록 실행
    • 바인딩된 변수(lName)는 if 블록 안에서만 사용 가능

    👉 즉, 성공 시 블록 내부 한정으로 안전하게 값을 사용할 수 있어요.


    📌 2. guard let

     
    guard let lName = lastName else { print("성이 없네요!") return // early exit } print(lName, firstName)
    • lastName이 nil이면 → else 블록 실행 + 함수 조기 종료 (return)
    • nil이 아니면 → guard 통과 → 이후 전체 함수 영역에서 lName 사용 가능

    👉 즉, 실패 시 빨리 빠져나가고, 성공 시 계속 코드를 이어갈 수 있습니다.
    (중첩이 줄어들어 코드가 깔끔해짐)


    📌 3. 실행 흐름 차이

    if let

    • 성공: if 블록 안에서만 값 사용 가능
    • 실패: else 블록에서 처리

    guard let

    • 실패: 즉시 리턴/탈출
    • 성공: 이후 코드 전역에서 값 사용 가능

    📌 4. 코드 구조 비교

    구분if letguard let
    사용 범위 바인딩된 값은 if 블록 내부 바인딩된 값은 이후 전체 함수에서 사용 가능
    실패 처리 else 블록 실행 else 블록에서 return/break 등으로 조기 탈출
    가독성 중첩(if 안 if) 발생하기 쉬움 중첩 피하고 "성공 흐름"을 평평하게 유지
    사용 예시 작은 조건 분기 입력 검증, 안전성 검사, 조기 종료 패턴

    📌 5. 예시 출력 비교

     
    printName(firstName: "길동", lastName: "홍") // if let → ("홍", "길동") // guard let → ("홍", "길동") printName(firstName: "길동", lastName: nil) // if let → "성이 없네요!" // guard let → "성이 없네요!"

    동작 결과는 같지만,
    if let은 블록 내부 제한,
    guard let은 함수 전반에서 사용 가능하다는 게 핵심 차이입니다.


    👉 정리:

    • if let: 값이 있을 때만 한정적으로 쓸 때
    • guard let: 값이 반드시 있어야 하고, 없으면 조기 탈출(early exit) 하고 싶을 때

     

    'iOS' 카테고리의 다른 글

    iOS 7주차  (0) 2025.10.14
    5주차  (0) 2025.09.30
    iOS 3주차  (0) 2025.09.16
    iOS 2주차  (0) 2025.09.09
    iOS 1  (2) 2025.09.02
Designed by Tistory.