[swift] Class vs. Structure

2023. 2. 27. 21:33👩🏻‍💻 ios 앱개발 ( swift )

728x90

class

- 데이터와 기능을 갖고 있다.

- named

- reference타입 (structure는 value 타입)

- class 와 structure의 차이를 구별하는 게 좀 어렵다고 한다.

 

- class 는 기본 initializer를 만들어주지 않는다. -> init으로 만들어줘야함

class PersonClass {
    var firstName: String
    var lastName: String
    
    init(firstName: String, lastName: String){
        self.firstName = firstName
        self.lastName = lastName
    }
    var fullName: String{
        return "\(firstName) \(lastName)"
    }
}

 

structure class
value type reference type //reference = 주소
copy share (변수들이 한 객체를 공유하고 있는 형태)
values objects
immutable (mutating 키워드 사용해야 변경 가능) mutable (class 내용 변경가능)
fast( stack에 저장되기 때문에 빠름) slower( heap 에 저장되므로 느림)

- class는 reference 타입이다.

 

 

class - 실제 객체가 아닌 reference를 담고 있음 (structure와의 큰 차이점)

새로운 변수에는 위의 변수와 같은 reference를 갖게 됨.

 

실제 person structure를 값으로 복사해서 갖고있게됨

 

밑에있는 structure의 내용을 변경해도 위의 변수에는 아무런 영향 없음. 독립적

 

 

✍️ structure vs. class

 

변수는 stack에 저장됨

- class 인스턴스는 heap에 저장됨

- 인스턴스를 할당한 변수 자체는 stack에 저장됨

- 변수의 값은 class 인스턴스에 대한 reference를 갖고 있다.

- reference = 해당 인스턴스의 메모리주소

- structure 인스턴스는 stack에 저장됨

 

 

✍️ structure

structure는 value 타입

person1과 person2는 독립적

 

✍️ class

person4는 더이상 photato를 가리키지 않고 sompunch를 가리키게됨
다시 person3과 person4가 같은 class를 가리키게됨.

yangjae는 아무도 가리키고있지 않은 상태.

똑똑한 swift가 heap에서 삭제시켜줌!

 

 

struct에 함수를 하나 추가해보쟈

structure의 경우 자기 자신을 변경하려고 하면 mutating 키워드가 필요하다.

mutating 키워드를 사용하는 이유:  class는 기본적으로 변경 가능. structure는 그렇지 않다.

structure의 내용을 바꾸는 것 = 새로운 값을 할당하는 것

mutating의 뜻 = 새로운 값을 할당하겠다고  알려주는것

 

class 인스턴스는 변경가능하므로 mutating 키워드 필요 없다.

같은 함수를 class에 넣어보면 오류안뜸.

 

 

언제 class를 쓰고 언제 structure를 써야 좋을까??

 

3가지 전략

 

1. value vs. object

- value타입인지 object 타입인지 고민. object는 생성된 인스턴스가 고유하다.

- 두 지점사이의 거리는 value타입이 적절

- 회원의 경우는 개별 객체를 생성하여 class를 만드는 경우가 많음

 

2. speed

structure는 class보다 만들어지는 속도가 빠르다.

여러개의 인스턴스를 만들어야 하는가?  짧은 기간동안만 존재하는가?  --> structure

ex. 가속도 센서의 값들을 여러개 이용해서 짧은 시간동안 계속 계산해야하는 경우

 

긴 사이클을 사용하는 경우 & 생성되는 인스턴스 개수가 적은 경우  --> class

ex. 사용자의 구매내역처럼 사이클이 길고 인스턴스가 몇개 안되는 경우

 

*** 3. struct first

일단 sturct로 만든다.

필요하다면 class로 전환

최근 struct의 속도가 증가해서  apple에서도structure 사용을 권장한다고 함.

'👩🏻‍💻 ios 앱개발 ( swift )' 카테고리의 다른 글

[swift] Class 이니셜라이져  (1) 2023.03.01
[swift] Class 상속  (0) 2023.02.27
[swift] Closure & Collection **연습하기(reduce, filter, map)  (3) 2023.02.24
[swift] Closure  (0) 2023.02.22
[swift] Collection  (1) 2023.02.17