Swift)구조체와 클래스

Featured image

@

구조체와 클래스는 프로그래머가 데이터를 용도에 맞게 묶어 표현하고자 할 때 용이합니다. 구조체와 클래스는 프로퍼티와 메서드를 사용하여 구조화된 데이터와 기능을 가질 수 있습니다. 하나의 새로운 사용자정의 데이터 타입을 만들어 주는 것입니다.

구조체와 클래스의 차이점은 구조체의 인스턴스는 값 타입이고, 클래스의 인스턴스는 래퍼런스(참조) 타입이라는 것입니다.

스위프트의 데이터 타입과 열거형은 모두 값 타입입니다. 그러나 클래스는 참조 타입입니다.

스위프트는 소스파일 하나에 여러 개의 구조체와 여러 개의 클래스를 정의하고 구현해도 문제가 없습니다. 또, 중첩 함수와 마찬가지로 구조체 안에 구조체, 클래스 안에 클래스 등과 같이 중첩 타입의 정의 및 선언이 가능합니다.

구조체와 클래스의 차이점

구조체

  1. 상속받지 않습니다.
  2. 값입니다.
  3. 일반 int, array등등은 struct로 카피되어있습니다.
  4. 스위프트의 기본 데이터 타입은 모두 구조체를 기반으로 구현되어 있습니다.

클래스

  1. 래퍼런스 타입입니다. (참조 형태)
  2. 상속 받습니다.
  3. 단일 상속만 가능합니다.
  4. 클래스는 프로퍼티(클래스 안의 변수)와 메소드(클래스 안의 함수)를 가질 수 있는 컨테이너 타입을 정의하기 위한 용도입니다.
  5. 자식클래스는 부모클래스를 이어받지만 자식 만의 기능(프로퍼티와 메소드)을 추가로 가질 수 있습니다.
  6. 오버로드(Overload) 개념은 OOP의 상속과는 직접적인 관계가 없는 용어다. 이 용어는 이름이 동일한 함수를 여러개 만드는 것을 의미합니다. 단지, 매개변수의 종류나 갯수를 다르게 해서 컴파일러가 함수를 구분 할 수 있도록 해야 하는 제한이 있습니다.
  7. 오버라이드(Override)는 OOP의 상속에서 부모의 기능에 자식만의 기능을 덧붙이거나 아예 바꾸고자 하는 경우에 사용됩니다. 스위프트의 경우에는 override 라는 지시어를 반드시 명기해야 하기에 무엇이 오버라이드 되는지는 눈으로 확인이 가능합니다.

둘의 차이점

  1. 구조체가 클래스보다 인스턴스 생성이 빠릅니다.
  2. 구조체는 클래스보다 대입은 느리다. 메모리값을 카피해야하기 때문에 느립니다. 반면 클래스는 래퍼런스만 넘기면 되어서 빠릅니다.
  3. 싱글톤은 클래스로 구현되어야합니다.

애플 가이드라인에서 다음 조건 중 하나 이상에 해당된다면 구조체를 사용하기를 권합니다.

  1. 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 때
  2. 캡슐화된 값이 참조되는 것보다 복사되는 것이 합당할 때
  3. 구조체에 저장된 프로퍼티가 값 타입이며 참조되는 것보다 복사되는 것이 합당할 때
  4. 다른 타입으로부터 상속받거나 자신이 상속될 필요가 없을 때
  5. 예시 : 좌표계. x, y 좌표 등을 표현하고 싶을 때 Int 타입으로 x, y 프로퍼티를 가질 수 있으며, 물건의 크기를 표현하고자 할 때는 부동소수 표현인 Double 또는 Float 타입을 사용하여 width, height, depth 등으로 묶어 표현해 줄 수 있습니다.