[Swift 문법] Struct vs Class

Minji Kim·2022년 4월 26일
0

Swift 문법

목록 보기
6/8
post-thumbnail

공통점

  • 프로퍼티를 선언할 수 있다.
  • 메서드를 선언할 수 있다.
  • .으로 내부 값에 접근할 수 있다.
  • 생서자로 초기 상태를 설정할 수 있다.
  • extenstion으로 확장할 수 있다.
  • 프로토콜을 채택해서 기능을 설정할 수 있다.

차이점

구조체는 값 타입이고, 클래스는 참조 타입이다. 그래서 구조체는 복사돼서 할당되고 클래스는 참조돼서 할당되기 때문에 동작이 다르다.

구조체는 값 타입, 클래스는 참조 타입! 하지만 아직 이 둘의 차이가 별로 와닿지 않는다. 더 파보자!

위에 보면 분명 color2의 color만 "blue"로 변경했는데, color1의 color까지 "blue"로 변했다. 클래스가 참조 타입이기 때문이다. color1과 color2모두 ColorClass를 가리키고 있는 것이다. 즉, color1과 color2가 같은 인스턴스를 바라보고 있다고 생각하면 된다.

반면에 구조체는 color2의 color만 "blue"로 변했다.

구조체는 복사해서 새로운 인스턴스를 만들어서 할당하기 때문에 기존의 인스턴스와 복사된 인스턴스는 서로 남남인 셈이다.

클래스는 '가족', 구조체는 '남남'
이렇게 생각하면 편할 것 같다! 클래스는 가족처럼 서로 연결되어 있고, 구조체는 서로 남남이라서 영향을 주지 않는다.

그렇다면 왜 이렇게 차이가 나는 걸까? 이 둘은 컴퓨터 내에서 할당되는 메모리의 차이가 있다. 구조체는 Stack 공간이 생성되고, 클래스는 Heap 공간이 생성된다. 그래서 두 공간의 차이가 있기 때문에 두 동작의 차이도 있는 것이다.

언제 사용하지?

  • Struct
    • 두 객체의 같고 다름을 비교해야 하는 경우
    • 복사된 각 객체들이 독립적인 상태를 가져야 하는 경우
    • 코드에서 객체의 데이터를 여러 스레드에 걸쳐 사용할 경우
  • Class
    • 두 객체의 인스턴스 자체가 같음을 확인해야 할 때
    • 하나의 객체가 필요하고, 여러 대상에 의해 접근되고 변경이 필요한 경우

... 아니 잠깐만.. 무슨 말이지??? 싶으면 일단 Struct로 쓰자.

Struct를 Class로 바꾸는 건 쉽기 때문에 우선 Struct로 구현하고 나중에 필요시 Class로 바꾸자. 그리고 Swift가 Struct을 좋아한다. Struct로 되어 있는 부분이 압도적으로 많다.

https://developer.apple.com/swift/blog/?id=10
Swift가 거의 처음 나왔을 때 작성된 문서에도 설명되어 있다.

마지막으로 정리하자면 다음과 같다.

  • 구조체
    • 값 타입
    • 실제 데이터가 Stack 영역에 추가됨
    • 구조체 변수를 새로운 변수에 할당할 때마다 새로운 구조체 할당
    • 같은 구조체를 여러 변수에 할당한 후 값을 변경하더라도 다른 변수에 영향을 주지 않음(값 자체를 복사)
  • 클래스
    • 참조 타입
    • 실제 데이터가 Heap 영역에 추가됨
    • 상속 가능
    • 타입 캐스팅으로 런타임에서 클래스 인스턴스 타입 확인 가능
    • deinit으로 클래스 인스턴스의 메모리 할당 해제
    • 같은 클래스의 인스턴스를 여러 변수에 할당한 후 값을 변경하면 모든 변수에 영향을 줌(메모리가 복사 됨)
profile
iOS Developer

0개의 댓글