본문 바로가기
Swift/Basic

Data Type

by songmoro 2024. 11. 7.
728x90

Class, Struct

  • 데이터를 캡슐화하기 위한 모델
  • 클래스와 구조체 공통점
    • 속성 정의(property), 기능 정의(method), 첨자 구문 정의(subscript), 초기화 구문 정의(init), 확장 가능(extension), 프로토콜
    • 관련 문서: Properties, Methods, Subscripts, Initialization, Extensions, Protocols
  • 클래스만 가진 기능
    • 상속 가능
    • 타입 캐스팅 사용으로 런타임에 클래스 인스턴스 타입 확인 및 해석
    • deinit
    • 참조 카운팅으로 두 개 이상의 참조 허용
    • 관련 문서: Inheritance, Type Casting, Deinitialization, Automatic Reference Counting
  • 클래스와 구조체
    • 일반적으로 클래스가 지원하는 기능을 다루는 건 복잡성이 증가한다.
    • 따라서 구조체를 선호하고, 필요시 클래스를 사용한다.
  • 클래스와 구조체 사이의 선택
    • 기본적으로 구조체를 선택
      • 스위프트의 구조체는 다른 언어에서 클래스로 제한되는 많은 기능이 포함
      • 구현(implementation)을 위한 프로토콜 채택 가능
      • 앱의 전체 상태를 고려할 필요 없이 쉽게 추론 가능
      • 값 타입이기 때문에 구조체에 대한 로컬 변경 사항은 앱의 나머지 부분에 표시되지 않음
        • 변경이 명시적임
    • Objective-C를 사용해야 할 때 클래스를 선택
      • Objective-C에서 제공하는 기능이 필요한 경우 데이터 모델링 혹은 상속을 위해 클래스를 사용해야 할 수 있음
    • Identify를 제어해야 할 때 클래스를 선택
      • 클래스는 참조 타입이기 때문에 Identify에 대한 개념이 내장되어 있음
        • 이는 두 개의 서로 다른 클래스 인스턴스가 각각 동일한 값을 가진 속성을 지닐 때, === 연산자에 의해 다른 것을 판단할 수 있다.
      • 앱 전체에서 클래스 인스턴스를 공유할 때, 해당 인스턴스에 대한 변경이 인스턴스에 대한 참조를 보유하는 모든 부분에 표시된다.
    • Identify를 제어하지 않아도 될 때 구조체를 선택
      • 예를 들어, 원격 데이터베이스를 참조하는 앱에서 인스턴스의 id는 외부 개체에 의해 소유되고, 식별자에 의해 전달된다.
      • 앱 모델의 일관성이 서버에 저장되면, let id 속성을 지닌 구조체를 모델링할 수 있다.
      • 사용자에 의해 인스턴스가 변경되고 이를 서버에 업데이트 할 때, 실수로 다른 레코드를 변경하지 않는다.
    • 모델 상속과 기능 공유가 필요할 때 구조체와 프로토콜을 선택
      • 구조체와 클래스는 모두 상속의 형태를 지원
      • 구조체와 프로토콜은 프로토콜만 채택 가능
        • 클래스로부터 상속받을 수 없음
        • 하지만 클래스 상속으로 구현할 수 있는 상속 계층은 구조체와 프로토콜의 상속을 통해 구현할 수 있다.
      • 처음부터 상속 관계를 구축하는 경우, 프로토콜 상속을 선호
        • 프로토콜은 클래스, 구조체, 열거형의 상속이 가능하지만 클래스 상속은 클래스만 호환

 

Value Type, Reference Type

  • 값 타입
    • 값 타입이란 변수 또는 상수에 할당되거나 함수에 전달될 때 값이 복사되는 타입
    • 모든 구조체와 열거형은 값 타입
      • 전달될 때 항상 복사된다는 것을 의미
    • 배열, 딕셔너리, 문자열과 같은 Swift 표준 컬렉션은 복사 비용을 줄이기 위해 최적화를 사용
      • COW
      • 복사본을 만드는 대신, 원본 인스턴스의 메모리를 공유
      • 컬렉션의 복사본 중 수정 사항이 생기면, 수정 직전에 요소를 복사해 분기
      • 열거형 또한 동일
  • 참조 타입
    • 변수 또는 상수에 할당되거나 함수에 전달될 때 기존 인스턴스에 대한 참조 생성
    • 참조 타입은 코드가 멀리 떨어져 있다면 추론하기 어려울 수 있다.
      • 또한 하나의 인스턴스를 다룰 때 다른 인스턴스도 고려해야 할 수 있다.
      • 값 타입은 상호 작용하는 코드가 소스 파일 상 가깝기 때문에 추론하기 쉽다.
    • let이여도 변경 가능
      • 인스턴스를 저장하는 게 아니라 참조하고 있음
      • 따라서 속성에 대한 변경은 참조 값이 아니라 참조하고 있는 대상의 값을 변경하는 것
  • 깊은 복사, 얕은 복사
    • 깊은 복사
      • 값 타입
      • 데이터를 복사할 때, 그대로 복사하여 각각의 메모리를 가짐
    • 얕은 복사
      • 참조 타입
      • 값의 주소를 복사하여 같은 값을 가리킴
    • 구조체 내부의 클래스의 경우
      • 속성은 깊은 복사
      • 참조는 얕은 복사
    • COW
      • 구조체는 깊은 복사가 일어나서 복사가 일어날 때마다 깊은 복사를 한다면 비용이 큼
      • 따라서 복사시 얕은 복사를 유지하다가 값의 변화가 생기면 깊은 복사를 하는 개념 탄생

 

Collection Type

  • Genereic implement로 구현됨
    • Array: 정렬된 값의 모음
    • Set: 정렬되지 않은 고유 값의 모음
    • Dictionary: 정렬되지 않은 키-밸류 쌍의 모음
  • Hashable
    • 기본적으로 Int, Double, String, ... 등의 원소는 Hashable
    • 만약 원소 타입이 Hashable하지 않다면 자체적으로 해시 값을 계산하는 방법을 제공해야 함

 

 

 

728x90

'Swift > Basic' 카테고리의 다른 글

프로젝트가 프로세스가 되기까지 - 1  (1) 2024.12.06
Generic, Protocol  (2) 2024.11.07
Concurrency  (0) 2024.11.07
GCD  (0) 2024.10.31
Memory Management  (0) 2024.10.31