-
Class / Struct 은 뭐가 다를까개발/Swift 2022. 2. 13. 16:40
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"
'개발 > Swift' 카테고리의 다른 글
인스턴스 메소드/ 클래식 메소드/ 스태틱 메소드 (0) 2022.03.01 RxSwift 는 무엇일까 (0) 2022.02.19 [Swift] 조이스틱 코딩테스트 프로그래머스 (0) 2022.02.13 [Swift] 섬 연결하기 프로그래머스 코딩테스트 (0) 2022.02.09 [Swift] 큰수만들기 코딩테스트 프로그래머스 (0) 2022.02.09