[Swift] Struct와 Class

팔랑이·2023년 6월 14일
post-thumbnail

Swift에서 Struct와 Class는 둘 다 프로퍼티와 메소드를 정의하며 값을 저장할 수 있는 객체 생성 메커니즘을 제공한다. 이 두가지는 비슷해 보이지만 아주 큰 차이점이 있다.

바로 복사되거나 메소드에 전달될 때 값이 상속되느냐 안되느냐의 차이.

코드로 확인해보자.

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

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


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

위에서 보다시피, 구조 선언문과 인스턴스 생성구문이 똑같다.

그렇다면 class와 struct의 가장 근본적인 차이는 무엇이냐: class는 참조타입(reference type)이고 struct는 값 타입(value type)라는 것.


참조 타입과 값 타입의 차이

  • struct가 복사되거나 메소드에 전달되면, 이 struct들은 원본의 struct와 각각 다른 개체로 인식된다. 즉, 복사된 struct는 각각의 값으로 존재하여 하나의 데이터가 변경되어도 기존 struct나 다른 복사본의 데이터에는 아무런 변화가 없다.

  • 이와 다르게, 복사된 class의 데이터가 변경되면 기존의 class와 다른 복사본들에서 이를 참조하여 동일한 작업이 수행된다. 즉, 단 하나의 class 인스턴스가 존재하고, 이를 가리키는 여러 개의 참조체가 존재하는 것.


실제 예시로 확인해보자.

  1. Struct (값의 경우)
struct SampleStruct {
	var name: String
    
    init(name: String){
    	self.name = name
    }
}
let myStruct1 = SampleStruct(name: "Palrang")
print(myStruct1.name)
// => Palrang

var myStruct2 = myStruct1
myStruct2.name = "SH" //값을 직접 변경

print(myStruct1.name) // => Palrang
print(myStruct2.name) // => SH
  1. Class (참조체의 경우)
class SampleClass {
	var name: String
    
    init(name: String){
    	self.name = name
    }
}
let myClass1 = SampleClass(name: "Palrang")
print(myClass1.name)
// => Palrang

var myClass2 = myClass1
myClass.name = "SH" //값을 직접 변경

print(myClass1.name) // => SH
print(myClass2.name) // => SH

Struct와 Class의 사용 구분

공통점

  • 선언 구문 형식은 동일하다.

  • 프로퍼티/메소드를 선언하고 값을 저장하는 등 객체생성 메커니즘을 제공한다.

  • 둘 다 override나 extension을 사용해 확장될 수 있다.

  • 프로토콜을 채택하거나 초기화 구문을 가질 수 있다.

사용의 구분

  • 일반적으로 struct가 class에 비해 효율적이고 안정적이기 때문에 struct를 사용하기를 권장한다.

  • 상속이 필요하거나 데이터가 캡슐화된 하나의 인스턴스가 필요할 때는 class를 사용한다.

  • 소멸자가 사용될 때 리소스를 확보하기 위해서도 class를 사용할 수 있다.


📚 참고도서
[SwiftUI 기반의 iOS 프로그래밍]

profile
정체되지 않는 성장

0개의 댓글