데이터 모델을 구조체를 쓸까 클래스를 쓸까를 고민될 때

임혜정·2024년 7월 7일
0
post-thumbnail
post-custom-banner

두번째 팀 과제에서 모델을 생성해야했다. 데이터가 적었고 접근하는 로직이 많지 않을거란 생각으로 구조체를 사용하여 모델을 만들었으나 count 세줘야할 변수(var)가 필요하게 되었고 구조체안에서 그것이 계속 변경되는 것이 몬가..몬가.. 부자연스러운 느낌이 들었다.

struct CoffeeList {
    let imageName: String
    let menuName: String
    let menuPrice: Int
    let type: String
    var count: Int = 0
}

그리고 이런 케이스에 대해서 조금 더 찾아보게 되었다.


성능

  • 구조체는 값 타입이라서 성능이 더 좋을 수 있다. 특히, 작은 데이터 모델이나 변하지 않는 데이터를 다룰 때 유리하다.
  • 클래스는 참조 타입이므로 메모리 접근 비용이 발생할 수 있다. 하지만, 큰 데이터 모델이나 객체 간의 관계를 다룰 때 더 유리하다.

동일성 비교

  • 구조체는 값 타입이므로 기본적으로 값 비교가 이루어진다.
  • 클래스는 참조 타입이므로 기본적으로 참조 비교가 이루어진다. 동일성을 비교하기 위해서는 Equatable 프로토콜을 구현해야 한다.

종합하여 생각하자면 함수에 전달될때마다 복사되기 때문에 count값이 일관되게 유지되지 않을 수 있는 문제가 있을 수 있었고, 이것저것 기능로직이 생겨나감에 따라 여러 스레드에서 이 구조체 인스턴스에 접근하게 되었다.

이런 상황에서 해결방안은 구조체를 클래스로 바꾸거나 동기화를 해줄 수 있는 구현이 필요했다. 나는 클래스로 바꿔야하나라고 생각했지만 팀원분이 delegate 패턴을 적용시켜오셨다...

delegate패턴으로서 객체간의 통신이 가능 하게 하는데 사용자 클릭으로 amount값이 변경될 때마다 그것을 viewController에 알려서 업데이트하는 것이다

이런 비슷한 경우에 싱글톤 패턴을 적용해서 프로젝트 전역에서 인스턴스를 공유하므로 데이터 값이 뒤틀릴 수 있는 상황을 방지할 수도 있다.


모델을 만들때 구조체와 클래스를 선택하는 방법

구조체를 사용하는 경우

  • 데이터가 주로 읽기 전용이거나 불변성 유지가 중요한 경우
  • 값 비교가 필요한 경우
  • 상속이 필요하지 않은 경우

클래스를 사용하는 경우

  • 데이터가 변경 가능하고, 여러 곳에서 참조해야 하는 경우
  • 상속이 필요한 경우.
  • 참조 비교가 필요한 경우

프로젝트 필요 사항에 따라 적절한 선택을 해야하고 많이 만들어보면서 뭐가 적합할지 느낌이 오게 될것이다. 함께 사용하여 각자의 장점을 활용하는 것도 좋을듯하다

profile
오늘 배운걸 까먹었을 미래의 나에게..⭐️
post-custom-banner

0개의 댓글