본문 바로가기

swift

[swift] 값 타입 vs 참조 타입

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 프레임워크는 대부분 클래스를 사용한다. 구조체/클래스 선택은 우리의 몫

 

 

 

 

 

 

[LECTURE] 16. 클래스 vs 구조체 / 열거형 : edwith

:: 클래스 vs 구조체/열거형 :: 클래스는 참조 타입, 열거형과 구조체는 값 타입이라는 것이 가장 큰 차이입니다. 클래스는 상속이 가능하지만, 열거형과 구조체는 상속이 불가능 ... - 부스트코스

www.edwith.org

 

'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