study record

[Swift] 스위프트 프로그래밍 - 구조체와 클래스의 차이와 선택 본문

Swift/스위프트 프로그래밍

[Swift] 스위프트 프로그래밍 - 구조체와 클래스의 차이와 선택

asong 2021. 9. 28. 10:33

비슷한 점

  • 값을 저장하기 위해 프로퍼티를 정의한다.
  • 기능 실행을 위해 메서드를 정의한다.
  • 초기화될 때의 상태를 지정하기 위해 이니셜라이저를 정의할 수 있다.

 

다른 점

  • 구조체는 상속할 수 없다.
  • 타입캐스팅은 클래스의 인스턴스만 가능하다.
  • 디이니셜라이저는 클래스의 인스턴스에만 활용할 수 있다. (디이니셜라이저란 클래스의 인스턴스가 참조할 필요가 없을 때 메모리에서 해제되기 전 호출되는 것이다. (deinit 메소드))
  • 참조 횟수 계산은 클래스의 인스턴스에만 적용된다.

가장 큰 차이점은 클래스는 참조타입, 구조체는 값 타입이라는 점이다.

 

값 타입과 참조 타입

두 타입의 큰 차이는 '무엇이 전달되느냐'이다.

함수의 전달인자가 값 타입일 때에는 전달될 값이 복사되어 전달된다.

전달인자가 참조타입일 때에는 복사하지 않고 참조(주소)가 전달된다. (C의 포인터와 유사개념)

 

클래스의 인스턴스끼치 참조가 같은지 확인할 때는 식별연산자를 사용한다. 두 참조가 같은 인스턴스를 가리키고 있는지 비교한다. (===)

 

구조체와 클래스 중 선택하기

구조체와 클래스는 새로운 데이터 타입을 정의하고 기능을 추가하는 점에서 같다.

다른 것은 구조체 인스턴스는 항상 값 타입이고, 클래스 인스턴스는 참조 타입이라는 것이다.

프로젝트의 성격에 따라, 데이터의 활용도에 따라 선택하여 사용해야 한다.

 

애플은 다음 조건 중 하나 이상에 해당한다면 구조체를 사용하는 것을 권장한다.

  • 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 때
  • 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
  • 구조체에 저장된 프로퍼티가 값 타입이며 참조하는 것보다 복사하는 것이 합당할 때
  • 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없을 때