Swift의 let 상수에 대한 불변성에 대한 고찰

2015-11-07
24 Views

Swift언어의 let으로 선언한 상수는 불변(immutable)이라고 보통 설명하지만 주의해야할 부분이 있어 정리해봅니다. 클래스형 변수에 대한 let 선언은 값을 변경할 수 없다고 생각하지 않고, 다시 대입할 수 없다라고 생각해야 합니다.

예를 들어,

[code lang=”swift”]
class SampleClass {
var value : String = ""
init(str: String) {
value = str
}
}
let sampleclass =SampleClass(str: "클래스")
sampleclass.value ="메소드" //
[/code]

반대로 구조체형 상수 let선언은 그 상수 자신에게 다시 할당뿐만 아니라 속성에 다시 할당도 할 수 없는 컴파일오류가 발생합니다. 또한 속성을 변경하는 메소드의 정의는 변경 할 수 있는(mutating)을 부여해야 합니다. 이처럼 Swift언어의 구조상 값을 변경시키지 않기 위한 구조를 가지고 있다는 것입니다.

물론 다른 언어들도 값을 변경시키지 않기 위한 구조를 가지고 있습니다. 변수값이 자주 변경되면 어떤 데이터에서 어떤 데이터가 만들어지고, 데이터 흐름이 복잡해지기 때문입니다. 명시적으로 “여기서 데이터가 변경된다”라고 선언하지 않으면 값은 변경되지 않는 것이 있다고 본다면 처리 플로우를 잡기 쉽고 디버깅도 쉬워집니다.

문제가 있는 데이터가 만들어진다면, “그 데이터는 어디서 만들어졌나”, “어떤 데이터와 결합해서 만들어졌나”등으로 분석하여 데이터가 변경되는 부분만 체크하면 된다는 것입니다. 예로 C++언어에서도 변수선언과 함수 인수, 리턴값, 함수자신선언등 여러곳에 const를 선언하여 값을 변경할 수 없도록 하는 구조를 가지고 있습니다. 이는 Swift에서 변수를 여러가지 목적으로 사용하지 않고 최대한 let으로 선언해야 하는 이유이기도 합니다.

C++언어에서 const를 선언하여 값을 변경하지 못한다고 이야기했지만, Swift언어에서는 기본값을 변경할 수 없지만 키워드를 선언하여 변경할 수 있게 만들 수 있습니다. 예로 속성을 변경한다고 한다면 메소드 인수에 var를 선언하지 않으면 인수값을 변경할 수 없습니다.

Swift언어의 구조에서 값을 변경하지 못하도록 하는 것은 데이터 흐름을 단순화시켜 처리하려는 기술입니다. 즉, 적극적으로 이 구조를 이용하는 것을 강력하게 추천하지만, 클래스는 구조체와 다르게 값을 변경하지 못하도록 하는 구조를 제공하지 않습니다. 클래스의 이용목적이 NSObject라이브러리 이용 및 여러가지 상황에서 데이터 공유라는 측면에서 클래스에서는 불변성을 기대하지 않는 것이 좋다고 생각됩니다.

Facebook Comments

You may be interested

Gif 애니메이션으로 로딩 구현하기
Swift 3.0
shares9 views
Swift 3.0
shares9 views

Gif 애니메이션으로 로딩 구현하기

MJ Kim - 5월 24, 2017

이번에는 MBProgressHUD 라이브러리와 FLAAnimatedImage 라이브러리를 사용하여 gif 애니메이션을 사용하는 방법을 정리해본다. Cocoapods를 사용하여 라이브러리를 추가해도 되고 Carthage를 사용해서 추가해도 된다.…

Bluetooth기반 iOS기기로 통신하기
Swift 3.0
shares5 views
Swift 3.0
shares5 views

Bluetooth기반 iOS기기로 통신하기

MJ Kim - 5월 23, 2017

제 블로그에 관심이 있는 분이 블루투스를 사용한 방법을 알려달라고 하셔서 좀더 이해하기 쉬운 방법을 고민해서 한가지 팁을 공유합니다. 블루투스(Bluetooth)로 1대1로…

Apple지도 및 구글지도 앱을 여는 방법
Swift 3.0
shares7 views
Swift 3.0
shares7 views

Apple지도 및 구글지도 앱을 여는 방법

MJ Kim - 5월 16, 2017

지도 중심에 핀을 넣기 특정 지점에서 특정지점 루트를 표시하기  Apple 지도 앱 지도 중심에 핀세워서 위치 표시 [crayon-5929b892e0706707769876/] 경로 표시…