Skip to content

Class Vs Struct #44

@zzangzzangguy

Description

@zzangzzangguy

기본 차이점

특성 Class Struct
타입 참조 타입 값 타입
상속 가능 불가능
인스턴스 생성 힙 메모리 할당 스택 메모리 할당
복사 방식 참조 복사 값 복사
메모리 관리 ARC 사용 ARC 불필요

Class (클래스)

참조 타입: 클래스의 인스턴스는 힙 메모리에 저장 변수에 할당 시 인스턴스의 참조가 전달된다. 따라서 여러 변수가 동일 인스턴스를 참조할 수 있다. 상속 가능: 다른 클래스로부터 속성과 메서드를 상속받을 수 있다. 이는 코드 재사용성과 다형성을 증진시킨다. ARC 사용: 자동 참조 카운팅(ARC)을 통해 메모리 관리가 이루어진다. 적절한 메모리 관리를 위해 강한 참조 사이클을 피해야 한다.

Struct (구조체)

값 타입: 구조체의 인스턴스는 스택 메모리에 저장되며, 변수에 할당 시 인스턴스의 복사본이 생성된다. 이로 인해 각 변수는 독립적인 인스턴스를 가지게 된다. 상속 불가능: 다형성을 필요로 하지 않는 단순 데이터 모델에 적합하다. ARC 불필요: 값 타입이므로 ARC를 사용하지 않고, 스코프를 벗어날 때 자동으로 메모리에서 제거된다.

Class 사용 권장:두 개 이상의 변수가 인스턴스를 공유할 필요가 있을 때상속을 통해 기능을 확장하거나, 다형성을 구현해야 할 때Objective-C 코드와의 상호 운용성이 필요할 때Struct 사용 권장:관련된 간단한 값의 그룹을 캡슐화하고자 할 때참조보다는 복사를 통해 데이터를 전달하고자 할 때데이터 모델의 불변성을 보장하고자 할 때

class Bodybuilder {
  var name: String
  var age: Int
  
  init(name: String, age: Int) {
    self.name = name
    self.age = age
  }
  
  func introduce() -> String {
    return "안녕하세요, 제 이름은 \(name)이고, 나이는 \(age)살입니다."
  }
}

struct Workout {
  var type: String
  var duration: Int // 운동 시간(분)
  
  func describe() -> String {
    return "\(type) 운동을 \(duration)분 동안 합니다."
  }
}

// Bodybuilder 클래스의 인스턴스 생성 및 참조 복사
var bodybuilder1 = Bodybuilder(name: "홍길동", age: 30)
var bodybuilder2 = bodybuilder1  // bodybuilder1 참조 복사
bodybuilder1.name = "김철수"     // bodybuilder1의 이름을 변경
print(bodybuilder2.introduce()) // bodybuilder2도 같은 인스턴스를 참조하므로 이름이 "김철수"로 출력된다.

// Workout 구조체의 인스턴스 생성 및 값 복사
var workout1 = Workout(type: "벤치프레스", duration: 60)
var workout2 = workout1        // workout1의 값을 복사하여 새로운 인스턴스 생성
workout1.type = "스쿼트"        // workout1의 운동 타입을 변경
print(workout2.describe())     // workout2는 별개의 인스턴스이므로 여전히 "벤치프레스 운동을 60분 동안 합니다." 출력

결론

Swift에서 ClassStruct 선택은 상황에 따라 달라진다. 데이터의 공유 방식, 메모리 관리 방법, 상속의 필요성 등을 고려해야 한다.

클래스 사용 권장 🏛:

공유 필요 🔄: 두 개 이상의 변수가 동일한 인스턴스를 공유해야 할 때.

상속 & 다형성 🌳: 기능을 확장하거나 다양한 형태로 구현해야 할 때. 클래스는 상속이 가능해서, 기존의 코드를 재사용하고 확장하는 데 효과적

.Objective-C 상호운용성 🔗: Objective-C 코드와 상호 운용이 필요할 때 사용.

iOS 개발에서 이전 코드나 라이브러리와의 호환을 위해 중요.

구조체 사용 권장 🏗:

간단한 값 그룹화 📦: 관련된 간단한 값들을 하나로 묶고 싶을 때. 예를 들어, 좌표나 크기 같은 단순한 데이터를 표현할 때 적합.

복사를 통한 데이터 전달 🔄: 데이터를 전달할 때 참조보다는 복사를 원할 때 사용. 이렇게 하면 원본 데이터의 무결성이 유지되면서, 예기치 않은 변경으로부터 안전해질 수 있음.

데이터 불변성 보장 🔒: 데이터 모델이 변경되지 않기를 원할 때. 구조체를 이용하면, 인스턴스가 생성된 후에는 그 내용을 변경할 수 없게 함으로써 데이터의 안정성을 보장할 수 있다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions