-
언제 class 대신 struct 를 사용할까?개발/Swift 2021. 11. 14. 16:30
swift에는 class 와 struct 가 있다. 둘의 차이는 쉽게 크게 이렇다.
class 는 상속을 받을수있지만 struct 는 상속이 불가한점
class 는 참조 타입이지만 struct는 값 타입인점
참조타입과 값타입에 대해 대표적인 차이점으로
두개의 변수에 참조 타입을 할당할때 하나의 변수만 바꿔도 두 변수가 모두 바뀌는점이 있고
그리고 메모리 관리 방식(스택/힙)이 다르다는 점이 있을것이다.
그런 차이점을 알고도 언제 참조타입을 사용하고 언제 값타입을 사용해야 하는것일까 하는 의문은
사라지지 않고 있다. 아직도 단순하고 별다른 기능이없는 경우만 struct를 사용하고있다.
struct 의 장점은 인스턴스 생성이 class 보다 100배가 빠르다는 점이다.
이유는 모르지만 아마 struct는 힙보다 빠른 스택에 저장되기 때문인거같다.
또 struct같은 값타입은 변수 할당시 할당 할떄마다 인스턴스를 복사한다 했다.
그런경우 어쨋든 메모리를 많이 먹는것 아닌가? 싶었지만
사실은 Copy-on-write 라는 방식을 사용해 매번 복사하는것이아니라
새로운 변경이 일어날때 복사를 한다고 한다.
애플에서는 구조체(struct)를 이럴때 class 대신 사용하라한다.
둘의 차이점을 알고도
언제 복사되기를 기대하고 언제 참조되기를 기대하는지, 어떻게 내 코드에 적용시킬지는
여러 시도를 통해 숙달 해야 할듯하다.
-----------------------------
알게된 추가내용 - 구조체 이니셜라이저 특징
struct 의 초기화는 두가지 방법이 있다.
init()을 사용하던지 아니면 저장 프로퍼티에 초기값을 저장하는것이다.
class와 다르게 struct에서는
init()을 구현 하지 않아도 내부 프로퍼티 이름으로 자동 init()코드를 제공 받을수있다.
class던 struct던 내부 프로퍼티가 있다면 무조건 값이 있다는것을 보장해야한다.
빈메모리에 접근하려는 에러는 피해야하기 때문이다.
항상 초기값이 있다면 프로퍼티 선언과 함께 초기값을 넣어주는게 좋다. ( 더짧은 코드)
그게 아니면 init()을 사용하면된다.
다만 프로퍼티가 옵셔널 이라면 초기값이 없어도 되며 초기값이 없으면 nil이다.
또한 init 함수 안에는 상수값(let) 도 할당이 가능하다.
struct People{ let size : Int init(size:Int){ self.size = size } } let kim = People(size:20)
그러나 상수값이 초기값으로 할당 되어있는 경우는 불가하다.
'개발 > Swift' 카테고리의 다른 글
[Swift 코딩테스트] 프로그래머스 - 체육복 (0) 2021.11.29 GCD - DispatchQueue Main/Global 큐 스레드에 관해 (0) 2021.11.23 [Swift] 클래스의 init 파헤치기 (0) 2021.10.18 [Swift 기본]ARC 와 Weak vs Strong (3) 2021.10.04 Localize + UserDefaults 사용하여 언어 설정 기능 구현 하기 (0) 2021.09.16