iOS/Swift

[Swift] 구조체(struct)와 클래스(class)의 차이 정리

Joo-Topia 2023. 3. 1. 23:02

구조체와 클래스의 정의 및 구문 Swift에서 구조체와 클래스 모두 사용하여 사용자 정의 데이터 유형을 정의할 수 있습니다.
구조체를 정의하는 구문은 다음과 같습니다:

struct MyStruct {
	// properties and methods
}

클래스를 정의하는 구문은 유사합니다:

class MyClass { 
	// properties and methods 
}

Reference vs Value Type

구조체와 클래스의 가장 중요한 차이점 중 하나는 메모리 처리 방식입니다. 구조체는 값 유형이므로 구조체 인스턴스를 만들 때 복사됩니다. 이는 각 구조체 인스턴스가 데이터의 자체 복사본을 갖게 되어 한 인스턴스의 수정이 다른 인스턴스에 영향을 미치지 않는다는 것을 의미합니다.

반면에 클래스는 참조 유형입니다. 클래스 인스턴스를 만들면 해당 인스턴스에 대한 참조가 생성됩니다. 동일한 클래스 인스턴스를 참조하는 여러 변수를 만들면 모든 변수가 메모리에서 동일한 객체를 참조합니다. 하나의 변수를 수정하면 동일한 객체를 참조하는 모든 변수에 영향을 미칩니다.

Inheritance

상속 구조체와 클래스 사이의 또 다른 중요한 차이점은 클래스가 다른 클래스를 상속할 수 있지만 구조체는 그렇지 않다는 것입니다. 이는 클래스를 사용하여 클래스 계층 구조를 만들고 코드를 재사용할 수 있다는 것을 의미합니다.

예를 들어 공통 속성과 메서드를 갖는 기본 클래스를 정의하고 이를 상속하는 하위 클래스를 만들 수 있습니다. 이렇게 하면 코드를 관리하고 공유 기능을 변경하기 쉬워집니다.

Mutability

Swift에서 구조체는 기본적으로 변경할 수 없습니다. 즉, 구조체 인스턴스를 생성하면 해당 속성을 수정할 수 없습니다. 구조체의 속성을 수정하려면 업데이트된 속성 값을 갖는 새 구조체 인스턴스를 만들어야 합니다.

반면에 Swift에서 클래스는 기본적으로 변경 가능합니다. 클래스 인스턴스의 속성을 생성 후에도 수정할 수 있습니다.

Advantages and Disadvantages

 구조체와 클래스 중에서 선택할 때 각각의 장단점을 고려하는 것이 중요합니다.

구조체의 장점

  • 구조체는 값 형식이기 때문에 코드 내에서 전달될 때 복사됩니다. 이로 인해 코드 이해와 예기치 않은 부작용을 방지하는 데 도움이 될 수 있습니다.
  • 구조체는 기본적으로 변경할 수 없으므로 동시성 코드에서 사용하기에 더 안전할 수 있습니다.
  • 구조체는 상속 또는 기타 고급 기능이 필요하지 않은 간단한 데이터 모델을 만드는 데 사용될 수 있습니다.

구조체의 단점

  • 구조체는 다른 구조체로부터 상속을 받을 수 없기 때문에 코드 재사용이 어려울 수 있습니다.
  • 큰 데이터 모델에 대해서는 클래스보다 효율성이 떨어질 수 있습니다. 왜냐하면 코드 내에서 전달될 때마다 인스턴스가 복사되기 때문입니다.

클래스의 장점

  • 클래스는 다른 클래스로부터 상속을 받을 수 있기 때문에 코드 재사용과 복잡한 클래스 계층 구조 생성이 용이합니다.
  • 큰 데이터 모델에 대해서는 구조체보다 효율적입니다. 왜냐하면 코드 내에서 인스턴스에 대한 참조만 전달되기 때문입니다.
  • UI 요소나 네트워크 연결과 같은 변경 가능한 객체를 생성해야하는 경우 클래스를 사용할 수 있습니다.

클래스의 단점 

  • 클래스는 참조 유형이기 때문에 코드 추론과 예기치 않은 부작용을 방지하기가 어려울 수 있습니다.
  • 구조체보다 복잡할 수 있어 유지 보수와 디버그가 어려울 수 있습니다.

Appropriate Use

구조체를 사용해야 하는 경우

  • 속성이 적은 간단한 데이터 모델을 생성하는 경우
  • 상속 또는 다른 고급 기능이 필요하지 않은 경우
  • 변경 불가능한 객체를 생성하려는 경우

클래스를 사용해야 하는 경우

  • UI 요소 또는 네트워크 연결과 같이 가변성이 필요한 객체를 생성해야 하는 경우
  • 상속과 다형성이 필요한 복잡한 객체 계층을 생성해야 하는 경우
  • 대규모 데이터 모델과 작업하는 경우, 클래스는 대용량 객체를 전달하는 데 구조체보다 효율적일 수 있습니다.

일반적으로 가변성이 필요한 객체나 복잡한 객체 계층을 만들어야 할 때는 클래스를 사용해야 합니다. 클래스는 큰 데이터 모델을 전달할 때 구조체보다 더 효율적일 수 있으므로 좋은 선택입니다. 그러나 속성이 적은 단순한 데이터 모델을 만들고 상속이나 다른 고급 기능이 필요하지 않은 경우에는 구조체를 사용해야 합니다.

 

참고: https://iosolitarydeveloper.blogspot.com/2023/02/classes-vs-structs-in-swift-which.html

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

WCSession / WCSessionDelegate 정리  (0) 2023.02.28
UICollectionView 섹션에 배경 색상을 적용하기  (0) 2023.02.23
[Swift] Opaque Types 찍어먹기  (0) 2022.02.16