Swift랑 친해지기/Swift문법정리

[Swift] 클래스 vs 구조체 (class vs struct)

데브킹덕 2022. 9. 19. 16:45

공통점

  • 값을 저장할 프로퍼티 선언할 수 있음
  • 함수적 기능을 하는 메서드를 선언할 수 있음
  • extension을 사용하여 기능 확장할 수 있음
  • Protocol을 채택하여 기능을 설정할 수 있음
  • .을 이용해 내부값에 접근
  • 생성자를 사용해 초기 상태 설정

차이점

Struct

Class

클래스 구조체
참조타입 값타입
같은 클래스 인스턴스에 여러개의 변수를 할당하게 되면 하나의 인스턴스를 가리키는 메모리 주소만 복사되어서 같은 클래스의 인스턴스를 여러개 할당한 뒤 값을 변경시키면 모든변수에 영향을 줌 같은 구조체를 여러개의 변수에 할당한 뒤 값을 변경시키더라도 다른 변수에 영향을 주지 않음(값 자체를 복사)

상속이 가능 상속 불가능
타입 캐스팅을 통해 런타임에서 클래스 인스턴스의 타입을 확인 할 수 있음 변수를 할당하면 스택영역에 값이 저장되기 때문에 ARC로 메모리 관리가 안됨
deinit을 사용하여 클래스 인스턴스의 메모리 할당을 해제할 수 있음 구조체 변수를 새로운 변수에 할당할 때 마다 새로운 구조체가 할당됨
-메모리 스택영역에 포인터
 즉 인스턴스의 메모리주소만 할당됨

-실제 데이터는 힙영역에 할당됨
 때문에 ARC로 메모리를 관리

-참조가 어디서 어떻게 될지 모르기에힙 영역에 할당됨
언제 생기고, 사라질지  컴파일 단계에서 알 수 있기 때문에 메모리의 stack공간에 할당됨
-Heap영역에는 컴파일 단계에서 생성과 해제를 알 수 없는 참조 타입   의객체가 할당됨

-메모리의 할당과 해제가 하나의 명령어로 처리되지 않음

-스레드가 공유하는 메모리 공간임


-stack LIFO(Last In First Out)형태의 자료구조
 가장 마지막에 들어가 객체가 가장 먼저 나오는 구조 

-자료구조 특성상 하나의 명령어로 메모리를 할당, 해제(pop,push)할 수 있음




같은 클래스 인스턴스를 여러 개의 변수에 할당한 뒤 값을 변경시키면 모든 변수에 영향을 줌  -단순한 데이터 값을 보유할때 구조체가 좋음 
-메모리의 스택은 크지 않기 떄문에 작은 값을 갖는 데이터를 처리할때  구조체 사용
Objective-C와 상호 운용성을 원할떄 클래스 사용 값타입
1. Copy - on - assignment
값타입을 다른 변수에 할당하면 새로운  메모리 공간에 같은 값을 복사

2.Copy - on - write
일단 메모리를 할당하지 않고 같은 곳을 바라봄
메모리 최적화를 위해 해당값을  변경할떄 실제로 메모리에 값을 복사하고  값을 변경함
Int,Double,String,Array,Set,Dictionary에서만 사용