Swift 구조체 vs 클래스/열거형
Struct와 Class을 공통점
- 연관된 몇명의 값들을 모아서 하나의 데이터 타입으로 표현하고 싶을때
- 다른 객체 또는 함수 등으로 전달될때
- 인스턴스/타입 메서드
- 인스턴스/타입 프로퍼티
Struct
- C 언어 등의 구조체보다 다양한 기능
- 상속 불가
- 값 타입(Value Type) : 데이터를 전달 할 때 값을 복사하여 전달
- Swift의 대부분의 큰 뼈대는 모두 구조체로 구성
- Value type : 데이터를 전달할 때 값을 복사하여 전달
- 다른 객체 또는 함수 등으로 전달될 때 참조가 아닌 복사를 원할경우
- 자신을 상속할 필요가 없거나 자신이 다른 타입을 상속 받을 필요가 없을 때
Class
- 전통적인 OPP 관점에서의 클래스
- 단일상속(다중 상속 안됨)
- 참조 타입(Reference Type) : 데이터를 전할 할 때 값의 메모리 위치를 전달
- Apple 프레임워크의 대부분의 큰 뼈대는 모두 클래스로 구성
Enum
- 다른 언어의 열거형과는 많은 다른 존재
- 상속 불가
- 값 타입(Value Type) : 데이터를 전달 할 때 값을 복사하여 전달
- 인스턴스/타입 메서드
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
struct SomeStruct {
// 프로퍼티 생성
var someProperty: String = "Property"
}
// 인스턴스 생성
var someStructInstance: SomeStruct = SomeStruct()
func someFunction(structInstance: SomeStruct) {
// structInstance 값을 복사되어서 전달
var localVar: SomeStruct = structInstance
localVar.someProperty = "ABC"
}
someFunction(someStructInstance)
print(someStructInstance.someProperty) // "Property"
// 값 변화 없음
Class SomeStruct {
// 프로퍼티 생성
var someProperty: String = "Property"
}
// 인스턴스 생성
var someStructInstance: SomeClass = SomeClass()
func someFunction(classInstance: SomeClass) {
// classInstance 참조해서 메모리 위치를 전달
var localVar: SomeClass = structInstance
print(localVar.someProperty) // Property
localVar.someProperty = "ABC"
}
someFunction(someClassInstance)
print(someClassInstance.someProperty) // "ABC"
// 값 변화 있음
Swift에서 사용
- 스위프트의 기본 데이터 타입은 모두 구조체로 구현되어있습니다.
- 스위프트의 기본 데이터 타입은 모두 구조체로 구현되어있습니다.
- 스위스트는 구조체와 열거형 사용을 선호합니다.
- Apple 프레임워크는 대부분 클래스를 사용합니다.
- 구조체/클래스 선택과 사용은 개발자의 몫입니다.
Author And Source
이 문제에 관하여(Swift 구조체 vs 클래스/열거형), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jimmy48/Swift-구조체-vs-클래스열거형저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)