본문 바로가기
iOS.Swift

[Swift] class 와 struct 의 차이

by 동동하다 2023. 11. 15.
반응형

Swfit에서 가장 헷갈리는 내용 중에 하나가 class와 struct에 차이이다. 둘은 언뜻 보면 비슷하게 사용되며 큰 차이점이 없는 것처럼 보인다. 하지만 차이점을 모르고 잘못 사용하다 보면 큰 문제가 발생할 수 도 있다. 그 차이를 한번 알아보자

 

공통점

우선 차이점을 알기전에 공통점부터 알아보자. 둘 모두 Swift에서 사용되는 데이터를 유용하게 표현하기 위해 저장하고 처리하기 위해 사용자가 타입을 정의해서 만들어 주는 데이터 타입이다. 그렇기에 데이터를 잘 다룰 수 있도록 다양한 기능이 제공된다.

 

  • 데이터를 저장할 수 있는 프로퍼티를 만들 수 있다.
  • 메소드를 만들어서 특정 작업을 수행할 수 있다.
  • initializer를 가질 수 있어 초기값을 설정할 수 있다
  • Extention을 이용해서 기존 타입에 새로운 기능을 확장할 수 있다.

참조 타입의 class

class 의 가장 큰 특징은 참조 타입 (reference type)이라는 것이다. 인스턴스될 때 해당 인스턴스의 메모리 주소값이 해당 변수, 또는 상수에 저장된다. 이는 여러 변수가 해당 인스턴스의 주소값을 공유할 수 있다는 것이고 이는 의도치 않은 문제점이 발생할 수 있다. 예를 들어 class 인스턴스 값을 변경할 때 해당 인스턴스를 참조하는 모든 곳에서 어떤 사이드 이펙트가 있을지 모르기에 유의해서 사용해야 한다.

특히 argument 로 전달되는 경우 전달받은 곳에서 class를 수정하면 기존의 class를 전달한 곳에도 영향을 미치게 된다. 이 점을 유의해서 사용해야 한다. 

이렇게 메모리 주소를 참조한다는 것은 메모리 누수를 발생시킬 수 있기 때문에 ARC (Automatic Reference Counting)를 통해 관리되며, deinitializer를 가질 수 있어서 인스턴스가 해제될 때 처리를 할 수 있다.

 

다만 class 내부에 값 타입의 프로퍼티 (Int, String 등)를 사용할 경우 해당 프로퍼티는 값 타입으로 저장된다.

 

class 는 다른 class로부터 상속을 받을 수 있고 본인 또한 다른 class에 상속될 수 있다. 이를 통해 기존 class는 확장되어 새로운 형태로 사용될 수 있다.

값 타입의 struct

반면에 struct 는 값 타입 (value type) 이기에 인스턴스를 생성하고 변수에 저장될 때 복사된 값이 저장됩니다. 그렇기에 class에서 필요한 메모리 관리를 할 필요가 없어 심플하다. 또한 값을 복사해서 사용하기에 기존 변숫값이 변경됨에 따른 사이드 이펙트가 없다.

그렇기에 SwiftUI 처럼 선언적 코딩을 하는 경우에는 struct를 사용하는 것이 좋다. 실제로 애플에서도 공식적으로 struct 사용하기를 권장한다.

Stack Memory, Heap Memory

class 와 struct의 차이는 참조 타입과 값 타입에 할당되는 메모리 구조를 이해하면 쉽게 이해가 된다.     

힙 메모리 (class 저장)

데이더 할당 해제시해제 시 참조 계산도 필요하기 때문에 데이터 할당 해제 시 불필요한 작업이 추가되기에 느리다. 스레드를 공유하기 때문에 스레드락의 위험성이 있다.

 

스택 메모리 (struct 저장)

값 타입 변수의 경우 스택 메모리에 추가된다. 스택 구조의 경우 스택 포인터를 이용해서 데이터 위치를 비교적 쉽게 파악할 수 있기 때문에 데이터 할당, 해제가 빠르게 이루어진다. 또한 스택별 스레드 (thread)가 따로 생성되기 때문에 thread-safe 하다.

 

반응형

'iOS.Swift' 카테고리의 다른 글

[Swift] property wrapper 정의 및 사용법 예시  (0) 2023.11.24
iOS에서 Chrome 웹뷰 디버깅 하기  (0) 2023.10.24