Swift 구조체

1 분 소요

스위프트 구조체 개요

구조체 ≒ 클래스
공통점:

  • 객체지향 프로그래밍의 기초를 형성(프로퍼티 정의, 값 저장, 메서드 정의)
  • 데이터와 기능을 재사용
  • 캡슐화하는 방법 제공
  • 프로토콜 채택
  • 초기화
  • 확장 가능

차이점: struct 키워드 사용

struct SampleStruct {
     
    var name: String
     
    init(name: String) {
        self.name = name
    }
}

<클래스>

class SampleClass {
     
    var name: String
     
    init(name: String) {
        self.name = name
    }
}

인스턴스 생성

let myStruct = SampleStruct(name: "Mark")
let myClass = SampleClass(name: "Mark")

값 타입 vs 참조 타입

구조체 - 값 타입(value type)
클래스 - 참조 타입(reference type)

값 타입: 원본 구조체 인스턴스와는 별개인 복사본을 복사 -> 다른 복사본들에 영향x

struct SampleStruct {
     
    var name: String
     
    init(name: String) {
        self.name = name
    }
}
 
let myStruct1 = SampleStruct(name: "Mark")
var myStruct2 = myStruct1
myStruct2.name = "David"

print(myStruct1.name) //Mark
print(myStruct2.name) //David

myStruct2는 myStruct1의 복사본이기 때문에 myStruct2의 name만 변경

참조 타입: 클래스 인스턴스가 있는 메모리의 위치에 대한 참조체가 생성 및 전달 -> 모든 참조체의 데이터 변경

class SampleClass {
     
    var name: String
     
    init(name: String) {
        self.name = name
    }
}

let myClass1 = SampleClass(name: "Mark")
var myClass2 = myClass1
myClass2.name = "David"

print(myClass1.name) //David
print(myClass2.name) //David

동일한 클래스 인스턴스에 대한 참조체들이기 때문에 MyClass1과 myClass2 모두에 영향을 미침


다른 차이점

구조체

  • 효율적
  • 멀티 스레드 코드를 사용하는데 더 안정적

클래스

  • 상속, 하위 클래스 지원
  • 소멸자 메서드(deinit) 포함
  • 런타임에서 클래스 타입을 식별