개발/Swift

Class / Struct 은 뭐가 다를까

덤벨로퍼 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"