[Swift] 구조체와 클래스의 공통점 및 차이점

Ujeon 🍵
4 min readJul 28, 2021

--

클래스와 구조체의 공통점 및 차이점

Swift의 구조체와 클래스는 서로 공통점이 많습니다. 대표적으로 :

  1. 값을 저장하기위해 속성을 정의합니다.
  2. 기능을 제공하기 위해 메서드를 정의합니다.
  3. 서브스크립트 문법을 사용하여 구조체나 클래스의 값에 접근할 수 있도록 서브스크립트를 정의할 수 있습니다.
  4. 초기 값을 설정하기 위해 이니셜라이저를 정의합니다.
  5. 기본 구현체를 넘어서 기능을 추가할 수 있도록 확장할 수 있습니다.
  6. 특정 기능을 실행하기 위해 특정 프로토콜을 준수할 수 있습니다.

구조체가 갖지 않은 클래스만의 특징도 있습니다 :

  1. 다른 클래스의 특성을 상속하기 위해 클래스를 상속할 수 있습니다. 하지만 구조체는 상속기능이 없습니다.
  2. 런타임 시 클래스 인스턴스의 타입을 확인하고 해석하기 위해 타입캐스팅을 사용할 수 있습니다.
  3. 디이니셜라이저를 사용하면 클래스의 인스턴스가 할당된 자원을 해제할 수 있습니다.
  4. 참조 카운팅은 클래스 인스턴스에 대해 둘 이상의 참조를 허용합니다.

(하지만 클래스와 구조체의 가장 큰 차이점은 클래스는 참조 타입, 구조체는 값 타입이라는 점이죠?! 😎)

클래스, 구조체 어떤걸 사용해야 할까요?!

둘 다 데이터를 저장하고 모델링을 하는데 좋은 방법이지만, 둘의 유사성 때문에 선택을 하기가 힘듭니다.

맞춰서 데이터 타입을 추가할 때 도움이 되는 가이드라인은 :

● 기본적으로는 구조체를 사용하세요

● Objective-C 를 사용할 필요가 있을 때는 클래스를 사용하세요

● 모델링 중인 데이터의 ID(identity)를 제어해야 할 때는 클래스를 사용하세요

● 구현체를 공유함으로써 특정 행동을 채택하기 위해서는 프로토콜과 함께 구조체를 사용하세요

기본적으로 구조체를 사용하세요

공통적인 종류의 데이터를 나타내고자 할 때는 구조체를 사용하세요. Swift의 구조체는 다른 언어의 클래스가 할 수 없는 기능들이 있습니다 : 저장 프로퍼티, 계산 프로퍼티, 메서드를 포함하고 있죠. 게다가 Swift의 구조체는 프로토콜을 추가함으로써 기본 기능을 추가할 수도 있죠.

그리고 구조체를 사용하면 앱의 전체적인 상태를 고려할 필요 없이 코드를 더 잘 이해할 수 있습니다. 클래스와 달리 구조체는 값 타입이기 때문에 지역적으로 변경 사항이 있다고 해서 의도적으로 변경 사항을 전달하지 않는 한 앱의 다른 부분에 영향을 끼치지 않습니다.

Objective-C 를 사용할 필요가 있을 때는 클래스를 사용하세요

데이터를 처리하기 위해 Objective-C API가 필요하거나 기존에 존재하던 Objective-C 프레임워크에 정의된 클래스 위계에 알맞은 데이터를 전달하기 위해서는, 데이터를 모델링 하기 위해 클래스와 클래스 상속을 사용할 필요가 있습니다. 예를 들어, 많은 Objective-C 프레임워크는 하위 클래스처럼 보이는 클래스를 노출하고 있죠.

모델링 중인 데이터의 ID(identity)를 제어해야 할 때는 클래스를 사용하세요

Swift의 클래스는 참조 타입이기 때문에 기본적으로 ID라는 개념이 존재합니다. 즉, 동일한 속성 값을 가지고 있는 두 클래스 인스턴스 일지라도, 참조 비교 연산자(===)를 사용하여 비교해보면 서로 다른 ID로 취급됩니다. 이 말은 클래스 인스턴스를 앱 전반에 걸쳐서 사용하게 되면, 변경 사항이 발생 시 인스턴스를 참조하고 있는 모든 부분에 변경 사항이 반영된다는 의미입니다.

구현체를 공유함으로써 특정 행동을 채택하기 위해서는 프로토콜과 함께 구조체를 사용하세요

만약 처음부터 상속 관계를 구축하는 경우에는 프로토콜 상속이 적절합니다. 프로토콜은 클래스, 구조체 및 열거형이 상속할 수 있지만, 클래스 상속은 다른 클래스에서만 상속이 가능하죠. 만약 여러분이 데이터를 어떻게 모델링할지 고민하고 있다면, 처음에는 프로토콜 상속을 사용하여 데이터의 계층을 구성한 다음, 해당 프로토콜을 구조체가 채택하는 것을 권장합니다.

참고 자료

Structures and Classes

Choosing Between Structures and Classes

--

--

Ujeon 🍵
Ujeon 🍵

Written by Ujeon 🍵

Hi there, this is Ujeon. I want to be a developer who passes on value through development :)

No responses yet