# [Swift] Struct or Class
Inheritance is reserved for classes and this is one of the biggest differences. Only use classes when you need inheritance or when you should works with objective-C code.
# 공통점
- 프로퍼티 정의가 가능합니다.
- 메소드 정의가 가능합니다.
- initializer 정의가 가능합니다.
- extension이 가능합니다.
- protocol이 가능합니다.
# 차이점
- 구조체는 value type, 클래스는 reference type 입니다.
- 구조체는 상속이 불가능합니다.
- 구조체에서는 AnyObject로 타입캐스팅이 불가능합니다.
- 구조체는 생성자를 구현하지 않을 시 기본 initializer를 사용할 수 있습니다.
- 클래스는 reference counting으로 메모리 관리가 가능합니다.
# Structs
- Simpler
- Faster
- Deep copies
- True immutability
- No memory leaks
- Threadsafe
struct UserData {
var name: String
var age: Int
mutating func updateUser(_ name: String, _ age: Int) {
// 구조체는 value type이기 때문에 method 안에 property 변경이 불가능하다.
// 그래서 mutating을 붙이면 해당 객체가 다시 생선되면서 변경이 가능하게 된다.
self.name = name
self.age = age
print("이름 : \(name), 나이 : \(age)")
}
}
var shark = UserData(name: "상어", age: 16)
print("이름 : \(shark.name), 나이 : \(shark.age)")
// 이름 : 상어, 나이 : 16
var candy = shark
candy.name = "캔디"
candy.age = 30
print("이름 : \(shark.name), 나이 : \(shark.age)")
// 이름 : 상어, 나이 : 16
print("이름 : \(candy.name), 나이 : \(candy.age)")
// 이름 : 캔디, 나이 : 30
shark.updateUser("띠용", 33)
// 이름 : 띠용, 나이 : 33
# Classes
- Has Inheritance
- Works with objective-C code
class Phone {
var name: String
var color: String
// struct와 달리 class는 이니셜라이즈를 지정해야합니다.
init(name: String, color: String) {
self.name = name
self.color = color
}
func updatePhone(name: String, color: String) {
self.name = name
self.color = color
print("폰 : \(name), 색상 : \(color)")
}
}
let iPhone8 = Phone(name: "iPhone8", color: "red")
print("폰 : \(iPhone8.name), 색상 : \(iPhone8.color)")
// 폰 : iPhone8, 색상 : red
var iPhoneXs = iPhone8
iPhoneXs.name = "iPhoneXs"
iPhoneXs.color = "grey"
print("폰 : \(iPhone8.name), 색상 : \(iPhone8.color)")
// 폰 : iPhoneXs, 색상 : grey
//Reference Type은 이렇게 된다
print("폰 : \(iPhoneXs.name), 색상 : \(iPhoneXs.color)")
// 폰 : iPhoneXs, 색상 : grey
iPhoneXs.updatePhone(name: "iPhoneX", color: "black")
// 폰 : iPhoneX, 색상 : black
# References
https://sujinnaljin.medium.com/swift-class-func-vs-static-func-7e6feb264147 (opens new window)