Swift 입문 | 구조체, 열거형, 튜플 | 구조체(struct)

Swift는 클래스나 배열 등의 것 외에도 복잡한 성질을 가진 값이 있다. 이 대해 정리해 보겠다. 우선 “구조"부터 설명하겠다.

구조체는 값을 저장한 속성과 처리를 구현하는 메소드이다. 구조체를 이용하려면 먼저 정의를 작성하고 이를 바탕으로 인스턴스를 생성한다. ~라고하면 “어? 클래스와 같은 아니야?“라고 생각할지도 모르겠다.

분명히, 기본적인 구조와 구성는 클래스와 거의 동일하고, 속성과 메소드의 처리도 전혀 차이가 없자만, 섬세한 점에서 차이가 있다.

정의 struct를 사용

클래스의 정의는 “class 이름"형태로 작성되지만, 구조체의 경우 “struct 이름"이다. 속성과 메소드 작성은 클래스와 동일하다.

struct 이름 {
    ...... 속성, 메서드의 작성 ......
}

상속되지 않는다.

구조체는 클래스와 같은 객체 지향 구조를 가지고 있지 않는다. 어디까지나 “값과 처리를 하나로 묶기 위한 것"이며, 계승하여 새로운 구조체를 만들거나 할 수 없다.

이니셜라이저 필요 없다.

클래스는 인자가 없는 기본 이니셜라이저는 자동으로 제공되지만, 속성 값을 인수 가진 이니셜라이저 등은 추가 작성하지 않으면 안되지만, 이 구조체는 속성을 포함하면 그 값을 인수로 가지는 이니셜라이저가 자동으로 생성된다.

참조는 않는다.

이것은 중요하다. 클래스의 경우, 인스턴스를 작성하면 해당 참조가 변수에 할당되었다. 인스턴스는 메모리의 어딘가에 보관되어 그 위치를 나타내는 값(참조)을 변수에 넣고 조작한다. 따라서 인스턴스가 포함된 변수를 다른 변수에 할당한 경우에도 참조가 복사 될 뿐이므로, 두 변수도 동일한 인스턴스를 참조한다.

구조체는 이런 참조를 하지 않는다. 따라서 인스턴스를 할당한 변수를 반면에 변수에 할당하면 구조 자체가 복사되어 두 변수는 서로 다른 인스턴스를 갖게 된다. 이 차이는 확실히 알고 있어야 한다.

아래에 간단한 구조의 이용 예제를 보도록 하자.

struct MyData {
    var age:Int
    var name:String
     
    func getData() ->String {
        return "[\(name)(\(age))]"
    }
}
 
var data = MyData(age: 99, name: "Taro")
var data2 = data
data2.name = "Hanako"
data2.age = 24
println(data.getData())
println(data2.getData())

여기에서는 MyData 구조를 만들고 그 인스턴스를 만들어 사용하고 있다. 인스턴스 생성은 MyData(age : 99, name : “Taro”)으로 하고 있지만, 이를 위한 이니셜라이저는 없다. Swift가 자동으로 이니셜라이저를 제공 해 주고 있는 것을 알 수 있다.

또한, 작성한 인스턴스 data를 그대로 data2에 대입하고 있지만, 속성 값을 변경하여 출력시켜 보면, 양자가 각각 별도의 인스턴스를 보유하고 있는 것을 알 수 있다.