Swift 기초문법 – 변수, 상수, 기초 데이터 타입

오늘의 주제

  • 스위프트에서의 명명법
  • 변수, 상수의 선언
  • 기초 데이터 타입

안녕하세요, 야곰입니다.

지난 포스팅에서는 스위프트가 어떤 언어인지에 대해 잠시 살펴보았습니다.

2017/01/23 - [Swift] - Swift란 어떤 언어인가?

이번에는 스위프트의 아주 기초적인 문법에 대해 알아보겠습니다 🙂

이름짓기

프로그래밍을 할 때 우리는 변수, 상수, 함수, 타입 등을 제각각 구분할 수 있도록 이름을 지어주어야 합니다. 그런데 각 언어마다 이름을 지어줄 때 지켜야 하는 규칙들이 있습니다.

스위프트에도 마찬가지로 이름을 지을 때 생각해 주어야 할 점들이 있는데요, 간략히 알아보겠습니다.

이름은 유니코드에서 지원하는 어떤 문자(한글, 한자, 영문, 숫자, 이모티콘 등등)라도 사용할 수 있습니다. 다만, 다음과 같은 예외의 경우는 사용할 수 없습니다.

  • 스위프트에서 미리 사용하고 있는 예약어 또는 키워드
  • 해당 코드 범위 내에서 이미 사용하고 있는 기존의 이름과 동일한 이름
  • 연산자로사용될수있는기호(+, -, *, /)
  • 숫자로 시작하는 이름
  • 공백이 포함된 이름

함수, 메서드, 인스턴스 이름은 첫 글자를 소문자로 사용하는 소문자 카멜케이스(Lower Camel Case)를 사용합니다.

클래스, 구조체, 익스텐션, 프로토콜, 열거형 이름은 타입의 이름이기 때문에 첫 글자를 대문자로 사용하는 대문자 카멜케이스(Upper Camel Case)를 사용합니다.

대소문자를 구별합니다. 예를 들어 Varvar를 다르게 인식합니다.

예약어와 키워드 예약어는 프로그래밍 언어에서 미리 사용하기로 약속되어 있는 단어로, 식별자로 사용할 수 없는 단어를 뜻합니다. 키워드는 프로그래밍 언어 문법의 일부로, 특별한 의미를 갖는 단어를 뜻합니다. 스위프트의 키워드는 대부분 예약어입니다.

변수와 상수

변수

프로그래밍을 해보신 분들이라면 변수와 상수가 어떤 역할을 하는지 다들 알고 계시겠지요?
프로그램에서 사용되는 데이터를 메모리에 임시적으로 저장하기 위하여 변수나 상수를 이용합니다. 이때 변수와 상수는 특정 데이터 타입에 해당하는 값의 이름입니다.

변수는 생성 후 데이터 값을 변경할 수 있지만, 상수는 한 번 값을 설정하면 추후에는 변경할 수 없습니다.

스위프트에서 변수를 생성하려면 var 키워드를 사용합니다.

var [변수명]: [데이터 타입] = [값] 의 형태로 선언합니다.
변수를 생성할 때 데이터 타입은 생략할 수 있습니다.
큰따옴표(“)로 묶인 데이터는 문자열을 의미합니다.

var name: String = "yagom"
var age: Int = 100
var job = "iOS Programmer" // 타입 추론이 사용되었습니다
var height = 181.5 // 타입 추론이 사용되었습니다

age = 99        // 변수는 값을 변경해 줄 수 있습니다.
job = "Writer"  // 값을 변경할 때에는 기존과 동일한 타입의 값을 할당해 주어야 합니다.

주석(Comment)코드 중간중간 // 기호 뒤에 녹색으로 붙은 글귀는 주석입니다. 즉, 코드에 해당하는 설명을 덧붙이기 위한 메모라고 생각하면 됩니다. 주석은 프로그램이 실행될 때 코드로서 실행되지는 않습니다. 사람이 코드를 읽기 편하도록 하기위한 보조수단입니다.

타입 추론변수나 상수를 생성할 때 데이터 타입을 생략하면 컴파일러가 변수 값의 타입을 추론하여 타입을 지정합니다. 애플은 이런 타입 추론을 스위프트의 강력한 기능이라고 소개했지만, 스위프트에 익숙하지 않은 프로그래머에게는 오히려 독이 될 수 있습니다. 그러다 보니 저는 타입 추론을 많이 사용하지는 않습니다. 자칫 잘못된 타입 추론으로 인해 오류가 생기면 이 오류를 찾는데 상당한 시간이 걸릴 수도 있습니다. 타입을 명확히 지정하지 않아 발생하는 오류를 찾아내는 것보다 처음부터 타입을 명시하는 편이 시간을 더 절약할 수 있습니다.


[플레이그라운드 실행결과]

