프로그래밍iOS 개발자

Swift에서 구조체는 어떻게 작동하며, 저장 및 동작 수준에서 클래스 객체와 어떤 차이가 있으며, 왜 구조체가 데이터 모델링에 더 자주 사용되는가?

Hintsage AI 어시스턴트로 면접 통과

답변.

질문의 역사

Swift는 처음부터 value types인 구조체(struct)에 중점을 두었습니다. Objective-C처럼 모든 것이 객체(클래스)인 것과 달리, Swift는 간단한 모델, 데이터 및 작은 비즈니스 객체를 위해 구조체 사용을 장려합니다.

문제

많은 개발자들, 특히 다른 객체 지향 언어에 대한 경험이 있는 사람들은 모든 것에 클래스 사용을 잘못 적용합니다. 이는 메모리 문제(reference cycles), 객체 전달 시 예상치 못한 변경 및 thread safety 문제를 초래합니다. 클래스는 reference types이기 때문입니다.

해결책

Swift의 구조체는 value types로, 객체를 할당하거나 함수에 전달할 때 복사됩니다. 반면 클래스(reference types)는 참조를 전달합니다. 따라서 구조체는 복잡한 생명 주기 및 상속 논리가 필요 없는 모델에 더 적합합니다.

코드 예:

struct Point { var x: Int var y: Int } var p1 = Point(x: 10, y: 20) var p2 = p1 p2.x = 30 // p1.x는 여전히 10입니다.

주요 특징:

  • 구조체 복사는 항상 값의 복사를 발생시킵니다(value semantics)
  • 메모리 누수 가능성이 적습니다.
  • 상속을 지원하지 않으며, 오직 프로토콜만 지원합니다.

의도된 함정 질문.

구조체에 상속자가 있을 수 있나요?

아니요, Swift의 구조체는 상속을 지원하지 않습니다. 모든 동작 확장은 오직 프로토콜과 extension을 통해서만 가능합니다.

구조체는 함수로 전달될 때 항상 복사되나요?

현실적으로 Swift는 Copy-On-Write 최적화를 사용합니다. 구조체를 변경하지 않으면 복사되지 않으며, 변경 시에만 복사가 이루어집니다. 이는 표준 컬렉션 및 복잡한 구조체에도 해당됩니다.

var arr1 = [1, 2, 3] var arr2 = arr1 arr2.append(4) // 여기서만 복사가 발생합니다.

어떤 경우에 구조체를 사용할 수 없나요?

  • 개체성(identity)이 필요할 경우 (참조에 의한 비교)
  • 상속자가 필요한 경우
  • 단일 인스턴스(singleton)가 필요한 경우

일반적인 오류 및 안티 패턴

  • 간단한 모델 및 데이터 구조에 클래스를 사용하는 것
  • 구조체 내부에 참조 타입을 저장하고 복사하려는 시도
  • 구조체를 통해 외부 객체를 변경하려고 참조를 전달할 것이라는 기대

실제 사례

부정적 사례

동일한 유형의 데이터를 저장하기 위해 클래스를 사용했습니다 (예: 지도 위의 점들). 결과적으로 잦은 메모리 접근으로 인해 성능 저하, 메모리 관리의 복잡성 및 혼란스러운 참조로 인한 버그가 발생했습니다.

장점:

  • AnyObject로 배열에 저장 가능

단점:

  • 낮은 성능
  • thread safety 문제
  • 메모리 관리 문제

긍정적 사례

안전하게 복사되고 누수 없이 여분의 복잡성이 없는 데이터 모델을 위해 구조체를 사용했습니다.

장점:

  • 복사의 간단함과 안전성
  • reference cycles이 없습니다.
  • 테스트가 용이합니다.

단점:

  • 상속을 요구하는 패턴을 구현할 수 없습니다.
  • 구조체 내부가 참조 타입인 경우, 복사 및 변경 시 예상치 못한 문제가 발생할 수 있습니다.