You are currently viewing  [Swift] Types and Variables Part 1
swift

 [Swift] Types and Variables Part 1

가변성(Mutability): 상수(let)와 변수(var)

Swift를 배울 때 가장 중요한 개념 중 하나는 가변성(mutability)입니다. 가변성이란 ‘변경할 수 있는 능력‘을 의미합니다.

한쪽에는 불변(immutable), 즉 변경할 수 없는 것들이 있고, 다른 한쪽에는 가변(mutable), 즉 변경할 수 있는 것들이 있습니다.

SwiftUI에서는 일반적으로 객체들이 불변(immutable) 상태를 유지하는 것을 선호합니다. 그 이유는 나중에 구조체(Struct)와 같은 개념을 배우면서 더 명확해질 것입니다. (UIKit 경험이 있으신 분들은 모든 View가 구조체로 만들어지는 것을 보고 이미 짐작하셨을 겁니다.)

불변인 것들은 변하지 않기 때문에 예측하기가 매우 쉽습니다. 반면, 언제든 바뀔 수 있는 것은 예측이 불가능하죠. 그리고 예측 불가능성은 필연적으로 프로그램의 오류나 버그로 이어집니다.

버그(Bug)란? 🐞

프로그램이 올바르게 실행되지 않게 만드는 문제를 의미합니다. 버그는 크게 두 종류로 나뉩니다.

  1. 문법 버그 (Syntax Bugs): 코드를 잘못 작성하여 앱 실행 자체가 안 되는 경우입니다.
  2. 의미론적 버그 (Semantic Bugs): 앱이 실행은 되지만, 의도와 다르게 잘못 동작하는 경우입니다.

대부분의 코드 문제의 근원은 바뀌지 말아야 할 것이 바뀌거나, 예측 불가능하게 바뀌는 것에서 비롯됩니다. 이것이 바로 우리가 가능한 한 불변성을 선호해야 하는 이유입니다.


상수(let)와 변수(var)의 차이점

값을 담는 공간을 만들 때, Swift에서는 두 가지 키워드를 사용합니다: **let (상수)**과 var (변수).

  • 상수 (Constant): let 키워드로 시작하며, 한번 할당된 값은 절대 변하지 않습니다.
  • 변수 (Variable): var 키워드로 시작하며, 나중에 다른 값으로 변경할 수 있습니다.
Swift
// 'let'으로 선언된 상수는 변경할 수 없습니다.
let myName: String = "Paul"

// 'var'로 선언된 변수는 값을 변경할 수 있습니다.
var mySurname: String = "foot"

이는 마치 학창 시절 대수학에서 x = 5처럼 값을 담아두는 **플레이스홀더(placeholder)**와 같습니다. 하지만 수학에서의 x는 나중에 x = 2로 바꿀 수 있는 변수인 반면, Swift에서는 let을 사용하면 그 값을 영원히 바꿀 수 없는 상수로 만드는 것입니다.

물론 현실 세계에서는 변해야 하는 것들도 존재합니다. 하지만 제 이름처럼 한번 정해지면 바뀔 가능성이 거의 없는 값은 상수로 선언하는 것이 합리적입니다.


데이터 타입과 타입 안전성

위 코드에서 몇 가지 흥미로운 점을 발견하셨을 겁니다.

문자열 (String)과 정수 (Int)

값을 감싸는 큰따옴표(")는 이 데이터가 문자열(String), 즉 텍스트 타입이라는 것을 의미합니다. 만약 큰따옴표를 빼먹으면 Swift는 이를 코드로 인식하려다 오류를 발생시킵니다.

Swift
let myName = "Paul" // 올바른 문자열(String)
// let myName = Paul   // 오류 발생! 'Paul'이라는 변수나 상수를 찾을 수 없습니다.

반면, 따옴표 없이 숫자를 사용하면 이는 정수(Integer) 타입으로 인식됩니다.

Swift
// 'catLegs'는 숫자 4를 값으로 가지는 정수(Int) 타입의 상수입니다.
let catLegs: Int = 4

타입 선언 (Type Declaration)

코드에서 : String이나 : Int와 같이 콜론(:) 뒤에 타입을 명시하는 것을 **타입 선언(Type Declaration)**이라고 합니다. 이는 myName이라는 상수는 오직 String 타입의 값만 가질 수 있다고 명시하는 것입니다.

Swift는 정적 타입 언어(statically typed language)입니다. 한번 타입이 선언되면, 그 변수나 상수는 다른 타입의 값을 가질 수 없습니다. 이는 Python이나 JavaScript 같은 동적 타입 언어(loosely/dynamically typed languages)와의 큰 차이점입니다.

Swift
var mySurname: String = "foot"

// 오류 발생! Int 타입의 값을 String 타입 변수에 할당할 수 없습니다.
// mySurname = 5 
// 컴파일 오류 메시지: Cannot assign value of type 'Int' to type 'String'

선언과 사용

주목할 점은 varlet 키워드는 변수나 상수를 처음 만들 때(선언할 때) 단 한 번만 사용한다는 것입니다. ‘선언’은 이 변수나 상수를 세상에 처음 존재하게 만드는 행위라고 생각할 수 있습니다.

일단 한번 선언되고 나면, 그 다음부터는 키워드 없이 이름만 사용하여 값을 변경하거나 사용할 수 있습니다.

Swift
// 1. 'mySurname' 변수를 "foot"이라는 값으로 '선언'합니다.
var mySurname: String = "foot"

// 2. 일단 선언된 후에는 'var' 키워드 없이 이름만 사용하여 값을 '변경'합니다.
mySurname = "changed" 

이미 선언된 상수나 변수는 다른 값을 만드는 데 사용할 수 있습니다.

Swift
let catLegs: Int = 4
let dogLegs: Int = 4

// 이미 존재하는 상수 'catLegs'와 'dogLegs'를 사용하여 새로운 상수를 만듭니다.
let totalAnimalLegs: Int = catLegs + dogLegs // 결과: 8

여기서 catLegsdogLegs 앞에 let을 다시 쓰지 않았다는 점을 주목하세요. 일단 한번 선언되면, 그 이름만으로 값을 가져와 사용할 수 있습니다.

답글 남기기