Swift - Struct(구조체) vs. Class(클래스) 비교하기

Swift의 Object인 구조체와 클래스에 대해서 알아봤습니다. 구조체와 클래스 모두 관계가 있는 데이터를 묶어서 표현할 때 사용됩니다. 이것을 표현하면 프로퍼티와 메서드로 표현할 수 있습니다. 문법과 구조는 비슷하지만 사용되는 방식은 다른데요. 오늘은 두 가지를 비교해 봅시다.

 

 

구조체와 클래스 차이

Struct Class
Value Types Reference Types
Copy Share
Stack Heap
Fast Slow

해당 표는 Structclass의 차이점입니다. 하나씩 살펴 봅시다.

 

Value Types과 Reference Types

Swift에서는 구조체와 클래스는 할당되는 방식이 다릅니다. 구조체의 경우Value Type 값에 의한 복사가 이뤄집니다. 

struct PersonStruct {
    var firstName: String
    var lastName: String

    init(firstName: String, lastName: String) {
        self.firstName = firstName
        self.lastName = lastName
    }
    
    var fullName: String {
        return "\(firstName) \(lastName)"
    }
}

var personStruct1 = PersonStruct(firstName: "MinMong", lastName: "Ji")
var personStruct2 = personStruct1
personStruct2.firstName = "JinMong"
personStruct2.lastName = "Park"

personStruct1.fullName
personStruct2.fullName

// 결과 : "MinMong Ji"
// 결과 : "JinMong Park"

간단한 구조체를 만들어서 구조체를 이해해 봅시다.PersonStruct 구조체가 있습니다. 이름을 표현할 수 있는 프로퍼티를 가지고 있고요. personStruct1를 만들어둔 구조체로 인스턴스 하였습니다.

 

그리고 새로운 변수 personStruct2에 할당을 해주었습니다. 이때에 구조체의 동작 방식은 기존 personStruct1의 값들을 복사해서 할당을 해주게 됩니다. 그리고 각각의 인스턴스는 독립적입니다. 독립적이란 뜻은 서로 다른 메모리에 할당이 되어있는 뜻입니다. 따라서 personStruct2의 값을 변경하게 되더라도 personStruct1은 영향을 받지 않습니다.

 

클래스의 경우는 Reference Type입니다. 참조에 방식인데요. C++의 레퍼런스 타입, 포인터를 생각하면 됩니다. 클래스의 경우 이미 생성된 인스턴스를 새로운 변수에 할당할 때에 새로운 변수는 기존에 이미 생성된 인스턴스를 가리키게 됩니다.

class PersonClass {
    var firstName: String
    var lastName: String

    init(firstName: String, lastName: String) {
        self.firstName = firstName
        self.lastName = lastName
    }

    var fullName: String {
        return "\(firstName) \(lastName)"
    }
}

var personClass1 = PersonClass(firstName: "MinMong", lastName: "Ji")
var personClass2 = PersonClass1
personClass1.firstName = "JinMong"
personClass1.lastName = "Park"

personClass1.fullName
personClass2.fullName
// 결과 : "JinMong Park"
// 결과 : "JinMong Park"

간단한 클래스를 만들어서 동작을 이해해 봅시다.PersonClass 클래스가 있습니다. 구조체와 마찬가지로 이름을 표현할 수 있는 프로퍼티를 가지고 있습니다. personClass1을 인스턴스 하였습니다. 그리고 새로운 변수 personClass2에 할당을 해주었습니다. 이때에 구조체처럼 새로운 인스턴스가 되지 않고 personClass1변수가 가리키고 있는 인스턴스 메모리 주소를 가지게 됩니다.

 

C++로 예를 들면 personClass1을 포인터라고 생각하면 됩니다. 실제 메모리 구조도 클래스 인스턴스는 Heap 메모리입니다. 

 

Struct, Class 언제 사용해야 할 까?

이럴 때 구조체를 사용하자.

1. 두 object를 직접 비교해야 하는 경우, 즉 데이터 자체를 비교해야 할 때에 사용하자. 

2. 구조체는 Value Types이기 때문에 Copy가 된다. Copy 된 각 객체들을 독립적으로 가져야 할 때에 사용하자.

3. 코드에서 오브젝트의 데이터를 여러 스레드가 접근하여 사용할 경우.

 

이럴 때 클래스를 사용하자.

1. 두 오브젝트의 인스턴스 자체가 같음을 확인해야 할 때에 사용하자.

2. 하나의 객체가 필요하고, 여러 대상에 의해 접근되고 변경이 필요한 경우에 사용하자.

 

이건 애플 공식 문서에 있는 내용입니다. 

 

 

그리드형(광고전용)

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band

댓글

Designed by JB FACTORY