Swift) Struct

Publishing Date:2020-09-15

Struct

일반적으로 프로그래밍 언어에서 데이터를 묶어서 표현하고자 할 때 주로 사용된다. 즉, 하나의 사용자 데이터 타입을 만들어준다.

  • 언어별 구조체 사용 예제 추가할 것

스위프트에서는 특히 구조체와 클래스의 문법이 흡사하다. 다른 점은 구조체가 값 타입(value type), 클래스가 참조 타입(reference type)이라는 것이다.
또한 스위프트에서는 구조체를 사용할 때 제약 사항이 적다. 하나의 소스 파일에 여러 개의 구조체와 클래스가 동시에 정의되고 구현될 수 있으며, 구조체 안에 구조체, 클래스 안에 클래스가 존재할 수 있다.

구조체 정의

// 정의
struct StructName{
  //properties
  let number : Int
  var name : String
  //methods
  ...
}
  • 구조체를 정의할 때는 커스텀 데이터 타입을 생성해주는 것이므로 대문자 카멜 케이스 사용
  • 구조체 내부 변수, 함수들은 소문자 카멜 케이스 사용
// 기본 생성 이니셜라이저로 구조체 생성
var createdStruct : StructName = StructName(number: Int, name: String)

구조체와 클래스의 차이

  1. 값 타입, 참조 타입
    • 값 타입
      값 자체를 복사해서 전달 따라서 값 타입의 데이터를 전달할 경우 메모리에 새 인스턴스가 생성됨. 생성된 새 인스턴스에 해당 값이 복사되어 들어감
    • 참조 타입
      포인터와 유사한 개념. 값을 복사하는 것이 아니라 참조(주소)가 전달됨
      따라서 새 인스턴스가 생성되지 않고 기존의 인스턴스 주소를 전달
    • 식별 연산자(===)
      식별 연산자로 클래스의 인스턴스끼리 참조가 같은지 확인할 수 있다.
  2. 구조체는 상속 불가

  3. 디이니셜라이저는 클래스의 인스턴스에만 활용 가능
  4. 참조 횟수 계산은 클래스의 인스턴스에만 적용됨
  5. 타입캐스팅은 클래스의 인스턴스에만 허용됨

3,4,5는 클래스의 특징에서 정리하는 것이 나을 것 같아 1번, 2번만 먼저 정리하고자 한다. 클래스 정리는 여기로

구조체와 클래스의 공통점

  1. 내부에 프로퍼티와 메소드 존재
  2. 이니셜라이저 존재
  3. extension 가능
  4. 특정 프로토콜 채택 가능
  5. 서브스크립트 정의 가능

Reference

Comments