Class vs Struct 차이점

jeongmuyamette·2025년 2월 14일

TIL

목록 보기
45/72
post-thumbnail

Class vs Struct 차이점

1. 상속 (Inheritance)

  • Class: 상속 가능 ✅

    class Animal {
        var name: String
        
        init(name: String) {
            self.name = name
        }
    }
    
    class Dog: Animal {
        func bark() {
            print("멍멍!")
        }
    }
  • Struct: 상속 불가능 ❌

    • 단, protocol은 채택 가능

2. 메모리 저장 방식

  • Class: 참조 타입 (Reference Type)

    • Heap 메모리에 저장
    • 인스턴스가 참조로 전달됨
    class Person {
        var name: String
        init(name: String) {
            self.name = name
        }
    }
    
    let person1 = Person(name: "Kim")
    let person2 = person1  // 참조가 복사됨
    person2.name = "Lee"
    print(person1.name)    // "Lee" 출력
  • Struct: 값 타입 (Value Type)

    • Stack 메모리에 저장
    • 인스턴스가 복사되어 전달됨
    struct Point {
        var x: Int
        var y: Int
    }
    
    var point1 = Point(x: 10, y: 20)
    var point2 = point1  // 값이 복사됨
    point2.x = 30
    print(point1.x)      // 10 출력 (원본 유지)

3. 초기화 (Initialization)

  • Class:

    • 모든 저장 프로퍼티를 초기화해야 함
    • deinit 가능 (메모리에서 해제될 때 호출)
    • 사용자 정의 이니셜라이저를 만들면 기본 이니셜라이저 제공되지 않음
  • Struct:

    • 기본 멤버와이즈 이니셜라이저 자동 제공
    • deinit 불가능
    • 값 타입이므로 인스턴스 메서드 내에서 프로퍼티 수정 시 mutating 키워드 필요

4. 식별 연산자

  • Class:

    • === 와 !== 연산자로 인스턴스 식별 가능 (같은 인스턴스인지 확인)
    let person3 = Person(name: "Park")
    let person4 = person3
    print(person3 === person4)  // true
  • Struct:

    • == 연산자로만 값 비교 가능 (Equatable 프로토콜 준수 필요)

5. 사용 권장 사례

Class 사용이 적합한 경우:

  • 상속이 필요한 경우
  • 참조 타입이 필요한 경우
  • 인스턴스의 수명 주기 관리가 필요한 경우
  • 예시: UIViewController, NSObject 등

Struct 사용이 적합한 경우:

  • 간단한 데이터 타입을 캡슐화할 때
  • 값의 복사가 합리적일 때
  • 프로퍼티가 값 타입이며 참조보다 복사가 적합할 때
  • 예시: Point, Size, Rectangle 등

6. 성능 측면

  • Struct:
    • Stack에 저장되어 더 빠른 메모리 접근
    • 값 복사로 인한 오버헤드 발생 가능
  • Class:
    • Heap에 저장되어 상대적으로 느린 메모리 접근
    • 참조 카운팅으로 인한 오버헤드
    • ARC(Automatic Reference Counting)에 의한 메모리 관리 필요

정리

// Struct 예시
struct Rectangle {
    var width: Double
    var height: Double
    
    mutating func scale(by factor: Double) {
        width *= factor
        height *= factor
    }
}

// Class 예시
class Vehicle {
    var brand: String
    
    init(brand: String) {
        self.brand = brand
    }
    
    deinit {
        print("\(brand) vehicle is being deinitialized")
    }
}

0개의 댓글