[Swift] Class vs Struct

SangOK·2022년 9월 12일
0

이론

목록 보기
1/2

소스 코드 확인하기 <-

Class 와 Struct 의 차이와 이를 언제 쓰는지에 대한 주제는 가장 기본적이면서 중요한 내용이라고 생각합니다.


먼저 각각의 특징을 정리해보겠습니다.

Class

  • 공유 개념(참조 타입) - ARC로 메모리 관리
  • 상속 가능
  • AnyObject 로 타입 캐스팅이 가능
  • 여러 개의 변수에 할당한 뒤 값을 변경시키면 할당한 모든 변수에 영향을 줌
  • init 안에는 모든 프로퍼티에 대한 초기값이 정의가 되어 있어야 함 (프로퍼티가 옵셔널일 경우 X), 메모리에서 해제되는 시점에 자동으로 호출되는 deinit 존재
  • 메모리의 heap 공간에 할당

Struct

  • 복사 개념(값 타입)
  • 상속 불가능
  • Object가 아니기 때문에 AnyObject 로 타입캐스팅이 불가능
  • copy-on-write, 대입할 때 복사가 일어나는 것이 아닌, 수정이 발생할 때 값이 복사
  • init 을 구현하지 않을 시 기본 initializer 사용
  • 메모리의 stack 공간에 할당 (컴파일 단계에서 생성되고 사라지는 시점을 알고있음)

공통점

  • 프로퍼티, 메소드를 선언 가능
  • init 을 사용하여 초기 값 설정 가능
  • extension 사용 가능
  • Protocol 채택 가능

차이점이라면 값 타입과 참조 타입 이라는 차이점이 가장 많이 언급됩니다. 나머지 차이점들은 이 항목에 의해서 발생되는 특징이 있습니다.

Cocoa(AppKit) Cocoa Touch(UIKit) 를 다룰 때 AnyObject 를 id 로 받는 경우가 많은데 이 경우 struct 로 만들어진 값을 넘기는 것은 불가능.. 하지만 Any 의 경우는 Struct 로 만들어진 값도 캐스팅이 가능합니다.


다음은 플레이그라운드를 활용해 Class 와 Struct 의 생성 및 대입 속도를 비교해보겠습니다.

  • 생성




    스크린샷에 보이는 결과와 같이 최대(대략) 100배 정도 차이로 Struct 의 속도가 빨랐습니다.


    플레이그라운드라는 특징과 시스템 환경에에 따라 다르기 때문에 정확하게 비교할 수 없습니다. 하지만 여러번 실행해보아도 Struct 의 생성 속도가 더 빠르다 는 결과는 똑같았습니다.

  • 대입




    대입의 결과는 조금 달랐습니다. Struct 가 조금 더 빠르게 보이지만 여러번 실행한 결과 Struct 가 Class 보다 느렸던 케이스도 존재했습니다.


    찾아본 결과 Struct 는 대입 시 메모리 내용물까지 복사를 해야 하니 레퍼런스만 넘겨주는 Class 에 비해 느릴 수 밖에 없다. 라는 내용을 발견했습니다.

그렇다면 언제 Struct 를 사용하는게 유리할까?
  • 불변성(Immutable)이 필요한 데이터 타입
  • 적은 데이터, 멤버 프로퍼티의 갯수나 차지하는 메모리 용량이 적은 타입 (많아진다면 대입 과정에서 불리함)
  • 대입 보다는 생성되는 경우가 많은 타입
  • 공유될 필요가 없는 타입

반대로 Class 를 사용해야 하는 경우는?
  • 싱글톤(Singletone Pattern)은 하나의 인스턴스를 여러 곳에서 공유하면서 사용해야 한다.
  • ViewController 의 경우 공유 형태이니 레퍼런스 접근이 되어야만 한다.
profile
궁금하다

0개의 댓글