swift의 Class
단일 상속 가능 (다중 상속 불가)
참조 타입 (데이터를 전달할 때 값의 메모리 위치를 전달한다)
Apple 프레임워크의 대부분의 뼈대는 모두 클래스로 구성되어 있다.
swift의 struct
다른 언어의 구조체들보다 다양한 기능을 가지고 있다.
상속 불가
값 타입 (데이터를 전달할 때 값을 복사해서 전달)
swift의 대부분 큰 뼈대는 모두 구조체로 구성되어 있다.
swift의 enum
다른 언어의 열거형과는 다른 존재
상속 불가
값 타입
열거형 자체가 하나의 데이터 타입이다. 열거형의 case 하나하나 전부 하나의 유의미한 값으로 취급한다.
구조체는 언제 사용하나?
연관된 몇몇의 값을 모아서 하나의 데이터 타입으로 표현하고 싶을 때
다른 객체, 함수로 전달되는 상황에서 참조가 아닌 복사를 원할 때
자기 자신을 상속할 필요가 없거나, 자신이 다른 타입을 상속받을 필요가 없을 때
Apple 프레임워크에서 프로그래밍을 할 때는 주로 클래스를 사용한다.
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) {
var localVar: SomeStruct = structInstance
localVar.someProperty = "local"
}
someFunction(someStructInstance)
print(someStructInstance.someProperty)
someStructInstance.someProperty를 출력하면 "Property"가 출력된다.
someStructInstance 구조체 자체를 복사해서 전달했기 때문에, 아예 새로운 인스턴스가 생성된 것이라 볼 수 있다.
함수 안에서 local로 값을 바꾸어 준다고 해서, someStructInstance의 프로퍼티 값도 바뀌지는 않음!
class SomeClass {
var someProperty: String = "Property"
}
var someClassInstance: SomeClass = SomeClass()
func someFunction(structInstance: SomeClass) {
var localVar: SomeClass = structInstance
localVar.someProperty = "local"
}
someFunction(someClassInstance)
print(someClassInstance.someProperty)
하지만 클래서의 경우는, 메모리 위치만을 전달하기 때문에 함수 안에서 값을 바꾸어 주면 해당 위치로 가서 값을 바꾼다.
즉, 똑같은 인스턴스를 참조하고 있는 것!
그래서 someClassInstance.someProperty 를 출력하면 "local"이 출력된다.
swift는 구조체, 열거형 사용을 선호하지만 Apple 프레임워크는 대부분 클래스를 사용한다. 구조체/클래스 선택은 우리의 몫
'swift' 카테고리의 다른 글
[swift] String.Index와 String.SubSequence(Substring) (0) | 2020.07.21 |
---|---|
[swift] 클로저 (closure) (0) | 2020.06.25 |
[swift] 열거형 (enum) (0) | 2020.06.22 |
[swift] 클래스(class) (0) | 2020.06.22 |
[swift] 구조체 (struct) (0) | 2020.06.22 |