* 정의
클래스와 구조체는 새로운 형식을 선언하는 필수요소로써, 사용자가 속성과 메소드를 사용하여 형식을 구현할 때 사용하는 사용자 정의 타입이다. 그러나 공장에서 설계도를 만들고 상품을 찍어내지 못하면 아무런 의미가 없는 것 처럼, 클래스 및 구조체(설계도)를 정의하였다면, 인스턴스(상품)를 생성하는 과정을 거쳐야 새로운 메모리공간이 만들어지며, 사용자가 정의한 형식이 실체화된다.
struct PointValue {
var x = 0.0
var y = 0.0
func calcArea() -> Double {
return x * y
}
}
let p = PointValue()
이렇게 인스턴스를 만들어야 메모리공간이 만들어지며 상품이 '실체화' 된다. 이것을 '초기화' 라고 한다.
let p = PointValue()
만약 인스턴스를 변수로 선언한다면 값을 변경해주는 것도 가능하다.
var p = PointValue()
p.x = 12
p.y = 34
p.calcArea()
구조체 와 클래스는 프로퍼티와 메소드, 생성자를 정의하는 사용자 정의 형식이라는 점에서 공통점을 가지고 있다. 그러나 둘은 엄연히 다른타입이다. 그 차이는 메모리 공간 처리과정에 있다.
구조체는 인스턴스를 생성할때 '스택' 이라고 불리는 메모리공간에 저장한다. 그리고 값을 전달할때마다 복사본을 생성하는 값 형식이다. 그러나 클래스는 '힙' 이라고 불리는 공간에 값을 저장하며 '스택' 에는 '힙' 에 저장되어 있는 값의 주소를 저장한다. 그래서 클래스는 값을 전달할때 복사본을 생성하지 않고 주소를 공유하는 참조형식이 된다.
class Position {
var x: Double
var y: Double
init(value: Double, value2:Double) {
x = value
y = value2
}
}
let p2 = Position(value: 3, value2: 4)
p2.x = 100
print(p2.x)
클래스는 참조 형식이기 때문에 인스턴스를 ' let '으로 선언하면 주소가 저장이 되어 있는 '스택' 을 잠군다. 그래서 값을 변경하는 것은 얼마든지 가능하다(속성이 변수라면). 그러나 해당 인스턴스의 주소는 항상 고정이 되어 있기 때문에 인스턴스 속성에 변경된 값을 할당하면 원본 값도 변경된다.