Struct, Class

Dophi·2023년 1월 18일
0

iOS

목록 보기
3/5

소개글

iOS 개발을 하면서 헷갈렸던 개념들을 다시 정리해보고 있습니다.
만약 틀린 내용이 있다면 피드백은 언제나 환영합니다.
더 자세하고 알고싶다면 아래쪽 참고사이트에서 확인하면 좋을 것 같습니다!
말투는 편한 말투로 작성하니 양해 부탁드립니다.

Struct, Class

Struct vs Class (vs Actor)

Struct 특징

  • Value 타입
  • 프로퍼티를 변화시키는 메소드를 정의할 때는 mutating 키워드를 써줘야함
    • Swift의 몇몇 구조체(Int, Array 등)에서는 최적화를 위해 Copy-On-Write 방식을 쓰고 있음
    • Copy-On-Write: 다른 변수에 값을 할당하면 일단 복사하지 않고 같은 곳을 바라보고 있다가, 값이 변경할 때 실제로 복사를 하고 값을 변경함
    • Copy-On-Write에서 mutating 키워드는 해당 메소드가 호출된다면 실제 복사를 해야한다고 알려주는 역할

Class 특징

  • Reference 타입
  • 상속할 수 있음
  • 타입 캐스팅이 가능함
  • 인스턴스에 참조 횟수 계산이 적용됨
  • deinit이 호출됨

Value타입과 Reference 타입이기 때문에 따라오는 특성들도 많이 있습니다.
이는 밑에서 이어서 설명하겠습니다.

Actor 특징

  • Class와 전체적으로 비슷하지만 스레드로부터 안전하다는 점이 다름

Actor는 Swift의 Async에서 사용되는 용어긴 하지만 Class와 비슷하여 넣었습니다.

Struct를 사용하면 좋은 경우 (애플 문서)

  • 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 경우
  • 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
  • 구조체에 저장된 프로퍼티가 값 타입이며, 참조하는 것보다 복사하는것이 합당할 때
  • 다른 타입으로부터 상속받거나, 자신을 상속할 필요가 없을 때

Class를 사용하면 좋은 경우

  • 그 외의 경우
  • Objectice-C와 상호 운용성을 원할 때

Value vs Reference

Value 타입 특징

  • 값을 할당하거나 전달할 때 복사본을 넘김 (한개의 인스턴스 내부의 값을 변경하면 그것만 변경됨)
  • Struct, Enum, String, Int 등이 있음
  • Stack에 저장됨
  • 스레드로부터 안전함 (멀티스레드 환경에서 각자 자신의 Stack을 가지고 있기 때문)
  • 비교적 더 빠름

Reference 타입 특징

  • 값을 할당하거나 전달할 때 참조를 넘김 (한개의 인스턴스 내부의 값을 변경하면 나머지도 다 변경됨)
  • Class, Function 등이 있음
  • Heap에 저장됨
  • 스레드로부터 안전하지 않음 → 동기화 처리 필요 (멀티스레드 환경에서 Heap은 공유되기 때문)
  • 비교적 더 느림 (동기화 처리로 인한 오버헤드 발생)

Value 타입을 포함하는 Reference 타입

  • 예시로는 Struct 변수를 가진 Class
  • Reference 타입이 소멸하기 전까지 Value 타입도 Heap에 저장됨

Reference 타입을 포함하는 Value 타입

  • 예시로는 Class 변수를 가진 Struct
  • Stack에 저장되긴 하지만 참조 카운팅이 이루어짐

참고 사이트

https://icksw.tistory.com/256
https://infinitt.tistory.com/392
https://velog.io/@wonhee010/mutating

profile
개발을 하며 경험한 것들을 이것저것 작성해보고 있습니다!

0개의 댓글

관련 채용 정보