Swift 문법종합반 심화(2)

이유진·2024년 3월 13일
0

Swift 문법종합반

목록 보기
5/5

05. 고차함수

  1. map
  • 컬렉션 내부 기존 데이터 변형해 새로운 컬렉션 사용
  • 클로저(익명함수)로 매핑한 결과를 새로운 컬렉션으로 반환
  • 파라미터의 수가 3개 이상이 되면 클로저 사용하는 것보다 직접 파라미터와 in 키워드를 사용하는 게 좋다
// for 문으로 구현
let num = ["1", "2", "3", "4", "5"]
var numberArray: [Int] = []
for index in num {
    if let changeToInt = Int(index) {
        numberArray.append(changeToInt)
    }
}

print(numberArray)
// [1, 2, 3, 4, 5]

// map으로 구현
let stringArray = ["1", "2", "3", "4", "5"]
numberArray = stringArray.map { 
		if let changeToInt = Int($0) {
				return changeToInt
		}
		return 0
}

print(numberArray)
// [1, 2, 3, 4, 5]
  1. filter
    • 컨테이너 요소 중 조건에 만족하는 값에 대해 새로운 컨테이너 만들어 변환
      // for 문으로 구현
      // numbers에서 짝수만 추출하기
      
      let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
      var evenNumbers: [Int] = []
      
      for number in numbers {
          if number % 2 == 0 {
              evenNumbers.append(number)
          }
      }
      
      print(evenNumbers)
      // [2, 4, 6, 8]
      
      // filter로 구현
      // numbers에서 짝수만 추출하기
      
      let numbers1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
      let evenNumbers2 = numbers1.filter { $0 % 2 == 0 }
      
      print(evenNumbers2)
      // [2, 4, 6, 8]
  2. reduce
    • 기존의 컨테이너 요소에 대해 정의한 클로저로 매핑한 결과를 새로운 컨테이너로 반영
    • 초기값이 있고, 반복문을 사용해서 전체를 순회하는 케이스일 경우 반복문 사용해 만들어보고 reduce로 넘어가는 연습 해보면 좋다!
      // for 문으로 구현
      // 각 요소의 합 구하기
      
      let numbers2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      var sum = 0
      
      for number in numbers2 {
          sum += number
      }
      
      print(sum)
      // 55
      
      // reduce로 구현
      // 표현식1
      // 각 요소의 합 구하기
      
      let numbers3 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      let sum1 = numbers3.reduce(0, +)
      
      print(sum1)
      // 55
      
      //표현식2
      // 각 요소의 합 구하기
      
      let numbers4 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      let sum2 = numbers4.reduce(0) { $0 + $1 }
      
      print(sum2)
      // 55

06. 예외처리

예외 상황에 대한 처리 통해 자체적으로 오류 해결 혹은 어떤 에러 발생했는지 알려주는 등 조치와 대응

  1. Error

    발생할 수 있는 오류 값 나타내는 유형

  2. throwsdo-catch

    • throws
      • 리턴 값 반환 전 오류가 발생하면 에러 객체를 반환
      • 오류 발생 가능성 있는 메서드 제목 옆에 작성
    • throw
      • 오류가 발생할 구간에 작성
    • do-catch
      • throw로 던진 에러 do-catch문에서 처리
      • do : 에러가 발생할 가능성 있는 구문 작성, 성공하면 do 구문 실행, 실패하면 catch 실행
      • catch: 에러 잡아준다
      • throws 했던 함수 호출 시 try 키워드 사용
    • throws를 사용하면 throw를 만났을 때 함수 종료 된다.
  3. try, try?, try!

    • try
      • 에러가 발생할 수 있는 코드 블록 표시
      • 에러 던질 수 있는 함수나 메서드 호출 시 사용
      • do-catch 문 사용
    • try?
      • do-catch문 없이 사용 가능
      • 에러 발생 시 nil값 반환
      • 에러 발생하지 않으면 옵셔널 값 반환
    • try!
      • 에러 발생하면 앱 강제 종료
      • 에러 발생하지 않으면 언래핑된 옵셔널 값 반환
      • 오류가 발생하지 않을 때 사용

07. ARC와 메모리 누수

  1. ARC
    • Automatic Reference Counting
    • 메모리 관리 기법, 객체나 인스턴스가 참조되는 횟수 추적해 해제할 시점 결정
    • 참조 횟수 0이 되면 해당 객체 메모리에서 삭해제
    • 작동 방식
      • 객체 생성: 객체 생성 시 참조 횟수 1 증가
      • 객체 참조: 객체를 다른 변수나 상수에 할당 시 참조 횟수 1 증가
      • 참조 해제: 객체 참조(변수/상수) 사라지면(혹은 nil 할당되면) 참조 횟수 1 감소
      • Zeroing Weak Reference: 객체 참조 횟수 증가시키지 않고 추적. 객체 해체 시 자동으로 nil로 설정
      • init은 인스턴스 생성, deinit 인스턴스가 메모리에서 해제되기 직전에 불리는 로직
  2. 강한 참조 순환(Strong Reference Cycle)
    • 메모리 누수(Memory Leak): 사용하지 않는 객체가 메모리에 계속 남아 있는 상태
    • 대표적 예: 두 개 이상의 인스턴스가 서로를 참조할 때 발생
    • 메모리가 해제 되지 않고 유지되어 메모리 누수가 발생하는 현상

08. 프로토콜

  1. 프로토콜

    • 약속만! 기능 구현X
    • class, structure, enum에서 채택
    • 이름, 타입, gettable, settable 명시
    • 항상 var로 선언
    • 메서드 이름, 리턴값 지정
    • 다중 상속 가능
    • 타입으로서도 사용 가능 → 다른 class, structure, enum 이여도 같은 프로토콜을 채택하면, 같은 타입으로 묶일 수 있기 때문에 배열로 묶는 것이 가능하다!
    //프로토콜 사용
    protocol 프로토콜이름 {
    //프로토콜 정의(필요한 기능, 프로퍼티, 함수들 정의)
    }

    (+) 프로토콜 예시 설명 들으면서 get과 set에 대해 다시 정리 했다.

    • get 과 set은 말 그대로 연산 프로퍼티를 사용할 때 가져오고, 설정한다고 생각하면 된다!
    • 연산 프로퍼티에서 get set 둘 다 써주지 않으면 자동으로 get 만 내부에서 구현 된다.
    • get은 읽기 전용 속성! 리턴 이용해 반환한다. 반환된 값 = 프로퍼티가 제공하는 값
    • set은 값 설정! 값 할당하거나 변경
  2. associatedtype, typealias

    • associatedtype
      • 실제 타입을 프로토콜 내부가 아닌, 프로토콜을 채택할 때 명시해서 결정한다.
      • 타입을 사용하는 곳에서 결정할 수 있기 때문에 확장성이 높다.
    • typealias
      • 별칭
      • 코드 읽기 쉽게 만들거나 긴 타입 이름 간략하게 대체
      • 프로토콜 및 프로토콜 채택 타입에서 사용 가능

1개의 댓글

comment-user-thumbnail
2024년 3월 13일

같은 강의를 들어도 느낀 바가 다르고 정리하는 방식도 다르니까 이렇게 정리해놓으면 같이 복습할 수 있어서 너무 좋은 것 같아요!

답글 달기