- 변수(Variables)와 상수(Constants)
- 프로그램에 값을 저장하는 '저장소'의 종류.
- '변수'는 프로그램 내에서 값이 변할 수 있는 저장소
- '상수'는 값이 변하지 않는 저장소
- 타입 명시(Type Annotations)
- Swift는 Type-Safe한 언어이므로, 저장할 값의 타입을 명확히 명시해주어야한다.
- 문맥 상 값의 타입이 분명할 경우, Swift는 타입추론(Type Inference)할 수 있으므로 타입을 명시하지 않을 수 있다.
- 상수와 변수의 이름(Naming Constants and Variables)
- 상수와 변수의 이름은 대부분의 문자를 사용할 수 있지만, 첫 글자로 숫자를 사용할 수 없습니다.
- 같은 이름의 상수 또는 변수를 중복하여 선언할 수 없습니다.
- 상수와 변수 출력(Printing Contstants and Variables)
- 상수 또는 변수에 저장된 값을
- 함수
print()
의 괄호 안에 변수 또는 상수명을 넣어 출력합니다.
변수 : 프로그램에서 데이터를 저장하는 '저장소'
값을 저장할 때, 반드시 선언(assign)해야 한다.
변수에 저장된 값은 추후 다른 값으로 변할 수 있습니다.
상수 : 변수 중 값이 변할 수 없는 '저장소'
값을 변경할 필요가 없을 때, 코드를 더 안전하고 명확하게 만들기 위해 사용합니다.
let 변수이름: 변수타입 = 값 //변하지 않을 값을 저장하는 let
var 변수이름: 변수타입 = 값 //변할 수 있는 값을 저장하는 var
let maximumNumberOfLoginAttempts = 10 // maximumNumberOfLoginAttempts라는 새로운 상수를 선언(declaring)하고 10이라는 값을 할당(assign)한다.
var currentLoginAttempt = 0 // currentLoginAttempt라는 새로운 변수를 선언하고 0이라는 값으로 초기화한다.
최대 로그인 시도 횟수maximumNumberOfAttempt
는 변경되어서는 안되므로 상수(constant, let)으로 선언합니다.
현재 로그인 시도 횟수currentLoginAttempt
는 로그인을 시도한만큼 숫자가 1씩 증가해야하므로 변수(variable, var)로 선언합니다.
var environment = "development"
let maximumNumberOfLoginAttempts: Int
// 상수 maximumNumberOfLoginAttempts은 타입만 '선언'되었고, 아직 값은 '초기화'되지 않았습니다.
if environment == "development" {
maximumNumberOfLoginAttempts = 100
} else {
maximumNumberOfLoginAttempts = 10
}
// 이제 상수 maximumNumberOfLoginAttempts에 값이 초기화되었고, 읽을 수 있게 되었습니다.
상수 또는 변수로 선언할 때, 위의 예제 처럼 선언의 부분으로 값을 할당(초기화)할 수도 있습니다. 또는 처음 값을 읽기 전에 값의 존재가 보장되면(=선언되어 있다면) 프로그램의 마지막에 초기화 값을 할당할 수 있습니다.
위 예제는 로그인 최대시도 횟수(maximumNumberOfLoginAttempts
)는 상수이고, 이 값은 if 함수에 따라 달라집니다. environment == "development"
가 참일 때, maximumNumberOfLoginAttempts
는 100의 값을 가지고, 거짓일 때, 10의 값을 가집니다.
if 함수의 모든 조건에 maximumNumberOfLoginAttempts
이 특정한 값을 가질 수 있으므로, 선언과 함께 값이 할당되어있지 않을 수 있습니다.
아래는 여러개의 상수 또는 변수를 선언할 때, 콤마로 구분하여 한 줄로 선언하는 예시입니다.
var x = 0.0, y = 0.0, z = 0.0
Swift에서는 상수 또는 변수를 선언(declaring)할 때, 저장할 값의 종류를 명확하게 하기 위해 타입 명시를 제공할 '수' 있다. 타입 명시는 상수 또는 변수 이름 뒤에 콜론과 공백 한 칸 뒤에 사용할 타입의 이름을 적어 사용합니다.
타입을 명시하는 경우
var welcomeMessage: String = "안녕하세요."
// 변수 welcomeMessage의 타입은 String이며, "안녕하세요."라는 값으로 선언되었다.
위처럼 ':'은 '...의 타입은...'이라는 의미를 가지고 있으며, 많은 경우 타입추론(Type Inference)에 의해 아래처럼 타입을 명시하지 않고 변수를 선언할 수 있습니다.
타입을 명시하지 않는 경우
welcomeMessage = "안녕하세요."
같은 타입의 여러 개의 변수를 콤마로 구분하여 한 번에 선언할 수 있습니다. 이 때, 변수의 타입은 마지막 변수 뒤 콜론과 함께 한 번만 작성할 수 있습니다.
var red, green, blue: Double
실제로 타입명시(Type Annotation)이 필요한 경우는 드뭅니다. 상수 또는 변수를 선업할 때 초기값을 지정하면 Swift는 타입 세이프티와 타입 추론(Type Safety and Type Inference)에서 나와있는 것처럼 해당 상수 또는 변수에 사용될 타입을 거의 항상 유추할 수 있습니다. 위의
welcomeMessage
예제에서 초기값을 지정하지 않았으므로welcomeMessage
변수의 타입은 초기값에서 유추되지 않고 타입을 명시하였습니다.
상수와 변수 이름은 유니코드(Unicode)문자를 포함해 대부분의 문자를 포함할 수 있습니다.
let n = 3.14159
let 你好 = "你好世界"
let 🐶🐮 = "dogcow"
상수와 변수 이름은 공백, 수학적 기호, 화살표, 내부에서 사용하는 유니코드 스칼라 값, 또는 선과 박스를 그리는 문자를 포함할 수 없습니다. 또한 숫자는 이름의 첫번째 글자로 사용될 수 없습니다.
특정 타입으로 상수 또는 변수를 선언하면 동일한 이름으로 다시 선언하거나 다른 타입의 값을 저장하도록 변경하여 선언할 수 없습니다. 상수를 변수로 바꾸거나 변수를 상수로 바꿀 수도 없습니다.
Swift 키워드와 동일한 이름의 상수 또는 변수를 제공해야 한다면 이름을 백틱(`)으로 묶어줘야 합니다. 그러나 키워드를 이름으로 사용하는 것은 좋지 않은 방법입니다.
동일한 타입의 다른 값으로 이미 선언된 변수의 값을 변경하는 것은 가능합니다. 아래에서 friendlyWelcome
값은 Hello!
에서 Bonjour!
로 변경됩니다.
var friendlyWelcome = "Hello!"
friendlyWelcome = "Bonjour!"
// friendlyWelcome의 값은 "Bonjour!"로 변경되었습니다.
변수와 달리 상수의 값은 지정된 이후에는 변경할 수 없습니다. 값을 변경하려고 하면 코드가 컴파일 될 때 오류가 발생합니다.
let languageName = "Swift"
languageName = "Swift++"
// 상수의 값을 변경할 경우 컴파일에러가 발생합니다.
print(_:separator:terminator:)
함수로 상수 또는 변수의 현재 값을 출력할 수 있습니다.
print(friendlyWelcome)
// 출력값 : "Bonjour!"
print(_:separator:terminator:)
함수는 하나 또는 그 이상의 값을 적절하게 출력하는 전역함수입니다. 예를 들어 Xcode에서 print(_:separator:terminator:)
함수는 Xcode 콘솔(Console)창에 결과를 출력합니다. separator
와 terminator
파라미터는 가본 값을 가지고 있으므로 함수를 호출할 때 생략할 수 있습니다. 기본적으로 이 함수는 줄바꿈을 출력하고 종료됩니다. 줄바꿈없이 값을 출력하려면 print(someValue, terminator: "")
와 같이 terminator
에 빈 문자열을 넘겨주면 됩니다. 파라미터 기본값에 대한 자세한 내용은 파라미터 기본값(Default Parameter Values)을 참고바랍니다.
Swift는 긴 문자열에 상수 또는 변수의 이름을 포함하여 Swift가 상수 또는 변수의 현재 값으로 대체하기 위해 문자열삽입(String Interpolation)을 사용합니다. 이름을 역슬래시(/) + 소괄호로 감싸고 원하는 위치에 삽입합니다.
print("The current value of friendlyWelcome is \(friendlyName)")
// 출력값 : "The current value of friendlyWelcome is Bonjour!")
문자열삽입(String Interpolation)에서 사용할 수 있는 모든 옵션은 문자열 삽입(String Interpolation)에 자세히 설명되어 있습니다.