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

2015-11-07
15 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

모바일 앱 아키텍처
Swift
shares11 views
Swift
shares11 views

모바일 앱 아키텍처

MJ Kim - 4월 22, 2017

이 내용은 나름대로 개발해본 내용을 토대로 정리해본 모바일 앱 아키텍처에 대한 내용이다. 이를 정리한 이유는 오래된 아키텍처부터 최근 아키텍처까지 정리해보고…

시간차를 얻는 Date Extension
Swift 3.0
shares6 views
Swift 3.0
shares6 views

시간차를 얻는 Date Extension

MJ Kim - 4월 12, 2017

사용자가 남길 내용에 대한 시간표시를 할 때 일정한 시간차를 표현해주는 경우가 있어 이에 대한 Date Extention을 정리해 보았다. [crayon-58fc17745fefc272780615/]  

Swift 3.1에서 없어진 문법 정리
Swift 3.0
shares34 views
Swift 3.0
shares34 views

Swift 3.1에서 없어진 문법 정리

MJ Kim - 3월 31, 2017

Swift언어는 무엇인가 나올때마다 없어지는 것들이 있어, Swift 3.1에서 컴파일할 수 없게 된 문법내용을 정리했다. switch문을 사용하여 enum에서 protocol을 여러가지 패턴으로…