ios 6일차

bin·2026년 1월 6일

회고

함께 공부하는 팀에 관한 변동사항이 생겼다. 또한, 2주차에 들어오며 ios 프로그래밍에 관한 기초적인 문법, 알고리즘에 대해 공부를 시작한다.

강의에 관한 기록

Chapter.1 수강

기본적인 내용들과 알고있던, 쉬운 내용은 제외하고 공부했던 부분들 중 필수적인 이해가 요구되는 부분들만 발췌하여 기록한다.

Chapter 1-10: 고급 데이터 타입

고급 데이터 타입이지만 사실 고급이 아니다. 그저 매일 사용하는 일상 데이터 타입.

  • 기본적인 선언, 사용은 타 언어와 유사하고 선언부를 제외한 나머지에 차이점이 없어 활용에 중점을 두고 공부해야 함.

Chapter 1-11: 클로저

  • 쉽게 설명하여 익명함수이다.
  • 함수의 4요소(이름, 파라미터, 반환타입, 구현부)에서 이름을 제외하고 구성되어있다.
  • 데이터타입으로 클로저를 사용할 수 있다.
    즉, 변수에 할당 가능, 함수의 파라미터로 전달 가능

    let closure: (파라미터, 파라미터) -> 반환타입

Trailing Closure

  • 함수를 호출할 때 마지막 파라미터가 클로저일 경우 괄호를닫은 뒤 작성할 수 있다.
  • 가독성 증가
func trailingTest(key: String, closure: () -> Void) {
    print(key)
    closure()
}

trailingTest(key: "Key name", closure: { // 원래는 이렇게 만들어야 하지만 아래처럼 가능
    print("Hello")
})

trailingTest(key: "Hello") { 
    print("World")
}

본인의 생각으로는 Closure과 Optional에 대한 이해가 Swift 문법에 관한 이해의 척도를 나타낼 수 있을 것 같다. 문법 공부를 위해 항상 공식 문서를 참고하고자 한다. 기타 블로그도 참고하지만, 공식 문서에 더 비중을 둡니다.

ref. https://bbiguduk.gitbook.io/swift/language-guide-1/closures

과제에 관한 기록

생각

팀을 변경하게되고 받게된 첫 과제이다. 팀프로젝트가 아닌 개인 과제이며, 문제는 필수 5개와 도전 4개로 총 9개이다. 문제를 풀어가는 능력도 중요하지만, 정확한 개념에 대한 숙지를 통해 제대로 문제에 접근하는 것이 가장 중요하다 생각한다. 때문에, 과제는 급하게 접근하지않고 강의를 수강한 후 개념의 정리가 되었을 때, 천천히 풀어보고자 한다. 오늘 풀어본 문제는 필수 문제1, 문제2이다.

문제1

문제 1.

  • 두 개의 Int 값을 파라미터로 받고, 하나의 String 값을 반환하는 클로저를 설계해주세요.
    • 클로저 내부에서는 두 정수를 더한 후, "두 수의 합은 {합계} 입니다"라는 문자열을 반환합니다.
  • 이 클로저를 상수 sum에 저장하고, 정확한 타입을 명시해주세요.
    var num: Int = 3
  • sum을 호출하는 코드를 작성해주세요. (파라미터로 전달하는 값은 임의로 선택)
  • 위에서 정의한 sum과 동일한 타입의 클로저를 파라미터로 받고, 반환 값이 없는(void) 함수 calculate를 작성해주세요.
    1. (조건) calculate 함수 구현 내에서는 파라미터로 전달받은 클로저를 호출하는 코드를 포함해야합니다.

본인의 해설

/* 1. 두 개의 Int 값을 파라미터로 받고, 하나의 String 값을 반환하는 클로저*/
let closure: (Int, Int) -> String = {
    val1, val2 in
    return "두 수의 합은 \(val1 + val2)입니다."
}
//let closure: (Int, Int) -> String  = {
//    return "두 수의 합은 \($0 + $1)입니다."
//}
//print(closure(10,20))

