What is Object Oriented Programming for Swift | Swift Basics #8
How to use Structs in Swift | Swift Basics #9
int, double, float가 숫자의 type인 것처럼 Stack과 Heap은 모두 객체가 저장되는 저장소이다.
클래스에서 정의한 것을 토대로 메모리(실제 저장공간)에 할당된 것으로 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며, 변수, 자료 구조, 함수 또는 메소드가 될 수 있다. 객체 (컴퓨터 과학)
객체의 종류에는 String, Bool, Int, Struct, Enum과 Functions, Class, Actors가 있다.
Stack과 Heap 중에서 어디에 저장할 것인지는 이미 개발환경에서 정의되어 있는 규칙을 따른다.
Stack: String, Bool, Int, Struct, Enum
Heap: Functions, Class, Actors
Stack과 Heap의 차이는 무엇일까?
하나의 프로그램을 돌리기 위해서는 하나의 thread가 필요하다. thread는 engine과도 같다.
thread는 각각 Stack이 하나씩 있어 자기만의 Stack을 사용한다. 하지만 Heap은 모든 thread가 하나의 Heap을 사용하게 된다.
여기서 발생하는 Stack과 Heap의 차이는 Stack은 굉장히 일처리가 빠르지만 Heap은 느리다는 것이다. 그렇다면 모두 Stack을 사용하면 되지 않을까라는 생각이 들 수도 있지만 Heap을 써야만 하는 객체들이 필요했고 그것이 무엇인지는 이번에 다루지 않을 것이다.
또한, Stack에 저장되는 객체들은 모두 Value type이다. 만약 Value type의 객체를 수정하고 싶다면 기존의 객체를 수정하는 것이 아닌 복사본을 새로 만들어 수정된 복사본을 Stack에 하나 더 저장하게 된다.
반면 Heap에 저장되는 객체들은 모두 Reference type이다. 만약 Reference type의 객체를 수정하게 되면 실제로 그 객체가 변형되게 된다.
이때 객체가 저장되어 있는 reference는 pointer라고도 하는데 그 이유는 객체를 직접 가리키고 있기 때문이다.
Struct는 Stack에 저장되는 객체로 Value type이다.
Struct Model1{
let name: String
let isRich: Bool
}
var user1:Model1 = Model1(name: "Ha", isRich:false)
func markUserAsRich(){
user1 = Model1(name:self.name, isRich:true)
}
user1을 수정하고 싶으면 새롭게 Model1을 만들어서 수정해줘야 함
Struct Model2{
let name: String
var isRich: Bool
}
var user2:Model2 = Model2(name: "Ha", isRich:false)
func markUserAsRich(){
user2 = Model2(name:self.name, isRich:true)
}
user2를 수정하고 싶으면 새롭게 Model2를 만들 필요 없이 직접 접근해서 수정 가능. 하지만 이것 역시도 새롭게 user2를 만들어서 수정된 것처럼 보이게 한다.
Struct Model3{
let name: String
let isRich: Bool
func markUserAsRich(){
Model3(name: name, isRich: true)
}
}
var user3:Model3 = Model3(name: "Ha", isRich:false)
user3.markUserAsRich()
user3를 수정하면 역시나 새롭게 Model3를 만들어 줘야 한다.
Struct Model4{
let name: String
var isRich: Bool
mutating func markUserAsRich(){
isRich = true
}
}
var user4:Model4 = Model4(name: "Ha", isRich:false)
user4.markUserAsRich()
user4를 수정하는 것도 가능하다. 이때 mutating을 function 앞에 붙여야 초기 Model4를 수정하지 않고 새로운 user4 수정본을 만들 수 있다.