ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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"
    
    

     

     

    댓글

Designed by Tistory.