[Swfit] 기본 내용 복습3

GomHyeok·2024년 8월 26일

회고록

목록 보기
18/18

📚Swift 언어 기본 내용 복습3

📙키워드

  • Mutating 키워드
    • swift에서 구조체, 열거형 내부에서 변수 변경이 불가능함
    • mutating 키워드가 붙는 경우 함수 내부에서 해당 구조체난 열거형의 값을 변경할 수 있음
    • 단 let으로 선언된 Value Type은 Mutating 메서들르 사용하더라도 값을 변경할 수 없음
struct Point {
    var x = 0.0, y = 0.0
    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        x += deltaX
        y += deltaY
    }
}
  • lazy 키워드

    • 지연 저장 프로퍼티 -> 호출이 있어야만 값을 초기화 한다.
    • init 이후에 값을 초기화 할 가능성 높음(상수가 되면 안된다.)
    • 성능 저하나 공간 낭비를 줄일 수 있다.
    • 문제점 : 다중 스레드 환경인 경우 변수를 여러 스레드가 동시 접근하는 경우 여러번 초기화 될 수 있다.
  • typealias 키워드

    • 기존 타입에 새로운 이름을 지정할 때 사용 -> 코드의 가독성 증가
  • required 키워드

    • 클래스나 프로토콜을 상속받는 클래스에서 반드시 구현되어야 하는 메서드
    • 하위 클래스에서 구현되지 않으면 컴파일 오류가 발생한다
    • Override 키워드와 함께 사용되는 경우 override 키워드가 반드시 함께 사용되어야함

📙패러다임

  • map, filter, reduece의 구분과 개념
    • swift = 함수를 객체로 취급한다. 따라서 함수를 매개 변수로 사용할 수있다.
    • 매개 변수로 함수를 가지는 함수 = 고차함수(map, filter, reduece)
    • map
      • 초기값과 클로저를 전달 받아 전달받은 클로저 실행 후 그 결과 반환
        • 기존 데이터를 변경하지 않고 새로운 값 반환
        • 실질적으로 어떤 Data의 변경후 값을 사용할 때 자주 사용함
    • filter
      • 컨테이너 내부의 값을 걸러서 추출 -> 조건에 맞는 값을 모아준다.
        • 특정 조건을 바탕으로 값을 걸러낼 때 사용한다.
    • reduce
      • 초기값을 하나의 값으로 합쳐줌 ex) 배열의 모든 값을 합치는 경우
    • flatMap
      • 컬랙션이나 비동기 시퀀스의 각 요소를 변환한 다음 하나의 배열로 평탄화
        • 각 요소에 대해 변환 함수 적용 후 중첩 배열을 단일 배열로 병합
    • compactmap
      • 비동기 시퀀스 각 요소를 변환하고 변환 겨로가가 nil이 아닌 요소만을 포함한다.

📙function/method

  • function과 method의 차이

    • funtion은 특정 객체에 속해있지 않은 코드 블록
    • method는 특정 객체에 정의되는 함수
    • function -> 외부 객체 상태 변경 가능 / method -> 본인이 속한 객체 프로퍼티, 메서드만 접근
  • class 메서드 <-> static 메서드

    • 클래스의 타입 메서드임 = 타입 메서드 타입 자체에 호출 가능한 메서드 -> 인스턴스 없어도 사용 가능
    • static은 재정의가 불가능 하다 <-> 클래스는 상속후 재정의 가능
  • 함수에서 valueType의 값을 바꾸고 싶으면 어떻게 해야하는가?

    • 일반적으로는 변경할 수 없다.
    • 변경하고자 하는 경우에는 inout 키워드를 사용한다.
    • inout == 메모리 주소를 전달 받겠다.
    • 함수에 전달할 때는 &를 붙여 메모리 주소를 전달한다라는 표시(c랑 비슷하다)
    • 단 메모리 주소를 전달해야 하기 대문에 오버헤드 발생 가능
  • defer란?

    • defer는 코드 블록의 지연 -> 가장 마지막에 실행
    • 함수가 반환하기 직전에 실행된다.
    • 함수내에서 일어나는 일 중 가장 마지막에 정리해야 하는 일을 처리할 수 있다.
      (ex -> 리소스 해제, 임시 데이터 삭제, 파일 닫기)
    • 그럼 여러개의 defer에서는?
      • 여러개일 경우 선언한 순서의 역순으로 실행
        • defer가 읽히기 전에 return(함수의 종료)가 되는 경우는 실행하지 않음
        • guard문을 사용하게 되면 옵셔널 바인딩에 실패하는 경우 defer가 실행되지 않을 수 있음
    • 사용 시기는?
      • 함수가 종료되기 직전 실행되어야 하는 코드 작성
        • lock과 unlock을 해주어서 데드락을 예방해야 하는 경우
        • 함수가 종료될 때 마다 행해야 하는 함수 -> defer로 함수 상단에 선언

📙프로퍼티

  • 저장 프로퍼티와 연산 프로퍼티
    - 저장 = 객체 내부의 값을 저장할 때 사용하는 기본적 프로퍼티
    • 변수나 상수로 선언할 수 없음 -> 초기 값을 설정할 수 있다.
    • 연산 프로퍼티 = 값을 저장하지 않고 인스턴스 내부, 외부 값을 연산
    • 은닉화 된 값을 간접적으로 수정, 접근 가능
      • getter, setter -> 코드 가독성이 나빠짐
        • 연산 프로퍼티는 해당 역할을 동시에 하여 간편 + 직관적 코드 작성
        • 쓰기 전용으로 구현할 수 없다
  • 지연 저장 프로퍼티란?
    • 해당 프로퍼티 호출시 값 초기화(lazy 키워드 사용)
    • 성능 저하와 공간 낭비 줄일 수 있다.
  • property wrapper에 대한 설명(swiftUI로 이해하는게 더 쉽다)
    • 프로퍼티 래퍼는 여러 프로퍼티에 대해 반복되는 코드의 재사용
    • 보일러 플레이트 코드 제거
      • 최소한의 변경으로 여러곳에서 재사용되며, 반복적으로 비슷한 형태의 코드
        • 반복되는 작업이나 패턴에 대한 일종의 표준화된 코드
    • @propertyWrapper키워드를 사용해 구조체를 정의하고 내부에 프로퍼티에 대한 동작 정의
    • 미리 정의한 동작을 재사용 할 수 있다.
    • 클래스, 구조체, 열거형에서만 사용할 수 있다.
@propertyWrapper
struct Uppercase {
	private var value : String = ""
    
    var wrappedValue : String {
    	get { self.value}
        set { self.value = newValue.uppercased() }
    }
    
    init(st initvalue : String) {
    	self.wrappedValue = initvalue
    }
}

struct Address {
	@Uppercase var town : String
}
profile
github : https://github.com/GomHyeok/

0개의 댓글