본문 바로가기
프로그래밍 팁/Swift

1-2. Swift - 상수와 변수(Constants and Variables) 문법 개념 정리

by Archivers 2020. 10. 28.

 

상수와 변수(Constants and Variables)

상수(constant)와 변수(variable)는 특정한 타입의 값과 이름을 서로 연관 짓습니다. 이를테면, 정수형 타입의 값인 10과 maximumNumberOfLoginAttempts라는 이름을 서로 연관 짓거나, 문자열 타입의 값인 Hello와 welcomeMessage라는 이름을 연관 지을 수 있습니다. 상수의 값은 한 번 정해지면 다시 변경될 수 없습니다. 반면 변수의 값은 정해진 후에도 다른 값으로 변경될 수 있습니다. 상수(常數)의 '상'은 항상 상의 한자를 쓰며, 변수(變數)의 '변'은 변할 변의 한자를 쓰는 것에서도 유추할 수 있습니다.

 

 

상수와 변수의 선언

상수와 변수는 사용하기 전에 먼저 선언이 이루어져야 합니다. 상수는 let 키워드로 선언하며, 변수는 var 키워드로 선언합니다. 아래 코드는 상수와 변수를 사용하여 사용자가 로그인을 시도한 횟수를 기록하는 예입니다.

let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0

 

위 코드는 다음과 같이 글로 표현할 수 있습니다.

 

"maximumNumberOfLoginAttempts(우리말로는 '로그인이 허용된 최대 횟수')라는 이름의 새로운 상수를 선언하고, 이 상수에 값 10을 대입합니다. 그리고 currentLoginAttempt(우리말로는 '현재까지 시도한 로그인 횟수')라는 이름의 새로운 변수를 선언하고, 초기값(initial value)으로 0을 대입합니다."

 

위 예에서 로그인이 허용된 최대 횟수는 절대 변하지 않는 값이므로 상수로 선언되었습니다. 반면 현재까지 시도한 로그인 횟수는 변수로 선언되었습니다. 사용자의 로그인 시도가 실패할 때마다 이 값이 1씩 늘어나야 하기 때문입니다.

 

콤마로 구분하면 한 줄에 여러 상수 또는 여러 변수를 한꺼번에 선언할 수 있습니다.

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

 

위 코드를 글로 표현하면 다음과 같습니다.

 

"x라는 이름의 변수를 선언하고 이 변수에 값 0.0을 대입합니다. 그리고 y라는 이름의 변수를 선언하고 이 변수에 값 0.0을 대입합니다. 마지막으로 z라는 이름의 변수를 선언하고 이 변수에 값 0.0을 대입합니다."

 

또는 다음과 같이 간결하게 표현할 수도 있습니다. "x, y, z라는 이름의 변수에 각각 값 0.0을 대입합니다."

NOTE

사용하고자 하는 값이 절대 변하지 않는 값이라면 언제나 상수로 선언하세요.
반면 사용하고자 하는 값이 변할 수 있는 값이라면 변수로 선언하세요.

 

 

타입 어노테이션

상수나 변수를 선언할 때 해당 상수 또는 변수에 저장할 수 있는 값의 종류, 즉 타입을 명시(type annotation)할 수 있습니다. 타입 어노테이션을 하는 방법은 다음과 같습니다. 상수 또는 변수의 이름 바로 뒤에 콜론(:)을 적고 한 칸을 띄운 뒤, 사용하고자 하는 타입의 이름을 적습니다.

 

다음 예는 welcomeMessage라는 이름의 변수에 문자열(String) 타입의 값을 저장하도록 명시하고 있습니다.

var welcomeMessage: String

 

위 선언문에 사용된 콜론(:)은 '~타입의'로 읽을 수 있습니다. 즉, 위 코드는 다음과 같이 글로 표현할 수 있습니다.

 

"문자열(String) 타입의 welcomeMessage라는 이름의 변수를 선언합니다."

 

welcomeMessage 변수가 '문자열(String)타입'이라는 것은 즉 문자열(String) 타입의 어떤 값이든 welcomeMessage 변수에 저장할 수 있음을 뜻합니다. 이제 welcomeMessage 변수에는 어떤 문자열(String) 값이든 아무 문제 없이 대입할 수 있습니다.

welcomeMessage = "Hello"

 

위 코드에서는 welcomeMessage 변수에 문자열 Hello가 대입되었습니다.

 

