[Swift] class, struct, enum

MinTa·2022년 3월 13일
0
post-thumbnail

class, struct, enum 유사점

  1. 모두 property와 function을 가질 수 있다.
    다만 enum은 연산 프로퍼티만 가질 수 있고, 저장 프로퍼티를 가질 수 없다. class와 struct만 저장 프로퍼티를 가질 수 있다.

  2. enum을 제외한 class와 struct는 initializers(초기화 함수)를 가질 수 있다.
    enum은 초기화 함수가 필요없다.

class, struct, enum 차이점

  1. class만 상속 가능하고 struct, enum은 상속 불가능.

  2. Value type(struct, enum) vs. Reference type(class)
    struct과 enum은 값으로 전달되는 값 타입, class는 참조 타입으로 포인터(메모리 주소)로 전달되고 heap memory(동적으로 할당되는 메모리 영역)에 있음

Value vs. Reference

Value (struct and enum)

값타입은 함수에서 인자로 전달될 때 복사된다는 점은 명백한데 다른 변수에 할당할 때도 복사한다. 단지 할당하는 것도 복사가 되는것이다.

값 타입 개념은 let 변수에 할당한 경우 값을 바꿀 수 없다.

기본적으로 Value Type의 프로퍼티들은 해당 인스턴스 메소드 내에서 수정할 수 없다. 그러나 메소드 내에서 구조체 또는 열거형의 프로퍼티를 수정해야 하는 경우, 해당 메소드의 앞에 mutating 키워드를 붙이는 것으로 이를 허용할 수 있다.

mutating func {...}

함수가 구조체를 바꿀 수 있는 경우에는 mutating func 이런식으로 작성
이런걸 명시하는 이유는 swift는 사실 실제로 복사를 하고 싶어하지 않기 때문이다. swift는 다른 포인터를 가지고 있다가 값이 바뀌려고 하자마자(as soon as you mutated) 그순간! 복사가 되는 것이다.
그래서 구조체의 값을 바꾸는 함수가 있는 구조체가 있다면 swift가 알 수 있도록 mutating을 붙여줘야한다.

Reference (class)

힙 메모리에 저장되며 참조 카운트는 자동으로 세어진다(ARC).

No Garbage Collection.
힙 메모리에 기록되고 치워진다. 힙에 있는 무언가에 새로운 포인터를 생성될 때마다 swift가 알아서 추적하고 카운트한다. 그러다가 카운트가 0이 되면 즉시 힙메모리에서 제거된다(Predictable).

Garbage Collection은 뒤에서 무슨일이 일어나고 있는지 보고 있다가 한꺼번에 카운트가 0인 애들을 수집해서 치움.
이 과정은 모두 swift가 알아서 해주는 것이고 이 과정에 관여할 수 있는 것은 오직 weak와 strong뿐이다.(ARC 관련해서 작성한 글)

profile
지(치지않고)꾸(준히)열(심히)

0개의 댓글