[swift] 구조체와 클래스

GOSARI·2021년 10월 24일
0

swift

목록 보기
4/11

Structures and Classes

구조체와 클래스는 일반적인 목적의, 유연한 구조를 가진 코드의 기본 블럭이다. 기능을 부여하기 위해 변수, 상수, 함수를 정의하듯 구조체와 클래스에서는 프로퍼티와 메소드를 선언한다.

스위프트의 구조체와 클래스는 많은 공통점을 지니고 있다.

  • 값을 저장하기 위해 프로퍼티를 정의할 수 있다.
  • 기능을 제공하기 위해 메소드를 정의할 수 있다.
  • subscript 문법을 사용하는 값에 접근하기 위해서 subscript를 정의할 수 있다.
  • 초기 상태를 설정하기 위해서 이니셜라이저를 정의할 수 있다.
  • 기본적으로 구현된 기능을 뛰어넘어 그 이상 확장될 수 있다.
  • 특정 종류의 표준 기능을 제공하기 위해 프로토콜을 따를 수 있다.

클래스는 구조체가 갖지 않은 추가 기능을 가진다.

  • 상속을 통해 다른 클래스의 특성을 상속받을 수 있다.
  • 타입 캐스팅을 통해 런타임 중, 클래스 인스턴스의 타입을 확인할 수 있다.
  • 디이니셜라이저를 통해 클래스의 인스턴스가 할당된 메모리를 해제할 수 있다.
  • 참조 카운팅은 클래스 인스턴스에게 하나 이상의 참조를 허용한다.

클래스는 이런 추가적인 기능 탓에 구조체에 비해 많은 비용이 들어간다. 일반적인 가이드라인에서는 추론이 쉬운 구조체를 선호하며, 적절하거나 필요할 때에만 클래스를 사용한다. 이는 실제로 사용자 정의 데이터 타입을 정의할 때 구조체나 열거형을 많이 쓴다는 것을 의미하기도 한다.

애플 공식문서를 읽어보면 클래스를 사용하는 두 가지 경우에 대해서 찾아볼 수 있다.

  • Objective-C 상호 운용성이 필요할 때
  • ID를 제어해야 할 때

상속 기능을 위해 클래스를 선택한다면 프로토콜 사용을 고려해봐야 한다:
프로토콜 상속은 클래스, 구조체, 열거형 모두가 상속받을 수 있는 반면, 클래스 상속은 클래스 한정 호환이 가능하다. 때문에 데이터 모델링을 진행할 때 프로토콜 상속으로 데이터 계층 구조를 만들고, 구조체에 해당 프로토콜을 상속하는 것이 좋다. (참고: Choosing Between Structures and Classes

클래스에 비용이 더 들어가는 이유에 대한 개인적 견해

클래스에 많은 비용이 들어가는 이유를 조금 더 알아보자면, 참조 타입이라는 점에 주목해야 한다. 클래스는 인스턴스를 생성할 때 정보값과 주소값을 따로 저장하기 때문에 추가적인 메모리 공간을 사용하게 된다. 물론 이는 구조체의 인스턴스가 무수히 늘어날 때, 단점이 되지 못한다. 구조체는 각각이 전부 정보값 공간을 차지(실체)하는 반면, 클래스는 주소값만 가질 수 있기 때문이다. 클래스의 복사된 주소값의 정보에 접근하기 위해 이중 수고를 들여야 한다는 점을 고려한다면, 결국 구조체와 클래스를 선택하는 기준은 기본값을 유지하나 변경하나에 있을 것이다.

0개의 댓글