[Swift] 기본 내용 복습2

GomHyeok·2024년 8월 19일

회고록

목록 보기
17/18

📚Swift 언어 기본 내용 복습2

📙Extension

  • Extension이란?
    • 클래스, 구조체, 열거형, 프로토토콜 타입에 새로운 기능 추가
    • 기존에 있던 메서드 + 프로퍼티의 재정의는 불가능
    • 저장 프로퍼티는 불가능 -> 연산 프로퍼티만 정의할 수 있음
    • deinit은 정의 불가능 -> init의 경우 편의 이니셜라이저만 추가 가능

📙Data Type

  • Optional 이란? -> 값이 있을수도 없을수도 있음을 나타내는 값으로 안전성 강조
  • 사용하는 이유
    • 변수나 상수에는 nil을 할당할 수 없음
    • 값이 없을 수 있다는 것을 직관적으로 받아들일 수 있음
  • 구현 방식
    • 제네릭이 적용된 열거형 -> @frozen 키워드를 사용해 타입의 변경을 제한한다.
@frozen public enum Optional<Wrapped> : ExpressibleByNilLiteral {
    case none
    case some(Wrapped)

		/// 중략
}
  • Optional Data를 일반 타입으로 상용하려면?
    • 옵셔널 바인딩을 사용하여 사용가능
    • if let 구문 + guard let else {} 구문 사용가능
      • 두가지의 차이점 = if let은 if 내부에서만 사용, guard let은 자유롭게 사용
    • 강제 추출(!) 사용가능 nil인 경우에는 런타임 에러
  • enum은 무엇인가?
    • 열거형 -> C언어에서도 사용함
    • 개발자가 정의한 항목 값 이외에는 추가하거나 수정이 불가능 하다
    • .을 통해서 case에 접근 가능
    • 코드 가독성 향상과 오타 감소 나도
    • 원시값이나 연관값 사용하여 디테일 값 설정 가능
      • 원시값 = enum 선언시 이름 옆에 원시값 타입 명시(Number, Char, String)
        • type에 따라 자동 생성 될 수도, 모두 명시해야 하는 경우도 있다.(선언된 값에서 +1증가)(string은 case이름)
        • enum.case.rawValue 통해 접근 가능
    • 연관 값
      • 상세한 정보 획득 가능(튜플의 형태) -> 모든 case가 가질 필요 없음
  • 컬렉션 타입이란(Array, Dictionary Set)
    • Array -> 같은 타입의 순서가 있는 타입(버퍼임)->필요에 따ㅏ라 크기 조절하며 삽입 삭제 자유롭다
    • Dictionary -> key-value 형태의 컬렉션 타입 -> Key는 hashable 프로토콜 따름(중복불가)
      • 스위프틍의 기본 데이터 타입은 모두 Hashable 프로토콜 채택
    • Set -> 같은 타입의 데이터를 순서 없이 하나의 묶음으로 저장 -> 중복 불가능
      • 순서가 중요하지 않고 중복없는 데이터 관리시 set이 유리( O(1)에 데이터 관리)
  • Any, AnyObject
    • Any는 모든 데이터 타입
    • AnyObject는 클래스 인스턴스
    • 매번 타입 확인과 변환이 필요하다 -> Swift에서 권장하지 않음

