Structures VS Classes
Swift에서 가장 많이 사용하는 것 중 하나가 바로 구조체와(Structures)와 클래스(Classes)일 것이다. 하지만 이 두 개의 개념을 어렴풋이 알고 용례에 따라 관성적으로 용하는경우가 많다. 이번 글에서 구조체와 클래스의 개념에 대해 알아보도록 하자.
구조체와 클래스의 비교
구조체와 클래스는 많은 공통점을 공유하고 있는데 다음과 같다:
- 값을 저장하는 프로퍼티 정의
- 기능 제공을 위한 메서드 정의
- 서브 스크립트 구분을 사용하여 값에 접근을 제공하는 서브 스크립트 정의
- 초기화 상태를 설정하기 위한 초기화 정의
- 기본 구현을 넘어 기능적 확장을 위한 확장
- 특정 종류의 표준 기능을 제공하는 프로토콜 준수
하지만 클래스는 구조체에 없는 추가적인 기능이 있는데 다음과 같다:
- 상속을 사용하면 한 클래스가 다른 클래스의 특성을 상속할 수 있다.
- 타입 캐스팅을 사용하면 런타임에 클래스 인스턴스의 타입을 확인하고 해석할 수 있다.
- 초기화 해제 구분 (Deinitializers)을 사용하면 클래스의 인스턴스가 할당된 리소스를 해제할 수 있도록 한다.
- 참조 카운팅은 하나 이상의 클래스 인스턴스 참조를 허락한다.
따라서 클래스의 사용은 복잡성을 증가시키기 때문에 공식 문서도 다음과 같은 가이드라인을 제시한다.
- 구조체를 기본으로 사용한다.
- 클래스는 Objective-C 코드의 상호 운용이 필요할때 사용한다.
- Identity 컨트롤이 필요한경우 클래스, 필요하지 않은 경우 구조체
즉, ViewModel 같은 데이터를 참조해서 앱 전반에 걸친 Identity 컨트롤을 해야하거나 레거시 코드를 심어야 할 경우 외에는 구조체를 사용을 기본적으로 고려해야한다.
구조체와 열거형은 값 타입, 클래스는 참조 타입
이러한 차이는 바로 값타입과 참조타입에서 오고 이것이 구조체와 클래스 간의 핵심적인 차이이다.
값 타입(value type)은 변수 또는 상수에 할당될 때나 함수에 전달될 때 복사되는 값인 타입이다.
hd
에 할당된 구조체 Resolution
을 cinema
에 전달한다고 가정하면 다음과 같이 복사된 Resolution
을 전달받게 된다. 따라서 데이터의 무결성이 지켜지기 때문에 모델이나 엔티티 등을 구조체로 구성하는 이유가 된다.
반면, 클래스는 참조 타입이다. 참조 타입(reference type)은 변수 또는 상수에 할당될 때나 함수로 전달될 때 복사되지 않고 존재하는 같은 인스턴스에 대한 참조가 사용된다.
tenEighty
에 할당된 VideoMode
클래스를 alsoTenEighty
에 전달하게 되면 tenEighty
와 alsoTentEighty
는 동일한 인스턴스를 참조받는 형태가 된다. 그렇기 때문에 우리가 ViewModel을 구성하여 데이터를 참조시킬때 클래스를 이용한다.
이러한 차이를 이해한다면 구조체와 클래스사이의 선택과 데이터 구조와 흐름을 파악하는데 큰 도움이 될 것이다.\
식별 연산자
클래스는 참조 타입이기 때문에 클래스의 같은 단일 인스턴스에 참조하는 여러개의 상수와 변수가 가능하다.
2개의 상수 또는 변수가 클래스의 같은 인스턴스를 참조하는지 확인하는 것이 유용할 수 있습니다. 이를 위해 Swift는 2가지 식별 연산자를 제공한다:
- 동일 인스턴스 (Identical to) (
===
) - 동일하지 않은 인스턴스 (Not identical to) (
!==
)
결론
구조체와 열거형은 값타입, 클래스는 참조타입임을 명심하고 값 타입과 참조 타입의 데이터 전달 방식의 차이를 이해한다면 클래스와 구조체의 차이 또한 쉽게 이해할 수 있을 것이다.
댓글남기기