[Swift 기초] 참조타입과 값타입

2022. 3. 19. 15:57Swift 기초 정리

728x90

//공부 기록용 포스팅입니다. 틀린 부분이 있을 경우 댓글로 알려주시면 감사합니다! 😎

 

1. Class / Struct /Enum

  Class Struct Enum
Type Reference Value Value
Subclassing O X X
Extension O O O
  • 클래스만 유일하게 참조타입, 상속할 수 있음(단일상속)

1-1. 구조체는 언제 사용하나?

  • 전달 → 참조가 아닌 복사를 원할 때
  • 자신을 상속할 필요가 없거나, 자신이 다른 타입을 상속받을 필요가 없을 때

 

2. 값과 참조타입

  • Value: 데이터를 전달할 때 값을 복사하여 전달
  • Reference: 데이터를 전달할 때 값의 메모리 위치를 전달

2-1. 값타입(Value)

  • struct, enum, tuple
  • 각 인스턴스마다 (별도의 메모리에) 데이터의 복사본을 가진다
  • 값 타입은 인스턴스가 별도의 메모리에 유지
  • 값을 수정하는 것이기 때문에 var 키워드 유의 (아래 예제의 secondStructInstance)
struct ValueType {
    var property = 1
}
// 구조체 상수에 구조체를 생성하고 할닫
let firstStructInstance = ValueType()
// 두 번째 변수에 첫 번째 구조체 인스턴스를 할당
var secondStructInstance = firstStructInstance
secondStructInstance.property = 2    //값을 수정 하는 것: var

// 값이 복사가 되어서 들어간 것 
// 즉, 인스턴스가 하나 더 생성해서 대입한 것
print("first struct instance property : \(firstStructInstance.property)")    // 1
print("second struct instance property : \(secondStructInstance.property)")  // 2

2-2. 참조타입(Reference)

  • 각 인스턴스는 하나의 데이터 복사본을 가지며 이 (동일한) 복사본을 공유한다,
  • 참조타입은 하나의 인스턴스에를 여러 변수에서 참조할 수 있다.
  • C언어의 포인터 변수처럼 다른 인스턴스의 주소를 가진다.
    • C언어의 포인터는 물리적인 반면 이 주소는 추상화된 주소이다.
class ReferenceType {
    var property = 1
}

// 클래스 인스턴스 생성 후 첫 번째 참조 생성
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

2-3. (클래스) , (구조체/열거형) 비교

□ 구조체

  • 전달 → 참조가 아닌 복사를 원할 때
    • 함수의 매개변수로 구조체를 전달할 때 복사된 구조체가 전달된다.
struct SomeStruct {
	var someProperty: String = "Property"
}
var someStructInstace: SomeStruct = SomeStruct()
func someFunction(structInstance: SomeStruct){
	var localVar: SomeStruct = structInstace
	localVar.someProperty ="ABC"
}

//매개변수로 복사된 구조체가 전달
someFunction(someStructInstance)
print(someStructInstance.someProperty)
//Property

□ 클래스

class Circle {
    var radius: Double = 0.0
    var area: Double = 0.0
}

//c는 Circle 인스턴스르 참조
var c = Circle()

//copy_c는 Circle 인스턴스 참조 변수
var copy_c: Circle

//copy_c는 c가 참조하는 Circle 인스턴스를 참조
copy_c = c
copy_c.radius = 10.0

copy_c 
//radius: 10.0
//area: 0

2-4. 변수형 클래스, 상수형 클래스

class OtherReference {
    var a = 10
}

//변수형 클래스의 속성은 당연히 변경 가능
var ref1 = OtherReference()
ref1.a = 100

//상수형 클래스의 속성 역시 변경 가능
let ref2 = OtherReference()
ref2.a = 100

//상수형 클래스가 참조하고 있는 값을 변경할 수 없다 - 'ref2' is a  'let' constant
//ref2 = ref1

//변수형 클래스가 참조하고 있는 값은 변경할 수 있다.
ref1 = ref2

2-5. Data types in Swift

public struct Int
public struct Double
public struct Stirng
public struct Dictionary<Key : Hashable, Value>
public struct Array<Element>
public struct Set<Element: Hashable>
  • 스위프트는 구조체, 열거형 사용을 선호

 

 

 

참고하였습니다. 감사합니다.

https://yagom.net/courses/swift-basic/lessons/사용자정의-타입/topic/값-타입과-참조-타입/

https://www.inflearn.com/course/창원대학교-박동규-교수의-swift-기초-강좌/lecture/1897?tab=note 

 

 

 

728x90

'Swift 기초 정리' 카테고리의 다른 글

[Swift 기초] 클래스와 상속  (0) 2022.04.02
[Swift 기초] 프로퍼티  (0) 2022.03.31
[Swift 기초] 사용자정의타입  (0) 2022.03.18
[Swift 기초] 클로저 Closure  (0) 2022.03.14
[Swift 기초] 제너릭  (0) 2022.03.11