iOS/Swift
[Swift] 구조체(struct) vs 클래스(class)
겸둥이xz
2021. 2. 19. 14:45
반응형
구조체(struct)와 클래스(class)
공통점
- 값을 저장하기 위해 프로퍼티를 정의할 수 있다.
- 기능 수행을 위해 메서드를 정의할 수 있다.
- 서브스크립트 문법을 통해 구조체 또는 클래스가 가지는 값에 접근하도록 서브스크립트 정의 가능.
- 초기화될 때의 상태를 지정하기 위해 이니셜라이저 정의 가능.
- extension을 통해 확장 가능.
- 특정 protocol 준수 가능.
차이점
- 구조체(struct)
- 값 타입(Call by Value) : 데이터를 전달 할 때 값을 복사하여 전달.
- Stack memory 영역에 할당
- 상속 불가능
- 클래스(class)
- 참조 타입(Call by Reference) : 데이터를 전달 할 때 값의 메모리 위치를 전달.
- Heap memory 영역에 할당
- 상속 가능
struct ValueType {
var property = 1
}
class ReferenceType {
var property = 1
}
// 첫 번째 구조체 인스턴스
let firstStructInstance = ValueType()
// 두 번째 구조체 인스턴스에 첫 번째 인스턴스 값 복사
var secondStructInstance = firstStructInstance
// 두 번째 구조체 인스턴스 프로퍼티 값 수정
secondStructInstance.property = 2
// 두 번째 구조체 인스턴스는 첫 번째 구조체를 똑같이 복사한
// 별도의 인스턴스이기 때문에
// 두 번째 구조체 인스턴스의 프로퍼티 값을 변경해도
// 첫 번째 구조체 인스턴스의 프로퍼티 값에는 영향이 없음
print("first struct instance property : \(firstStructInstance.property)") // 1
print("second struct instance property : \(secondStructInstance.property)") // 2
// 클래스 인스턴스 생성 후 첫 번째 참조 생성
let firstClassReference = ReferenceType()
// 두 번째 참조 변수에 첫 번째 참조 할당
let secondClassReference = firstClassReference
secondClassReference.property = 2
// 두 번째 클래스 참조는 첫 번째 클래스 인스턴스를 참조하기 때문에
// 두 번째 참조를 통해 인스턴스의 프로퍼티 값을 변경하면
// 첫 번째 클래스 인스턴스의 프로퍼티 값을 변경하게 됨
print("first class reference property : \(firstClassReference.property)") // 2
print("second class reference property : \(secondClassReference.property)") // 2
구조체와 클래스 선택해서 사용하기
구조체와 클래스는 새로운 데이터 타입을 정의하고 기능을 추가한다는 점에서는 같다. 하지만 구조체 인스턴스는 항상 값 타입, 클래스 인스턴스는 참조 타입이다.
생김새는 비슷하지만 용도는 다르다는 의미이다. 프로젝트의 성격에 따라, 데이터의 활용 용도에 따라, 특정 타입을 구현할 때 구조체와 클래스 둘 중 하나를 선택해서 사용해야한다.
Apple은 가이드라인에서 다음 조건 중 하나 이상에 해당된다면 구조체(struct) 사용을 권한다.
- 연관된 간단한 값의 집합을 캡슐화 하는 것만이 목적일 때
- 캡슐화된 값이 참조보다 복사되는 것이 합당할 때
- 구조체에 저장된 프로퍼티가 값 타입이며 참조보다 복사되는 것이 합당할 때
- 다른 타입으로부터 상속받거나 자신이 상속될 필요가 없을 때
<참고 자료>
BoostCourse - iOS 프로그래밍을 위한 스위프트 기초 : www.boostcourse.org/mo122/lecture/11274/
반응형