🔥 상수와 변수

832자
11분

상수와 변수는 maximumNumberOfLoginAttemptswelcomeMessage와 같은 이름을 특정 타입의 값(10이라는 숫자나 "Hello"라는 문자열 등)과 연결해 줍니다. 상수(constant)의 값은 한번 설정되면 변경할 수 없지만, 변수(variable)는 나중에 다른 값으로 설정할 수 있어요.

상수와 변수 선언하기

상수와 변수는 사용되기 전에 선언되어야 합니다. 상수는 let 키워드로, 변수는 var 키워드로 선언하죠. 다음은 상수와 변수를 사용하여 사용자의 로그인 시도 횟수를 추적하는 방법의 예시입니다.

let maximumNumberOfLoginAttempts = 10 // 허용된 최대 로그인 시도 횟수
var currentLoginAttempt = 0 // 현재 로그인 시도 횟수
swift

이 코드는 다음과 같이 읽을 수 있어요:

"maximumNumberOfLoginAttempts라는 새로운 상수를 선언하고 10이라는 값을 부여합니다. 그 다음, currentLoginAttempt라는 새로운 변수를 선언하고 초기값으로 0을 부여합니다."

이 예시에서 허용된 최대 로그인 시도 횟수는 상수로 선언되었는데, 그 이유는 최댓값이 절대 변경되지 않기 때문이에요. 현재 로그인 시도 횟수는 변수로 선언되었는데, 이 값은 로그인 시도가 실패할 때마다 증가되어야 하기 때문입니다.

만약 코드에서 저장된 값이 변경되지 않는다면, 항상 let 키워드를 사용하여 상수로 선언하세요. 변수는 변경되는 값을 저장할 때만 사용하는 거예요.

상수나 변수를 선언할 때, 위의 예시처럼 선언과 동시에 값을 부여할 수 있습니다. 또는 프로그램의 나중에 초기값을 할당할 수도 있어요. 단, 처음 읽히기 전에는 반드시 값이 할당되어 있어야 합니다.

var environment = "development" // 환경 변수
let maximumNumberOfLoginAttempts: Int
// maximumNumberOfLoginAttempts에는 아직 값이 없어요.
 
if environment == "development" {
    maximumNumberOfLoginAttempts = 100
} else {
    maximumNumberOfLoginAttempts = 10
}
// 이제 maximumNumberOfLoginAttempts에 값이 할당되었으므로 읽을 수 있습니다.
swift

이 예시에서 최대 로그인 시도 횟수는 상수이고, 그 값은 환경에 따라 달라집니다. 개발 환경에서는 100이라는 값을 가지고, 다른 환경에서는 10이라는 값을 가지죠. if 문의 양쪽 갈래에서 모두 maximumNumberOfLoginAttempts을 어떤 값으로 초기화하고 있어서, 이 상수는 항상 값을 가지게 됩니다. 이렇게 초기값을 설정할 때 Swift가 어떻게 코드를 확인하는지에 대한 정보는 Constant Declaration 를 참고하세요.

여러 개의 상수나 변수를 쉼표로 구분하여 한 줄에 선언할 수도 있답니다.

var x = 0.0, y = 0.0, z = 0.0
swift

타입 명시하기

상수나 변수를 선언할 때 type annotation을 제공하여, 그 상수나 변수가 저장할 수 있는 값의 종류를 명확히 할 수 있어요. 상수나 변수 이름 뒤에 콜론을 붙이고, 한 칸 띄운 뒤, 사용할 타입의 이름을 써주면 되죠.

다음 예시는 welcomeMessage라는 변수에 대한 타입 어노테이션을 제공하여, 이 변수가 String 값을 저장할 수 있음을 나타냅니다.

var welcomeMessage: String
swift

선언에서 콜론은 "...의 타입은..."을 의미하므로, 위의 코드는 다음과 같이 읽을 수 있어요:

"String 타입의 welcomeMessage라는 변수를 선언합니다."

"String 타입"이라는 말은 "어떤 String 값이라도 저장할 수 있다"는 것을 의미합니다. 이는 저장될 수 있는 "것의 타입" (또는 "것의 종류")을 의미한다고 생각하면 되요.

이제 welcomeMessage 변수는 에러 없이 어떤 문자열 값으로도 설정될 수 있습니다.

welcomeMessage = "Hello"
swift

같은 타입의 연관된 여러 변수를 한 줄에 정의할 때는 마지막 변수 이름 뒤에 단 한번만 타입 어노테이션을 붙이면 되고, 변수들은 쉼표로 구분하면 돼요.