스위프트에서 세미콜론 스위프트에서 명령구문 뒤에 세미콜론(;)을 붙이는 것은 선택사항입니다. 기존 프로그래밍 언어의 습관대로 구 문 뒤에 세미콜론을 붙이셔도 상관 없습니다.

상수

스위프트에서는 let 키워드를 사용해서 상수를 생성합니다.
let [상수명]: [데이터 타입] = [값] 의 형태로 선언합니다.
변수 생성과 마찬가지로 상수 생성 때도 데이터 타입을 생략할 수 있습니다.

let name: String = "yagom" // 차후 변경하지 않는 값은 상수로 선언합니다.
var age: Int = 100
var job = "iOS Programmer"  // 타입 추론이 사용되었습니다.
let constHeight = 181.5

age = 99        // 변수는 값을 변경할 수 있습니다.
job = "Writer"  // 값을 변경할 때에는 기존과 동일한 타입의 값을 할당해야 합니다.
name = "야곰"    // 상수로 선언된 값은 변경할 수 없습니다. 오류가 발생합니다.

변수를 사용하지 않고 상수를 사용하는 이유는 다양합니다. 하지만 가장 중요한 이유는 가독성입니다. 상수는 변하지 않는 값입니다. 때문에 상수로 값을 선언하면, 이후 코드에서 값의 변화가 없다는 사실을 주석이나 API 문서 등을 살펴보지 않고서도 직관적으로 알 수 있습니다. 즉, 차후 값의 변경을 신경쓰지 않아도 된다 는 것입니다. 예를 들어 원주율 값은 (아직까지는) 공식적으로 불변하는 값이므로 상수로 선언하는 것이 좋습니다. 또, 특정 값에 특별한 의미를 부여할 때 사용할 수도 있습니다. 예를 들어 입력받는 수의 최대 크기가 100이 라고 한다면, 100이라는 숫자에 의미를 부여하기 위해 let maxInputValue = 100 등으로 선언해두면 차후에 직관적으로 읽기도, 사용하기도 편리할 것입니다.


[플레이그라운드 실행결과]

플레이그라운드 실행결과를 보면 왼쪽에 빨간 동그라미를 통해 해당 줄에서 오류가 발생했음을 확인할 수 있습니다.
상수의 값을 차후에 변경하려고 했기 때문에 컴파일러가 프로그래머가 발생시킨 오류를 알려준 것입니다. 오류가 발생한 곳을 삭제하거나 수정하면 정상작동 합니다.


[오류 수정 후 플레이그라운드 실행결과]

콘솔 로그 남기기

프로그램에서 로그란, 애플리케이션의 상태 또는 애플리케이션 내부 로직의 흐름을 관찰할 수 있도록 출력한 정보를 의미합니다. 콘솔 로그(Console Log)는 디버깅 중 디버깅 콘솔에 보여줄 로그를 뜻합니다. 스위프트에서는 print( ) 함수를 사용하여 콘솔 로그를 출력할 수 있습니다. print 함수의 매개변수 타입은 문자열입니다. 그래서 print 함수의 전달인자로 문자열을 전달해 주어야합니다. 기본적으로 print("Hello Swift!")와 같이 사용하면 디버깅 콘솔에서 ‘Hello Swift!’라는 로그를 디버깅 콘솔에서 확인할 수 있습니다. print 함수는 로그를 출력한 뒤에 줄바꿈을 해주기 위해 줄바꿈 문자(\n) 를 자동으로 삽입해줍니다.

콘솔 로그의 print함수에 대한 이해가 잘 가지 않는다면 다음 포스팅에 이어질 함수의 내용을 참고하세요.

문자열 보간법(String Interpolation)은 변수 또는 상수 등의 값을 문자열 내에 나타내고 싶을 때 사용합니다. 문자열 내에 (변수나 상수) 의 형태로 표기하면 이 변수나 상수를 문자열로 치환해서 넣어줍니다.

기본 데이터 타입

스위프트에서 기본으로 제공하는 데이터 타입(자료형)에 대해 알아보겠습니다.

IntUInt

정수 타입입니다. Int+, - 부호를 포함한 정수를 뜻하며 이 중 - 부호를 포함하지 않고 0 을 포함한 양의 정수는 UInt로 표현합니다. IntUInt형의 최댓값과 최솟값은 각각 maxmin 프로퍼티로 알아볼 수 있습니다.
IntUInt는 각각 8비트, 16비트, 32비트, 64비 트의 형태를 가지고 있습니다.

var integer: Int = -100
let unsignedInteger: UInt = 50 // UInt 타입에는 음수 값을 할당할 수 없습니다.
print("integer 값 : \(integer), unsignedInteger 값 : \(unsignedInteger)")
print("Int 최댓값 : \(Int.max), Int 최솟값 : \(Int.min)")
print("UInt 최댓값 : \(UInt.max), UInt 최솟값 : \(UInt.min)")