만약 여러 변수에 한꺼번에 동일한 타입을 명시하고자 한다면, 각 변수의 이름을 콤마를 통해 구분하여 적은 뒤, 마지막 변수 이름 뒤에 콜론(:)을 적고 한 칸 띄운 뒤 사용하고자 하는 타입의 이름을 적으면 됩니다.

var red, green, blue: Double

 

위 코드에서는 red라는 이름의 변수, green이라는 이름의 변수, blue라는 이름의 변수 각각에 Double이라는 타입을 한꺼번에 명시하여 선언하였습니다.

NOTE

실제로 Swift 언어를 사용함에 있어서 타입을 직접 명시하는 경우는 드뭅니다.
상수 또는 변수를 정의하는 시점에 초기값을 제공하면,
Swift는 해당 값을 토대로 상수 또는 변수를 위한 알맞은 타입을 추론하기 때문입니다.
위의 welcomeMessage 변수의 예시에서는 초기값이 따로 제공되지 않았기 때문에 타입을 추론하는 것이 불가능합니다.
따라서 이 경우에는 타입을 직접 명시해야 합니다.

 

 

상수와 변수의 이름

상수와 변수의 이름에는 유니코드 문자뿐만 아니라 어느 문자든 사용할 수 있습니다.

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

 

상수와 변수의 이름에는 공백 문자(whitespace characters)나 수학 기호, 화살표(arrows), 개인용 유니코드 스칼라 값(private-use Unicode scalar values), 선이나 상자를 그리기 위한 문자line- and box-drawing characters)를 사용할 수 없습니다. 이뿐만 아니라 상수와 변수의 이름의 첫 글자는 숫자로 시작할 수 없습니다. 대신 첫 글자가 아닌 다른 위치에는 숫자를 사용할 수 있습니다.

 

일단 상수 또는 변수가 특정한 타입으로 선언이 이루어지면, 동일한 이름을 다시 사용하여 선언할 수 없으며 다른 타입의 값을 저장하기 위해 이름을 변경할 수도 없습니다. 또한, 상수를 변수로 변경할 수 없으며 변수를 상수로 변경할 수도 없습니다.

NOTE

만약 Swift에 예약된 키워드를 상수 또는 변수의 이름으로 사용하고자 한다면,
해당 키워드를 두 개의 백틱(backtick)('')안에 넣습니다. 하지만 꼭 필요한 경우가 아니라면,
Swift에 예약된 키워드는 상수 또는 변수의 이름으로 사용하지 않는 것이 좋습니다.

 

타입이 같다는 가정 하에 변수에 저장된 기존의 값을 다른 값으로 변경할 수 있습니다. 다음 예시에서는 friendlyWelcome 변수에 저장된 값이 Hello!에서 Bonjour!로 변경되었습니다.

var friendlyWelcome = "Hello!"
friendlyWelcome = "Bonjour!"

 

위 코드는 다음과 같이 글로 표현할 수 있습니다.

 

"friendlyWelcome이라는 이름의 변수에 문자열(String) 타입의 값인 Hello!를 대입하고 선언합니다. 그리고 이번에는 해당 변수에 같은 문자열(String) 타입의 값인 Bonjour!를 대입합니다. 이제 friendlyWelcome 변수의 값은 Hello!에서 Bonjour!로 변경되었습니다."

 

변수와는 다르게 상수의 값은 한 번 정해진 다음에는 다시 변경할 수 없습니다. 만약 상수의 값을 변경하려고 하면, 작성한 코드가 컴파일되는 과정에서 오류가 발생합니다.

let languageName = "Swift"
languageName = "Swift++"

 

위 코드는 다음과 같이 글로 표현할 수 있습니다.

 

languageName이라는 상수에 문자열(String) 타입의 값인 Swift를 대입하고 선언합니다. 그리고 이번에는 해당 변수에 같은 문자열(String) 타입의 값인 Swift++를 대입하여 기존의 값을 변경하고자 합니다. 하지만 languageName은 상수이므로 값을 변경할 수 없고, 컴파일 오류가 발생할 것입니다."

 

 

상수와 변수의 출력

print 함수(function)를 사용하여 상수 또는 변수에 저장된 현재 값을 출력할 수 있습니다.

print(friendlyWelcome)

 

위 코드는 다음과 같이 글로 표현할 수 있습니다.

 

"friendlyWelcome 변수에는 현재 Bonjour! 값이 저장되어 있습니다. 따라서 print 함수는 friendlyWelcome 변수에 저장된 값인 Bonjour!를 출력할 것입니다."

 

