1 분 소요

Swift에서 가장 많이 사용하는 것 중 하나가 바로 구조체와(Structures)와 클래스(Classes)일 것이다. 하지만 이 두 개의 개념을 어렴풋이 알고 용례에 따라 관성적으로 용하는경우가 많다. 이번 글에서 구조체와 클래스의 개념에 대해 알아보도록 하자.

구조체와 클래스의 비교

구조체와 클래스는 많은 공통점을 공유하고 있는데 다음과 같다:

  1. 값을 저장하는 프로퍼티 정의
  2. 기능 제공을 위한 메서드 정의
  3. 서브 스크립트 구분을 사용하여 값에 접근을 제공하는 서브 스크립트 정의
  4. 초기화 상태를 설정하기 위한 초기화 정의
  5. 기본 구현을 넘어 기능적 확장을 위한 확장
  6. 특정 종류의 표준 기능을 제공하는 프로토콜 준수

하지만 클래스는 구조체에 없는 추가적인 기능이 있는데 다음과 같다:

  1. 상속을 사용하면 한 클래스가 다른 클래스의 특성을 상속할 수 있다.
  2. 타입 캐스팅을 사용하면 런타임에 클래스 인스턴스의 타입을 확인하고 해석할 수 있다.
  3. 초기화 해제 구분 (Deinitializers)을 사용하면 클래스의 인스턴스가 할당된 리소스를 해제할 수 있도록 한다.
  4. 참조 카운팅은 하나 이상의 클래스 인스턴스 참조를 허락한다.

따라서 클래스의 사용은 복잡성을 증가시키기 때문에 공식 문서도 다음과 같은 가이드라인을 제시한다.

  1. 구조체를 기본으로 사용한다.
  2. 클래스는 Objective-C 코드의 상호 운용이 필요할때 사용한다.
  3. Identity 컨트롤이 필요한경우 클래스, 필요하지 않은 경우 구조체

즉, ViewModel 같은 데이터를 참조해서 앱 전반에 걸친 Identity 컨트롤을 해야하거나 레거시 코드를 심어야 할 경우 외에는 구조체를 사용을 기본적으로 고려해야한다.

구조체와 열거형은 값 타입, 클래스는 참조 타입

이러한 차이는 바로 값타입과 참조타입에서 오고 이것이 구조체와 클래스 간의 핵심적인 차이이다.

값 타입(value type)은 변수 또는 상수에 할당될 때나 함수에 전달될 때 복사되는 값인 타입이다.

hd에 할당된 구조체 Resolutioncinema에 전달한다고 가정하면 다음과 같이 복사된 Resolution을 전달받게 된다. 따라서 데이터의 무결성이 지켜지기 때문에 모델이나 엔티티 등을 구조체로 구성하는 이유가 된다.

반면, 클래스는 참조 타입이다. 참조 타입(reference type)은 변수 또는 상수에 할당될 때나 함수로 전달될 때 복사되지 않고 존재하는 같은 인스턴스에 대한 참조가 사용된다.

tenEighty에 할당된 VideoMode 클래스를 alsoTenEighty에 전달하게 되면 tenEightyalsoTentEighty는 동일한 인스턴스를 참조받는 형태가 된다. 그렇기 때문에 우리가 ViewModel을 구성하여 데이터를 참조시킬때 클래스를 이용한다.

이러한 차이를 이해한다면 구조체와 클래스사이의 선택과 데이터 구조와 흐름을 파악하는데 큰 도움이 될 것이다.\

식별 연산자

클래스는 참조 타입이기 때문에 클래스의 같은 단일 인스턴스에 참조하는 여러개의 상수와 변수가 가능하다.

2개의 상수 또는 변수가 클래스의 같은 인스턴스를 참조하는지 확인하는 것이 유용할 수 있습니다. 이를 위해 Swift는 2가지 식별 연산자를 제공한다:

  • 동일 인스턴스 (Identical to) (===)
  • 동일하지 않은 인스턴스 (Not identical to) (!==)

결론

구조체와 열거형은 값타입, 클래스는 참조타입임을 명심하고 값 타입과 참조 타입의 데이터 전달 방식의 차이를 이해한다면 클래스와 구조체의 차이 또한 쉽게 이해할 수 있을 것이다.

댓글남기기