let largeInteger: Int64 = Int64.max
let smallUnsignedInteger: UInt8 = UInt8.max
print("Int64 최댓값 : \(largeInteger), UInt8 최댓값 : \(smallUnsignedInteger)")

let tooLarge: Int = Int.max + 1 // Int의 표현 범위를 초과하므로 오류를 냅니다. 
let cannotBeNegetive: UInt = -5 // UInt는 음수가 될 수 없으므로 오류를 냅니다.

integer = unsignedInteger // 오류! 스위프트에서 Int와 UInt는 다른 타입입니다. 
integer = Int(unsignedInteger) // Int 타입의 값으로 할당해주어야 합니다.


[플레이그라운드 실행결과]

Bool

Bool은 불리언 타입입니다. 불리언 타입은 참(true) 또는 거짓(false)만 값으로 가집니다.

let boolean: Bool = true
let iLoveYou: Bool = true
let isTimeUnlimited: Bool = false
print("시간은 무한합니까? : \(isTimeUnlimited)")


[플레이그라운드 실행결과]

FloatDouble

FloatDouble은 부동소수점을 사용하는 실수형이며 부동소수 타입이라고 합니다. 흔히 우리가 말하는 소수점 자리가 있는 수입니다. 부동소수 타입은 정수형보다 훨씬 넓은 범위의 수를 표현할 수 있습니다. 스위프트에는 64비트의 부동소수 표현을 하는 Double과 32비트의 부동소수 표현을 하는 Float이 있습니다. 64비트 환경에서 Double은 최소 15자리의 십진수를 표현할 수 있는 반면에 Float은 6자리의 숫자까지만 표현이 가능합니다. 필요에 따라 둘 중 하나를 선택하여 사용할 텐데 무엇을 사용해야 할지 잘 모르는 상황이라면 Double을 사용하길 권합니다.

var floatValue: Float = 1234567890.1 
// Float이 수용할 수 있는 범위를 넘어섭니다. 
// 자신이 감당할 수 있는 만큼만 남기므로 정확도가 떨어집니다.

let doubleValue: Double = 1234567890.1 // Double은 충분히 수용할 수 있습니다. 

floatValue = 123456.1 // Float이 수용할 수 있는 범위의 수로 변경합니다.

Character

Character는 말 그대로 ‘문자’를 의미합니다. 단어, 문장처럼 문자의 집합이 아닌 단 하나의 문자를 의미합니다. 스위프트는 유니코드 문자를 사용하므로 영어는 물론, 유니코드에서 지원 하는 모든 언어 및 특수기호 등을 사용할 수 있습니다. 문자를 표현하기 위해서는 값의 앞뒤 에 큰따옴표를 사용하여 표현합니다.

let alphabetA: Character = "A"
print(alphabetA)

let commandCharacter: Character = "♡"
// Character 값에 유니코드 문자를 사용할 수 있습니다.
print(commandCharacter)

let 한글변수이름: Character = "ᄀ"
// 한글도 유니코드 문자에 속해 있으므로 스위프트 코드에 변수 이름으로 사용할 수 있습니다. 

print("한글의 첫 자음 : \(한글변수이름)")


[플레이그라운드 실행결과]

String

String은 문자의 나열, 즉 문자열입니다.
StringCharacter와 마찬가지로 유니코드를 사용할 수 있으며, 값의 앞뒤에 큰따옴표를 사용하여 표현합니다.

let name: String = "yagom" // 상수로 선언된 문자열은 변경이 불가능합니다.

// 이니셜라이저를 사용하여 빈 문자열을 생성할 수 있습니다.
// var 키워드를 사용하여 변수를 생성하였으므로 문자열의 수정 및 변경이 가능합니다.
var introduce: String = String()

introduce.append("제 이름은")
// append() 메서드를 사용하여 문자열을 이어붙일 수 있습니다.

introduce = introduce + " " + name + 입니다.
// + 연산자를 통해서도 문자열을 이어붙일 수 있습니다.
print(introduce)


[플레이그라운드 실행결과]

이번에 스위프트의 기초적인 문법과 데이터 타입에 대해 알아봤습니다.

다음 포스팅에서는 컬렉션 타입과 함수에 대해 알아보겠습니다.
다음 번에 또 뵈어요~ 고맙습니다 :D-

본 글의 일부내용은 필자의 저서 [스위프트 프로그래밍](2017, 한빛미디어)(http://www.hanbit.co.kr/store/books/look.php?p_code=B5682208459)에서 요약, 발췌하였음을 알립니다.

스위프트의 문법에 대해 더 알아보고 싶다면 애플의 Swift Language Guide[https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html]를 참고해도 많은 도움이 됩니다.

by yagom


facebook : https://www.facebook.com/yagompage
facebook group : https://www.facebook.com/groups/yagom/

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.
RSS Feed 받기

This Post Has 2 Comments

댓글 남기기

Close