print(_:separator:terminator:) 함수는 하나 이상의 값을 적절한 형태로 출력하는 전역 함수(global function)입니다. 이 print 함수의 결과물은 Xcode의 콘솔 영역에 출력됩니다. print 함수의 구분자(separator)와 종료자(terminator) 파라미터(parameter; 또는 매개변수)는 기본값을 가지고 있기 때문에, 이 print 함수를 호출할 때 두 파라미터를 생략할 수 있습니다. 기본적으로 print 함수는 값을 출력한 뒤 줄을 바꾸고 종료됩니다. 값 바로 뒤에 줄 바꿈이 일어나지 않게 출력하고자 한다면, 종료자(terminator)에 빈 문자열(empty string)을 대입하면 됩니다. 다시 말해서, 위에서 언급된 print(_:separator:terminator:) 함수에서 구분자(separator)와 종료자(terminator) 파라미터는 기본적으로 생략이 되는데, 줄 바꿈을 원치 않을 경우에는 종료자(terminator) 부분에 빈 문자열, 즉 ""을 입력하면 됩니다.

 

종료자(terminator) 부분에 빈 문자열을 입력하여 호출한 print 함수의 예는 다음과 같습니다.

print(friendlyWelcome, terminator: "")

 

참고로 print(_:separator:terminator:) 함수에서 앞쪽의 괄호 바로 다음에 적힌 _이 사용자가 원하는 값을 입력하는 자리입니다. 위 예시에서는 friendlyWelcome 변수가 입력되었습니다. 그리고 구분자(separator)는 기본값이 존재하므로 생략되었고, 종료자(terminator)는 기본값이 존재하여 생략되었을 수도 있으나 위 예시에서는 빈 문자열 값인 ""로 대체되었습니다.

 

print(_:separator:terminator:)

print(friendlyWelcome, 구분자(separator)는 생략, terminator: "")

 

Swift는 상수 또는 변수의 이름을 긴 문자열의 플레이스홀더(placeholder)로 사용하는 방식을 문자열 보간법(string interpolation)으로 일컫습니다. 그리고 Swift는 이 플레이스홀더에 넣인 상수 또는 변수의 이름을 상수 또는 변수에 저장된 현재 값으로 대체합니다. '보간'이라는 단어가 무슨 말인지 이해하기 어려운데 '덧붙여진 것'이라고 이해하면 됩니다. 즉 문자열 보간법이란 문자열을 덧붙인 것이 됩니다. 문자열 보간법을 사용하기 위해서는 상수 또는 변수의 이름을 괄호 안에 넣고, 앞의 괄호 바로 앞에 백슬래시(\)을 입력하면 됩니다.

print("friendlyWelcome 변수에 저장된 현재 값은 \(friendlyWelcome)입니다.")

 

위 코드는 다음과 같이 글로 표현할 수 있습니다.

 

"'friendlyWelcome 변수에 저장된 현재 값은'이라는 문자열을 그대로 출력하고, '값은' 다음에는 한 칸을 띄우고 friendlyWelcome 변수를 문자열 보간법으로 처리합니다. 이를 위해 friendlyWelcome 변수의 이름을 괄호 안에 넣고, 앞의 괄호 앞에 백슬래시(\)를 입력하였습니다. Swift는 문자열 보간법으로 작성된 friendlyWelcome 변수를 해당 변수에 현재 담겨 있는 값으로 대체합니다. friendlyWelcome 변수에는 현재 Bonjour! 값이 저장되어 있으므로, \(friendlyWelcome)은 Bonjour!로 대체됩니다. 그리고 이 print 함수는 'friendlyWelcome 변수에 저장된 현재 값은 Bonjour!'를 출력합니다."

 

굳이 영어에 비유하자면 it과 비슷하다고 할 수 있습니다. it 자체로는 아무런 것도 뜻하지 않고 그저 다른 것을 지칭할 뿐입니다.

 

I saw a very nice tumbler at the store, but it was expensive.

가게에서 매우 멋진 텀블러를 보았는데, 그것은 비쌌다.

 

위 영어 예문에서 it은 very nice tumbler를 지칭합니다.

it은 friendlyWelcome 변수의 이름과 같으며, very nice tumbler은 Bonjour!와 같습니다.

it = very nice tumbler

friendlyWelcome = Bonjour!

 

 

 

 

 

이 글은 Apple이 제공하는 'The Swift Programming Language 5.2 버전' (https://swift.org)을 번역 및 참고하여 작성하였습니다.

댓글