본문으로 건너뛰기

구조체

애플은 스위프트 개발자에게 참조 타입보다 값 타입을 선호하라 이야기할 뿐 아니라, 이러한 철학을 몸소 실천하는 것처럼 보인다. 스위프트 표준 라이브러리를 살펴보면 구조체를 사용해서 타입 대부분을 구현했음을 알 수 있기 때문이다.

[1] [2]

애플이 구조체를 사용해 스위프트 표준 라이브러리 대부분을 구현할 수 있었던 이유는, 스위프트 구조체는 클래스와 같은 기능이 많기 때문이다. 그러나 클래스와 구조체 사이에는 일부 근본적인 차이점이 있다.

스위프트에서 구조체는 인스턴스의 프로퍼티와 메서드, 그리고 생성자를 단일 타입으로 캡슐화하는 하나의 구성체다. 서브스크립트 같은 다른 아이템도 구조체에 포함되지만, 여기서는 구조체를 이루는 기본적인 아이템에 집중하자. 앞서 클래스를 설명한 내용과 유사하다고 느낄 수 있는데, 이는 스위프트에서 클래스와 구조체가 유사하기 때문이다. 구조체와 클래스가 유사한 방식이라는 것을 이해하는 것은 매우 중요하며, 어떠한 타입을 사용할지 알기 위해서는 이들 간의 차이점을 이해해야 한다.

구조체를 생성하는 방법을 살펴보자.

    struct MyStruct {
var myProperty: String

func myMethod() {}
}

구조체에서는 앞선 클래스와 달리 생성자를 정의하지 않았다. 이는 구조체가 작성자가 생성자를 제공하지 않을 경우 초기화가 필요한 모든 프로퍼티를 설정하기 위한 기본 생성자를 만들어주기 때문이다. 기본 생성자는 구조체 인스턴스를 생성할 때 구조체의 모든 비옵셔널 프로퍼티에 초깃값을 제공하도록 요구한다.

또 다른 차이점으로 구조체에 정의된 메서드 중 일부는 mutating 키워드를 사용한다는 점이다. 구조체는 값 타입이기 때문에 기본적으로 인스턴스 메서드 내부에서 구조체 프로퍼티 값을 변경할 수 없다. mutating 키워드를 사용하면 특정 메서드에서 값을 변경할 수 있게 해준다.

구조체 타입은 인스턴스를 생성할 때 이름을 부여하기 때문에 이름 있는 타입이다. 또한 구조체 타입은 값 타입이다. 구조체와 클래스 간 주요 차이점 중 하나로 클래스는 참조 타입이고, 구조체는 값 타입이라는 점이다.

Xcode Jump to Difinition를 통해 확인할 수 있는 인터페이스 사항

[1]- swift-foundation github 위 링크는 애플이 퍼블릭 라이브러리로 제공하는 swiftfoundation 패키지의 String 코드 구현사항이다.

[2]- Standard Library - String 위 링크는 애플이 String 타입에 대해 설명한 문서이다.