Menu
Menu
Posts List
  1. Swift:
    1. 공통점
    2. 핵심 차이점
    3. mutating 키워드란?
    4. final class란?
    5. Struct를 사용하는 경우
    6. Class를 사용하는 경우
    7. 요약

Struct, Class

Swift:

struct vs class 차이점 정리

두 타입은 문법적으로 유사하지만, 복사 방식, 메모리 관리, 상속, 동시성 등의 차이로 사용 목적이 달라짐


공통점

  • 프로퍼티, 메서드, 초기화 가능
  • 서브스크립트, 확장(Extension), 프로토콜 채택 가능
  • Codable, Equatable 등 프로토콜 사용 가능

핵심 차이점

항목 struct class
메모리 타입 값 타입 (Value Type) 참조 타입 (Reference Type)
복사 방식 복사본 생성 (deep copy) 참조 공유 (shallow copy)
상속 ❌ 불가능 ✅ 가능
참조 비교 ❌ 불가능 === 연산자 사용 가능
ARC 적용 ❌ 없음 ✅ 있음 (메모리 자동 관리)
mutating 필요 여부 ✅ 내부 프로퍼티 수정 시 필요 ❌ 필요 없음
스레드 안전성 ✅ 상대적으로 안전 (복사본 독립적) ❌ 상태 공유 시 충돌 가능

mutating 키워드란?

  • structenum은 값 타입이기 때문에 내부 프로퍼티를 수정하려면 mutating 키워드가 필요

    1
    2
    3
    4
    5
    6
    7
    struct Point {
    var x: Int

    mutating func moveBy(dx: Int) {
    self.x += dx
    }
    }
  • mutating이 없으면 컴파일 오류 발생

  • class에서는 참조 타입이므로 필요 없음


final class란?

  • final 키워드를 사용하면 상속을 방지할 수 있다.

  • 오버라이딩도 불가능하게 만들어서 안정성과 성능 최적화에 도움된다고한다.

    1
    2
    3
    4
    5
    final class UserManager {
    func login() {
    print("Logging in...")
    }
    }
  • UserManager를 상속하려고 하면 컴파일 오류 발생


Struct를 사용하는 경우

사용 조건 이유
상태 불변이 바람직할 때 값 복사로 인해 외부 영향을 받지 않음
SwiftUI 등 값 기반 UI View가 자주 생성되며 불변성 유지 필요
간단한 데이터 모델링 예: 좌표, 날짜, Rect 등

Class를 사용하는 경우

사용 조건 이유
참조 공유가 필요할 때 같은 인스턴스를 여러 곳에서 접근해야 함
상속 구조가 필요할 때 UIView, NSObject 기반 구조 등
복잡한 상태 관리 필요 한 곳에서 상태 추적 및 관리 용이

요약

항목 struct class
타입 값 타입 참조 타입
복사 복사본 참조 공유
상속 ✅ 가능
ARC ❌ 없음 ✅ 적용됨
내부 수정 제한 mutating 필요 자유롭게 수정 가능
상속 방지 사용 불가 (기본 불가능) final로 명시적 차단 가능

Swift에서는 구조적으로 struct를 기본으로 선택하고, 참조가 필요하거나, 상속이 필요한 경우에만 class를 사용하는 것이 권장되는 방식이라고 한다. 다행히 struct를 선호해서 많이 사용하고는 있었지만, 사용시 명확히 알고 사용하기!