/* 2. 클로저를 상수 sum에 저장하고, 정확한 타입을 명시*/
let sum: (Int, Int) -> String = {
    val1, val2 in
    "두 수의 합은 \(val1 + val2)입니다."
}
//let sum: (Int, Int) -> String = {"두 수의 합은 \($0 + $1)입니다."}

/* 3. sum을 호출하는 코드*/
print(sum(10,20))

/* 4. sum과 동일한 타입의 클로저를 파라미터로 받고, 반환 값이 없는(void) 함수 calculate */
func calculate(calClosure: (Int, Int) -> String){
    let result = calClosure(10,20)
    print(result)
}

calculate(calClosure : sum)

아래의 두 코드(주석처리된 부분, 주석처리 되지 않은 부분)는 동일한 코드이지만, 연습을 위해 매개변수에 명시적으로 이름을 지정해주는 방법1, 단축어를 사용하는 방법2로 구현했다.

let closure: (Int, Int) -> String = {
val1, val2 in
return "두 수의 합은 (val1 + val2)입니다."
}
//let closure: (Int, Int) -> String = {
// return "두 수의 합은 ($0 + $1)입니다."
//}

위 문제는 요구사항을 읽고 그대로 따라가다보면 완성할 수 있는 문제로 난이도 자체는 높지않았기에 특별히 분석할 부분이 없다고 생각한다.

문제2

문제 2.

  • 아래 for-in 문을 map 을 사용하는 코드로 변환해주세요.
    let numbers = [1, 2, 3, 4, 5]
    var result = [String]()
    for number in numbers {
      result.append(number)
    }
  • 주어진 입력값을 고차함수를 체이닝하여 주어진 출력값이 나오도록 구현해주세요.
  • 입력: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - 타입: Array
  • 출력: [”2”, “4”, “6”, “8”, “10”] - 타입: Array
  • 힌트
    map 과 filter 를 이용해볼 수 있을 것 같습니다.
  • 이제 고차함수를 직접 만들어 봅니다.
  • 함수명: myMap
  • 파라미터는 2개 입니다.
    1. 배열: [Int]
    2. 변환 클로저: (Int) → String
  • 반환 값은 1개 입니다.
    1. [String]
  • myMap 함수 구현 내부에서 map, filter, reduce 등 고차함수를 직접 사용하지 않아야합니다.
  • 완성된 myMap 호출 예시
    let result = myMap([1, 2, 3, 4, 5]) {
        String($0)
    }
    print(result) // ["1", "2", "3", "4", "5"]
    ```*/

본인의 해설

/* 1. for-in -> map 변경*/
let numbers = [1, 2, 3, 4, 5]
var result = [String]()
result = numbers.map{String($0)}
print(result)

/* 2. 고차함수 체이닝 */
let num:[Int] = [1,2,3,4,5,6,7,8,9,10]
var res:[String] = num.filter{$0 % 2 == 0}.map{String($0)}
print(res)

/* 3. 고차함수 생성 (map, filter, reduce 사용X */
func myMap(arr:[Int], toString: (Int) -> String) -> [String]{
  var myres: [String] = []
  for idx in arr{
      myres.append(toString(idx))
  }
  return myres
}
let arr2 = myMap(arr: [1,2,3,4,5]){
  String($0)
}
print(arr2)

크게 어려운 부분은 없었다.

생각정리

모든 문제는 여러 해설이 나타날 수 있으며, 이 점이 프로그래밍을 하는 즐거움이라 생각한다.(절대적인 정답은 없다) 본인은 생각하지 못한 다른 방식의 접근을 공유하고 코드의 품질을 높이기 위해 아주 조금의 도전적인 생각들이 모여 나타나는 결과물에 즐거움을 느끼며 공부한다.

0개의 댓글