⭐️ 가장 큰 차이는 메모리 저장 방식의 차이 ⭐️
1) 구조체
값형식(Value Type)
인스턴스 데이터를 모두 스택(Stack)에 저장
(복사시) 값을 전달할때마다 복사본을 생성 (다른 메모리 공간 생성)
복사한다는 의미
struct Animal {
var name = "동물"
}
var p = Animal()
var p2 = p
2) 클래스
참조형식(Reference Type)
인스턴스 데이터는 힙(Heap)에 저장, 해당 힙을 가르키는 변수는 스택에 저장
메모리 주소값이 힙(Heap)을 가르킴
(복사시) 값을 전달하는 것이 아니고, 저장된 주소를 전달
힙(Heap)의 공간에 저장, ARC시스템을 통해 메모리 관리(주의해야함)
주의점 - (참고) 클래스 내부에는 직접 메서드(함수) 실행문이 올 수 없다. ⭐️
struct Bird {
func fly() {
print("날아갑니다.")
}
fly() // 클래스내부에서는 실행문이 올수없다(오류발생)
func sit() { // 매서드 내부에서 실행은 가능(선언이기때문에)
fly()
}
}
클래스를 사용하기 위해서는 저장속성을 모두 초기화 해주어야하는데 기본 저장속성에 기본값을 넣거나 생성자를 통해 인스턴스생성시 초기값을 설정되도록 해주어야한다
그렇지 않으면 오류가 발생한다(생성자를 초기화 하라는)
class Dog {
var name: String? // var name: String? = nil
var weight: Int 옵셔널은 기본값이 nil로 설정됨
init(weight: Int) {
self.weight = weight
}
생성자에서 기본값을 넣어주면 인스턴스생성시 여러가지 선택지가 나옴
init(name: String = "안녕", weight: Int) {
self.name = name
self.weight = weight
}
생성시
Dog(weight: )
Dog(name: , weight: )이런 생성자들이 나옴
func sit() {
print("\(name) 앉았습니다.")
}
func layDown() {
print("\(name) 누웠습니다.")
}
}
👍🍚