모바일/Swift
클래스와 구조체의 차이를 간단하게 알아보자.
이재빵
2021. 1. 30. 21:52
728x90
클래스
Class를 쓰는 경우
- 두 object의 인스턴스 자체가 같음을 확인해야 할 때.
- 하나의 객체가 필요하고, 여러 대상에 의해 접근되고 변경이 필요한 경우.
call by reference.
클래스의 인스턴스는 힙 영역에 저장.
따라서 타입이 let일 경우에도 값의 변경이 가능.
ex)
let me = Person(health: 100)이라고 가정했을 때, me 자체의 타입은 let이지만 그 안의 내용은 Person클래스 타입의
새로 만들어진 인스턴스의 주소 값을 가지고 있는 상태입니다. (즉 힙 영역에 생성된 실제 person의 주소를 가리키고 있음)
따라서 체력을 깎는 me.damage(10)라는 메서드를 실행하면 let형태의 me의 값을 바꾸는 것이 아니라 me가 가리키는 실제 주소의 값을 바꾸는 것입니다.
구조체
Struct를 쓰는 경우
- 두 object를 "같다, 다르다"로 비교해야 하는 경우
- copy 된 각 객체들이 독립적인 상태를 가져야 하는 경우
- 코드에서 object의 데이터를 여러 스레드에 걸쳐 사용할 경우
call by value.
클래스의 인스턴스는 스택 영역에 저장.
타입이 let일 경우에 값의 변경이 불가능.
ex)
똑같이 let me = Peson(health: 100)이라고이라고 가정했을 때 구조체의 경우 자체가 값을 가지는 형태이므로 me에는 실제 값이들어가 있고현재 let형태이기 때문에 변경이 불가합니다.
스택 영역과 힙 영역
스택 영역의 경우 사용할 수 있는 메모리 크기가 작고 한정적.
힙 영역은 많은 메모리 크기를 가질 수 있음.
but, 스택의 경우 가비지 컬렉션에 의해 관리되지 않기 때문에 성능상 많은 장점이 있음.