Swift

Swift - 7. 구조체

iosos 2023. 12. 28. 16:31

구조체

  • 데이터와 기능을 재사용할 수 있는 객체로 캡슐화 방법 제공
  • 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)

→ 구조체 인스턴스가 복사되거나 메서드에 전달될 때, 인스턴스의 실제 복사본이 생성됨

 

원본 객체가 가지고 있던 모든 데이터를 그대로 복사해서 갖게 됨

즉, 복사본은 원본 구조체 인스턴스와 별개인 자신만의 데이터를 가짐

 

→ 하나의 인스턴스를 변경해도 다른 복사본 인스턴스에 영향을 미치지 않음

 

 

  • 이와 반대로 클래스는 참조 타입이기 때문에 복사되거나 인자로 전달되면 인스턴스가 있는 메모리의 위치에 대한 참조체가 만들어지거나 전달됨
  • 따라서 참조체가 변경되면 원본 인스턴스에도 동일한 작업이 수행 됨
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) // Daivd

→ struct는 값 타입이기 때문에 복사하더라도 원본과 다른 값을 가질 수 있음

 

 

클래스 (class)

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

 

 

구조체 특징

  • 상속이나 하위 클래스를 지원하지 않음
  • 하나의 구조체가 다른 구조체에 상속될 수 없음
  • 소멸자 메서드 (deinit)를 포함할 수 없음
  • 런타임에서 클래스 인스턴스의 유형을 식별할 수는 있지만, 구조체는 그렇지 않음

 

 

구조체 vs 클래스 (차이점)

  • 구조체가 클래스보다 효율적이고 멀티 스레드 코드를 사용하는 데 안정적 → 구조체 권장
  • 상속이 필요하거나 데이터가 캡슐화된 하나의 인스턴스가 필요할 때 → 클래스 사용
  • 인스턴스가 소멸될 때 리소스 확보 작업이 필요한 경우 → 클래스 사용