Swifter {Swift Developer}

메뉴

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

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

카테고리:   Swift

댓글

죄송하지만 댓글은 닫혀 있습니다.