var red, green, blue: Double
swift

참고로 실제로는 타입 어노테이션을 작성해야 할 일이 거의 없습니다. 상수나 변수를 정의할 때 초기값을 제공하면, Type Safety and Type Inference에 설명된 대로 Swift가 거의 항상 해당 상수나 변수에 사용될 타입을 추론할 수 있거든요. 위의 welcomeMessage 예시에서는 초기값이 제공되지 않았기 때문에 초기값에서 타입을 추론하는 대신 타입 어노테이션으로 welcomeMessage 변수의 타입을 지정한 것입니다.

상수와 변수 이름짓기

상수와 변수 이름에는 유니코드 문자를 포함한 거의 모든 문자를 사용할 수 있어요.

let π = 3.14159
let 你好 = "你好世界"
let 🐶🐮 = "dogcow"
swift

하지만 화이트스페이스 문자, 수학 기호, 화살표, 사용자 정의 유니코드 스칼라 값, 선 및 상자 그리기 문자는 포함할 수 없습니다. 또한 숫자로 시작할 수는 없지만, 이름의 다른 곳에는 숫자가 포함될 수 있어요.

한번 특정 타입의 상수나 변수로 선언되면, 같은 이름으로 다시 선언하거나 값을 다른 타입으로 바꿀 수 없습니다. 상수를 변수로 또는 변수를 상수로 바꿀 수도 없어요.

Swift 키워드와 같은 이름을 상수나 변수에 부여해야 한다면, 이름으로 사용할 때 키워드를 역따옴표(```)로 감싸세요. 하지만 정말 선택의 여지가 없지 않은 한 키워드를 이름으로 사용하는 것은 피하는 게 좋아요.

호환되는 타입의 다른 값으로 기존 변수의 값을 변경할 수 있습니다. 이 예시에서는 friendlyWelcome의 값이 "Hello!"에서 "Bonjour!"로 변경되었네요.

var friendlyWelcome = "Hello!"
friendlyWelcome = "Bonjour!"
// friendlyWelcome은 이제 "Bonjour!"입니다.
swift

변수와 달리, 상수의 값은 설정된 후에는 변경할 수 없어요. 그렇게 하려고 하면 코드를 컴파일할 때 에러로 보고됩니다.

let languageName = "Swift"
languageName = "Swift++"
// 컴파일 타임 에러입니다: languageName은 변경될 수 없어요.
swift

상수와 변수 출력하기

print(_:separator:terminator:) 함수를 사용하여 상수나 변수의 현재 값을 출력할 수 있습니다.

print(friendlyWelcome)
// "Bonjour!"를 출력합니다.
swift

print(_:separator:terminator:) 함수는 하나 이상의 값을 적절한 출력으로 출력하는 전역 함수예요. 예를 들어, Xcode에서 print(_:separator:terminator:) 함수는 출력을 Xcode의 "콘솔" 창에 출력합니다. separatorterminator 매개변수는 기본값을 가지고 있으므로 이 함수를 호출할 때 생략할 수 있어요. 기본적으로 이 함수는 출력하는 줄의 끝에 줄바꿈을 추가하여 종료합니다. 값 뒤에 줄바꿈 없이 출력하려면 terminator에 빈 문자열을 전달하세요. 예를 들면 print(someValue, terminator: "")처럼요. 기본값을 가지는 매개변수에 대한 정보는 Default Parameter Values를 참고하세요.

Swift는 문자열 보간법(string interpolation)을 사용하여 긴 문자열 내에 상수나 변수의 이름을 플레이스홀더로 포함시키고, Swift에게 해당 상수나 변수의 현재 값으로 대체하도록 지시합니다. 이름을 괄호로 감싸고 괄호 앞에 백슬래시를 넣어주세요.

print("friendlyWelcome의 현재 값은 \(friendlyWelcome)입니다.")
// "friendlyWelcome의 현재 값은 Bonjour!입니다."를 출력합니다.
swift

문자열 보간법에서 사용할 수 있는 모든 옵션은 String Interpolation에 설명되어 있답니다.

자, 이렇게 상수와 변수에 대해 알아봤어요. 여러분의 코드에서 언제 상수를 사용하고 언제 변수를 사용할지, 값을 어떻게 선언하고 이름을 지을지, 그리고 출력은 어떻게 할지 결정할 수 있게 되었길 바랍니다.