참조 타입 VS 값 타입
class는 참조 타입이고 structure, enumeration은 값 타입이다.
클래스의 object를 변수에 할당하면 그들은 모두 같은 인스턴스를 가르킨다. 따라서 하나가 수정되면 모두 수정된다.
class Cat { var name:String init(name:String) { self.name = name } } var cat1 = Cat(name: "Kitty") var cat2 = cat1 cat1.name = "Oscar" // Both cats are the same print("cat1 name : \(cat1.name), cat2 name : \(cat2.name)") // cat1 name : Oscar, cat2 name : Oscar
struct Cat { var name:String } var cat1 = Cat(name: "Kitty") var cat2 = cat1 cat1.name = "Oscar" print("cat1 name : \(cat1.name), cat2 name : \(cat2.name)") //cat1 name : Oscar, cat2 name : Kitty
Mutability(변덕)
struct가 let을 사용해서 상수로 만들어지면 instance는 변경할 수 없다. 즉 proterty를 변경할 수 없다.
struct Cat { var name:String } let cat1 = Cat(name: "Kitty") cat1.name = "Oscar" // error: cannot assign to property
class는 상수로 선언 되면 참조만 변경할 수 없고 property는 변경할 수 있다
class Cat { var name:String? } let cat1 = Cat() cat1.name = "Oscar" // Working fine
enum, strut는 변수로 선언 됐고 method를 통해서 property를 변경하려면 method앞에 mutating 키워드를 붙여 인스턴스 내부의 값을 변경하는것을 명시 해야합니다.
struct Cat { private var vaccinated:Bool init() { self.init() } // Will not work without mutating keyword mutating func vaccinate() { self.vaccinated = true } } var cat1 = Cat() cat1.vaccinate()
deinitializer(소멸자)
- init(생성자)는 값 타입, 참조 타입 모두 갖지만, deinit(소멸자)는 값 타입에만 존재합니다.
- class의 인스턴스는 참조 타입이므로 더 이상 참조할 필요가 없을 때 메모리에서 해제되고 소멸 직전에 deinit method 호출됩니다.
Generated init
- struct만 Generated init method를 갖습니다.
struct Cat { var name:String var age:Int } let cat1 = Cat(name: "Lucy", age: 3)
Inheritance(상속)
- class 에서만 가능하다.
struct Pet { var name:String } struct Cat : Pet { } // ERROR : Inheritance from non-protocol type 'Pet'
Stored property(저장 프로퍼티)
- enum은 저장 프로퍼티를 갖을수 없다.
enum Pet { var name:String // error: enums must not contain stored properties }
Struct VS Class VS Enum
bromp • 2023년 1월 2일 PM 02:45 • 30 • 0
댓글
첫 번째 댓글을 남겨보세요 :)