[Swift] Struct VS Class에 대하여

박건희·2022년 4월 19일
1

Swift

목록 보기
8/10
post-thumbnail

Intro

예전에 벨로그에 이런 글을 올린적 있었다.

Class VS struct VS enum
class는 참조 타입, 나머지는 값 타입...
상속은 class만 가능하지만 extension은 모두 가능..

이렇게 겹치는 기능들이 많아지다 보니 어떤 것을 사용할지 애매해진다. 어떤 상황에 어떤 것을 택하는 것이 좋을까?

구조체

  • 참조가 아니라 값의 복사를 원할 때 (value type이기 때문에)
  • 상속 받을 필요가 없을 때

글을 올리면서도 class와 struct의 큰 차이를 느끼지 못해 상속이 가능한 class 위주로 사용하려 했었다.
Reference Type을 다루는 법은 다른 언어들에서도 이미 익숙했기 때문이다.

하지만 Udemy 강의를 들으며 Struct를 기본적으로 사용하는 것이 옳다고 느껴졌다. 그 이유를 설명하겠다.


Struct와 Class의 차이점에 대해서 다시 복습!

1. Struct는 상속을 받는 것도 시키는 것도 불가능하다!

2. Struct는 value type, Class는 Reference type
그래서 새로운 Struct에 이미 존재하는 Struct를 할당하면 독립된 공간을 사용하고 값만 같은 Deep Copy가 일어난다.
Class의 경우 Reference 값을 공유하며 같은 리소스를 향하는 Shallow Copy가 일어난다.

3. Struct는 Stack, Class는 Heap에 저장된다.
뇌피셜이지만, Struct는 value type이기 때문에 local variable이나 constant value가 저장되는 stack에 저장되고, Class는 인스턴스가 생성되면 그 주소 (reference)만 알면 되니까 자연스럽게 heap에 저장되는 것 아닐까?

4. Struct는 한번 생성되면 immutable하다. 값을 바꾸려면 새로운 struct를 생성하는 수 밖에 없다
mutating func을 통해 struct의 값을 바꿀 수 있지만, 클래스처럼 프로퍼티 값만 바꿔주는 것이 아니라 아예 새로운 copy를 생성하는 방식이다.
또한 class instance의 경우 let으로 선언해도 가변 프로퍼티를 바꿀 수 있는 위험이 있다 (난 이거 좋은데..)

결론: Struct가 조금 더 깐깐하고 귀찮다. 그래서 에러를 낼 확률이 Class보다 훨씬 적다


결론

기본적으로 Struct를 사용하고, 상속이 필요한 경우에만 Class로 바꾸는 방법을 애플에서 공식적으로 장려한다

Struct가 유연성은 부족하지만 Class보다

  • 간단하고
  • 더 빠르고
  • True immutability를 지원하고
  • Memory leak이 덜하며
  • thread safety를 더 보장한다

는 장점이 있기 때문이다.

따라서 ,

  1. 상속을 사용해야 하거나
  2. Objective-C 코드를 사용해야 할 때

를 제외하면 Struct를 쓰자!

profile
CJ ENM iOS 주니어 개발자

0개의 댓글