📙클로저

  • Closure란?
    • 어떤 기능을 하는 코드를 블록으로 모아둔 객체
    • 참조 타입임
  • 값 캡처
    • 자신의 정의 위치에서 외부 값 캡쳐함
      • 값의 타입과 관계없이 캡쳐시에 값을 참조한다(중요!!)
    • 값은 모두 상수로 캡쳐됨으로 내부에서 값을 변경할 수 없다.(참조하지 않는 경우에)
      강한 참조가 발생함으로 self를 사용하는 경우 weak self를 통해 순환참조를 예방해야한다.
    • unowned로 캡쳐하는 경우에는 해당 인스턴스에 Nil할당된 후에도 클로저 작업 실행 상황엣4ㅓ 런타임 에러 발생
  • Name Closure -> 이게 뭐지..?
    • 함수랑 같은 것! -> 전역 함수는 어떠한 값도 캡쳐하지 않음 -> 중첩 함수는 자신을 포함하는 함수 값을 reference capture
  • Trailing Closure, Escapaing Closure
    • Trailing Closure = 함수 파라미터 마지막 요소가 클로저인 경우 소괄호 밖에서 클로저 선언 가능 -> 후행 클로저
      • 여러개인 경우 다중 후행 클로저 사용 가능 -> {} 통해 표현
      • Xcode에서 권장하는 방법임
    • Escaping closure = 함수의 종료 이후 호출될 때 탈출 클로저 사용
      • 함수 외부에서 클로저를 저장하거나 사용하는 경우
        • 비동기 작업시 많이 사용한다.
        • @escaping 키워드 사용
  • 함수와 클로져의 차이점
    • 함수가 결국 클로저의 형태 중 하나(named closure)

📙프로토콜

  • 프로토콜이란

    • 객체가 어떤 역할을 위한 인터페이스 정의 -> 스스로 기능 구현하지 않음
      • 추상 클래스로써의 역할 수행 가능
        • 프로토콜은 기본적으로 기능 구현을 할 수 없고, 클래스는 추상 표현이 불가능함
        • 프로퍼티 메서드를 프로토콜로 정의하고 extension 통해 기본 구현체 만들면 추상 클래스와 동일한 개념임
    • 다형성 구현 가능 + 객체 간의 유연한 커뮤니케이션
    • 클래스 구조체 열거형에서 채택 가능하며 모든 기능을 반드시 구현해야함
      • 선택적 요구사항 지정 가능(objc 속성이 부여된 프로토콜에서만)
        • 선택적 요구사항이 적용된 프로토콜은 objc 속성이 부여된 클래스에서만 사용 가능
  • associatedType

    • 프로토콜 내에서 타입 지정하지 않고 채택하여 구현할 때 타입을 지정 -> 프로토콜의 제네릭 역할
  • Codable
    - Encodable + Decodable 프로토콜의 합성 프로토콜

    • Codable을 준수하는 타입은 다른 표현 방식으로 상호 변환 가능
    • NSCoding의 차이
      - Codable은 클래스 열거형 구조체에 모두 적용 -> NSCodable은 클래스 타입에만 적용
      • NSCoding은 NSObject를 상속받은 클래스에서만 채택 가능하다
      • 반드시 NSKeyedArchiver와 NSKeyedUnarchever를 통해 Data 타입으로 저장 + 디코딩
  • Equatable

    • 비교 연산을 위해 필수적 구현해야하는 프로토콜
    • 기본 타입은 모두 따르고 있음 -> Custom의 경우 직접 채택해야함
    • 구조체의 경우 프로퍼티가 모두 기본 타입인 경우 Equatable 채택시 비교 연산 가능
    • 클래스의 경우 직접 메서드 구현해야함
    • 열거형의 경우 연관값이 없으면 자동으로 채택한다 -> 있는 경우 직접 채택해야하며 연관값이 모두 equatable을 채택해야함
static func == (A : Class, B : Class) -> Bool {
	return A.a == B.a
}
  • Hashable 프로토콜
    - 채택하는 타입은 모두 값을 정수 해시값으로 표현이 가능하다
    • Equatable 프로토콜 준수함(해시값은 고유 값이어야 함으로 고유한지 확인하기 위해)
    • 기본 타입은 모두 따르지만 custom의 경우 직접 채택해야함
    • 클래스는 직접 hash함수를 구현해야함 -> Equatable 함수도 함께 구현해야함
    • 열거형의 경우 연관값 없으면 자동으로 Hashable을 채택함
profile
github : https://github.com/GomHyeok/

0개의 댓글