Swift :: 구조체와 클래스 차이 (struct VS class)
안녕하세요! 상어입니다.
오늘은 swift를 배운다 하면 필수적으로 알아야 하는 개념인
struct와 class에 대해 써볼까합니다 :-)
struct와 class는 같다면 같고.. 다르다면 참 다른 아이들인데, 공통점과 차이점을 보시면 쉽게 이해가 되실거에요!
공통점
- 프로퍼티 정의가 가능합니다.
- 메소드 정의가 가능합니다.
- initializer 정의가 가능합니다.
- extension이 가능합니다.
- protocol이 가능합니다.
- 구조체는 value type, 클래스는 reference type 입니다.
- 구조체는 상속이 불가능합니다.
- 구조체에서는 AnyObject로 타입캐스팅이 불가능합니다.
- 구조체는 생성자를 구현하지 않을 시 기본 initializer를 사용할 수 있습니다.
- 클래스는 reference counting으로 메모리 관리가 가능합니다.
struct UserData {
var name: String
var age: Int
mutating func updateUser(_ name: String, _ age: Int) {
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
candy.name = "캔디"
mutating func updateUser(_ name: String, _ age: Int) { self.name = name
self.age = age print("이름 : \(name), 나이 : \(age)") }
다음 예제는 class에 관련된 예제입니다.
이번 예제에서는 struct와 class의 차이점을 보여주기 위한 예제이기 때문에 차이점에 주모오오옥!
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 print("폰 : \(iPhoneXs.name), 색상 : \(iPhoneXs.color)") // 폰 : iPhoneXs, 색상 : grey iPhoneXs.updatePhone(name: "iPhoneX", color: "black") // 폰 : iPhoneX, 색상 : black
struct에서는 candy에 shark를 대입한 후 candy를 변형해도 shark에는 아무런 지장이 없었지요?!
그런데 class는 reference type이기 때문에 iPhoneXs를 iPhone8을 대입하고 iPhoneXs의 속성을 변형하면 iPhone8에 대한 속성도 함께 변형이 된답니다.
뿐만 아니라, class는 method안에서 property 변경이 가능하기 때문에 mutating을 붙이지 않아도 됩니다 XD
그럼 이제 가장 중요한 언제 struct를 쓰느냐!
- 관계된 간단한 값을 캡슐화 하기 위한 것일 때
- 인스터스가 참조되기 보다 복사되기를 바랄 때
- 프로퍼티가 참조되기 보다 복사되기를 바랄 때
- 프로퍼티나 메소드 등을 상속할 필요가 없을 때