Class / Struct 은 뭐가 다를까
Class 와 Struct는 어떤 차이점들이 있을까?
나는 언제 어느 상황에서 Class Struct를 알맞게 골라 써야할까?
Struct도 class 처럼 프로퍼티를 가질수있으며 메소드를 구현할수있다.
내부 프로퍼티 수정도 가능하다 ( mutating 함수를 쓰면된다. )
Extends도 사용할수있다.
대표적인 차이점은 값타입vs 참조 타입이다.
Class는 참조타입 Struct,Enum은 값타입이다.
참조타입의 경우 같은 객체를 두 변수에 담은경우
한변수를 변경시킬때 둘다 변경된다는 특징이 있다.
또 Struct 에서는 상속이 불가능 하다는 특징이있다.
view와 관련된것들은 UIViewController UIView 등등 을 상속받아야 하므로 제외하고
다른 부분에서 구현하려는게 굳이 상속이 필요없다면
우선 Struct를 사용해보는게 좋은 방법이될것이다.
이외에 또 참고할만한 내용들을 정리해봤다.
class Person{
var name:String
}
var person1 = Person()
var person2 = person1
person1.name = "Mike" // person2 name will be changed
참조타입 값타입 얘기할때 Struct는 값 타입이라고했다.
하지만 여기서 고쳐야할점은 Struct는 값타입일수도 참조 타입일수도 있다는점이다.
Struct 내부에 참조타입 변수가 있을수있고
16byte 이상의 크기가 되면 Struct도 힙에저장되는 참조타입이 될수있다.
class Person{
var name: String
init(name:String){
self.name = name
}
}
struct Employee{
var person : Person
}
let Person = Person(name:"Mike")
var employee1 = Employee(person:Person)
var employee2 = Employee(person:Person)
employee2.person.name = "James"
위의 경우를 살펴보자
Struct 안에 Class 타입(참조타입) 이 들어가있다.
employee2 의 person.name 을 변경했다면 employee2만 변경될거라 생각했다.
employee1 ,2 는 다른 객체라고 판단되기 때문이다.
하지만 여기서 생각보다 다른 결과가 발생했다.
employee1 의 person.name도 변경된다.
이유는 결국 같은 Person이라는 참조타입객체를 사용하기 때문이다.
employee2.person 이 바뀌면 employee1.person도 바뀐다.
또 다른 특징으로 let 인스턴스 값 변경에 대한 차이점이 있다.
Struct는 let인스턴스(불변) 로 생성되었다면 프로퍼티가 var 이어도 값을 바꿀수 없다.
하지만 class 에서는 let 인스턴스에서도 var 프로퍼티를 수정할수있다.
class Person{
var name: String = "Mike"
init(name:String){
self.name = name
}
}
let person = Person()
person.name = "Peter"