본문 바로가기
iOS와 그 외/Swift

[Swift] 데이터모델링 Struct와 Class중 어떤 걸 써야할까요 +_+ ?

by lody.park 2024. 8. 4.

안녕하세요 로디입니다 🙂

 

오늘 커뮤니티에서 어떤 분이 Struct와 Class중에 데이터 모델을 어떤 타입으로 정의해야하는지,
어떤 케이스에 따라 타입을 구분해서 사용하는지 물으시더라구요.

Struct는 값 타입이구, Class는 참조 타입이기 때문에 참조 값을 공유할 필요가 없으면 Struct를 쓰는걸 권장함.! 이라고 말씀드리니

그러면 Class로 모델을 정의하는 경우가 보통 언제 있는지 설명해달라고 하시는데,,, 어라라 +_+ 

설명하려니깐 명확하게 구분지어 말씀을 못드리겠더라구요.

 

저도 헤매던 찰나에 다른 분이 공식문서 링크를 따악 공유해주셔서 저도 오늘 문서에서 적힌 내용을 정리해보려고 합니다.

그러면 비교 하러가볼까요 ~~? (공식문서는 여기에서 확인할 수 있습니다!)

 


🤔  Struct와 Class 선택 기준이 뭘까?

1️⃣ 기본적으로 Struct 사용하기

 Swift에서 Struct는 단순 데이터 저장 이상의 기능을 제공합니다. Struct는 저장 프로퍼티, 계산 프로퍼티, 메서드를 포함할 수 있으며, 프로토콜을 채택하여 기본 구현을 통해 행동을 공유할 수 있습니다. Swift 표준 라이브러리와 Foundation에서도 자주 사용되는 숫자, 문자열, 배열, 딕셔너리 등의 타입이 모두 Struct로 구현되어 있습니다.

Struct를 사용하면 코드의 일부분만 고려해도 변경사항이 명확하게 드러나기 때문에 코드의 가독성과 유지보수성이 높아집니다. Struct는 값 타입이므로 로컬 변경사항이 앱의 다른 부분에 영향을 미치지 않으며, 명시적으로 변경을 전달해야만 다른 곳에서 그 변경사항을 알 수 있습니다.

 

2️⃣ Objective-C 상호운용성 필요 시 Class 사용

 Objective-C API와 데이터를 처리하거나, Objective-C 프레임워크에서 정의된 클래스 계층 구조에 맞춰야 할 때는 Class를 사용해야 해요. 많은 Objective-C 프레임워크가 서브클래싱을 요구하는 클래스를 노출하기 때문에 이러한 경우에는 Class가 필요합니다.

 

3️⃣ 데이터의 정체성을 제어할 필요가 있을 때 Class 사용

 Class는 참조 타입으로, Swift에서 클래스 인스턴스는 각자의 고유한 정체성을 갖습니다. 동일한 속성 값을 갖는 두 개의 클래스 인스턴스도 서로 다른 것으로 간주됩니다. 따라서 앱 전체에서 인스턴스를 공유할 때, 해당 인스턴스에 대한 변경사항이 모든 참조 지점에서 즉시 반영됩니다. 파일 핸들, 네트워크 연결, 공유 하드웨어 인터페이스와 같은 경우에 Class를 사용하는 것이 적합합니다.

예를 들어, 로컬 데이터베이스 연결을 나타내는 타입이 있다면, 데이터베이스에 대한 접근을 관리하는 코드는 데이터베이스 상태를 완전히 제어해야 합니다. 이러한 경우에는 Class를 사용하는 것이 적합하지만, 공유된 데이터베이스 객체에 대한 접근을 제한해야 합니다.

 

4️⃣ 정체성을 제어하지 않는 데이터 모델링 시 Struct 사용

 정체성이 외부 엔티티에 의해 관리되는 데이터를 모델링할 때는 Struct를 사용합니다. 예를 들어, 원격 데이터베이스를 조회하는 앱에서는 인스턴스의 정체성이 외부 엔티티에 의해 관리되며, identifier를 통해 전달됩니다. 이러한 경우에는 Struct를 사용하여 레코드를 모델링할 수 있습니다.

struct PenPalRecord {
    let myID: Int
    var myNickname: String
    var recommendedPenPalID: Int
}

var myRecord = try JSONDecoder().decode(PenPalRecord.self, from: jsonResponse)

 

위 예시처럼, PenPalRecord 구조체는 데이터베이스 레코드의 정체성을 제어하지 않기 때문에, 로컬에서 변경하더라도 데이터베이스의 값을 변경할 위험이 없습니다.

 

5️⃣ 상속과 행동 공유를 위해 Struct와 Protocol 사용

 Struct와 Protocol을 통해 상속과 비슷한 개념을 모델링할 수 있습니다. Protocol 상속을 통해 클래스, 구조체, 열거형이 상속 계층에 참여할 수 있으며, Class 상속은 클래스 간에만 호환됩니다. 데이터 모델링 시에는 우선 프로토콜 상속을 사용해보고, 그 프로토콜을 Struct에서 채택하는 방식을 권장합니다.

이렇게 Struct와 Class를 상황에 맞게 적절히 사용하면, 앱의 데이터 모델링과 동작 구현이 더욱 명확하고 효율적으로 이루어질 수 있습니다. 다음에 Struct와 Class를 선택할 때는 위의 가이드를 참고해보세요!

 

💡 결론

정리하자면, 기본적으로는 Struct를 사용하되, Objective-C와의 상호운용성이 필요하거나 데이터의 정체성을 제어해야 하는 경우에만 Class를 사용하는 것이 좋다.!

'iOS와 그 외 > Swift' 카테고리의 다른 글

[Swift] actor도 final 키워드로 최적화 할 수 있을까?  (0) 2024.08.24
[Swift] class func vs static func  (0) 2024.07.31
[Swift] inout 매개변수  (0) 2024.07.19
[Swift] Method Dispatch 란  (0) 2024.07.15
[Swift] LazySequence  (0) 2024.07.08