-
[Swift] Swift 기본 문법 - iOS 앱 개발 강좌CSE/Swift 2016. 3. 6. 16:00
Swift 기본 문법
1. 스위프트(Swift)의 문법적 특성
- 헤더 파일(Header File)을 작성할 필요가 없습니다.
C 프로그램은 전처리를 위해 헤더 파일과 소스 파일이 분리되어 있습니다. 헤더 파일에는 함수의 원형과 전역 변수의 선언들이 있고, 선언된 함수나 변수를 사용하기 위해 헤더 파일을 읽어들입니다. 오프젝티브-C 역시 헤더 파일과 메인 파일로 구분되어 있는데, 헤더 파일에서는 클래스의 원형인 인터페이스를 선언하고 메인 파일에서는 이 인터페이스에 대한 내용을 구현합니다.
그러나, 스위프트에서는 전처리를 위한 헤더 파일을 사용하지 않습니다. 하나로 통합된 스위프트 파일내에서 함수와 전역 변수, 클래스와 구조체를 선언하고 자유롭게 사용할 수 있습니다. 스위프트에서는 클래스나 구조체를 선언할 때 정의(Interface)와 구현(Implementation)이 분리되지 않고 통합되는 특성이 있습니다.
- 대소문자를 구분합니다.
변수나 상수, 메소드, 클래스 등을 선언 할 때 대소문자를 구분하여 사용합니다. 대문자 A와 소문자 a는 서로 다른 문자입니다.
12let A = 30let a = 20cs 이러한 특성 때문에 함수나 메소드, 클래스, 구조체 등에 이름을 정할 때 다음과 같은 규칙을 지켜주는 것이 좋습니다.
- 함수와 메소드, 인스턴스명의 첫 글자는 소문자
- 클래스와 구조체, 프로토콜, 확장체 등 객체의 첫 문자는 대문자
- 구문 끝의 세미콜론은 옵션입니다.
모든 구문의 끝을 ;(세미콜론)으로 마감해야 하는 오브젝티브-C와 달리, 스위프트에서는 세미콜론을 사용할 필요가 없습니다.
- 시작점(Entry point)으로 사용되는 main() 함수가 없습니다.
시스템에서 main() 함수를 호출하는 것을 시작으로 프로그램이 실행되는 오브젝티브-C와 달리, 스위프트는 필요가 없습니다.
대신 맨 위에 있는 구문부터 순서대로 해석하고 실행합니다. 즉, 스위프트 내의 특정 함수 내부에 작성된 구문이 아닌, 한, 전역 범위에서 작성된 구문을 위에서부터 차례로 해석하여 실행합니다. 스위프트로 작성된 앱은 main() 함수 시작점이 없는 대신, @UIApplicationMain 어노테이션을 사용해 앱의 시작 객체를 지정합니다.
12345import UIKit@UIApplicationMainclass AppDelegate : UIResponder, UIApplicationDelegatecs - 문자열뿐만 아니라 문자도 큰따옴표를 사용합니다.
스위프트에서는 String형이나 Character 형에 상관없이 모두 큰 따옴표를 사용해서 표시합니다.
- import 키워드를 사용하지만, 라이브러리와 프레임워크의 참조 용도입니다.
스위프트에서 import구문은 프레임워크나 외부 라이브러리를 사용하기 위한 목적으로만 사용합니다. 같은 프로젝트 내에 선언된 다른 객체를 호출할 때 별도의 import 구문없이도 참조할 수 있도록 프로젝트 범위의 네임인터페이스가 제공되기 때문입니다.
다음은 새 플레이그라운드를 생성했을 시에 작성되는 기본 코드입니다. 3번째 줄에서 import 키워드를 사용해서 UIKit 프레임워크를 호출하고 있는 모습을 확인할 수 있습니다.
123456// Playground - nooun: a place where people can play// 라이브러리 호출하기 위해 사용된 import 키워드import UIKitvar str = "Hello, Playground"cs - try ~ catch 방식의 예외 처리를 지원합니다.
스위프트2에서 새로 추가된 부분입니다. 기존의 옵셔널(Optional)을 사용해서 예외 처리를 지원했으나, 한계를 극복하지 못하여, 다양한 오류를 처리할 수 있도록 예외 처리를 위한 구문인 try ~ catch 구문을 도입한 스위프트 2를 발표했습니다.
2. 변수와 상수
스위프트에서는 데이터가 저장되는 메모리 내 주소 공간을 개발자가 쉽게 인식하고 필요한 시점에 사용할 수 있도록 이름으로 연결된 변수와 상수를 제공합니다. 쉽게 설명하자면, 변수와 상수에는 우리가 필요로 하는 값을 저장해놓고 필요할 때 꺼내어 사용할 수 있다는 것입니다.
다른 언어에서와 마찬가지로 변수와 상수는 값을 저장할 수 있는 컨테이너 역할을 하는 공통점은 있고, 상수는 한 번 값이 저장되면 변경이 안되는 점과 변수는 필요에 따라서 여러 번 값을 변경할 수 있습니다. 또한, 변수에 다른 값을 변경할 때 초기에 선언한 값과 동일한 타입이여야 합니다.
2-1. 선언과 초기화
스위프트에서 변수와 상수는 반드시 선언한 다음에 사용해야 합니다. 다음은 변수와 상수를 선언하고 값을 저장하는 예입니다.
1234567891011121314//: Playground - noun: a place where people can playimport UIKit// 정수형 변수와 문자열 변수 선언var year = 2016var message = "Hello Swift"// 정수형 상수와 문자열 상수 선언let birthYear = 1991let welcomeMsg = "Hi!"cs 변수와 상수를 선언하려면 키워드를 사용해야 하는데, 변수는 var 키워드, 상수는 let 키워드를 사용합니다.
- 변수 선언 : var 키워드
- 상수 선언: lat 키워드
위 예제에서는 변수를 선언과 동시에 초기화를 해주었습니다. 하지만, 변수는 초기화를 따로 분리하여 쓸 수 있습니다.
123var year : Intyear = 2016cs 위 예제에서는 변수의 선언과 함께 변수의 자료형을 정의해 주었습니다. 그런 뒤에 변수를 초기화하여 2016이라는 숫자로 초기화했습니다.
2-2. 이름 짓기
스위프트에서 변수나 상수의 이름을 정의할 때는 몇 가지 규칙을 지켜서 정의해야 합니다. 그러면 하나하나 알아보도록 하겠습니다.
1) 변수와 상수명으로 문자와 숫자, 또한 한자나 이미지용 바이너리 코드까지 지원합니다.
12345678910111213141516171819202122232425262728//: Playground - noun: a place where people can playimport UIKit// 영어, 숫자, 언더바 사용var str = "문자열"var initInt34 = 34var init_Int = 43// 한글 및 한글 초성, 중성 사용var 갤럭시 = "S7"var ㅇㅇㅍ = "iPhone"var ㅔㅣ = "엘지"// 한글 초성과 알파벳의 혼용 사용var i폰 = "아이폰"let L지 = "LG"// 특수 기호 사용var & = "&"cs 2) 연산자와 혼동되는 [+, -, *, /] 및 공백은 변수, 상수명으로 사용할 수 없습니다. 단, 언더바(_)는 사용가능 합니다.
3) 스위프트에서 이미 사용하는 예약어나 키워드는 변수명으로 사용할 수 없습니다.
4) 변수, 상수명의 첫 번째 자리는 숫자가 올 수 없습니다.
이렇게 4 가지 정도의 규칙을 따르셔서 적용하시면 됩니다. 이 규칙들만 준수하시면 자유롭게 변수와 상수의 이름을 작성할 수 있습니다.
3. 자료형
변수나 상수 등 값을 저장할 수 있는 객체에 숫자, 문자, 논리 등 몇 가지 종류의 타입을 정의하고 그에 맞게 사용해야 합니다. 이를 데이터 타입(Data Type), 즉 자료형이라고 합니다.
자료형이 정의된 변수나 상수는 그 용도에 맞는 형식의 데이터가 입력되어야 하며, 그렇지 않으면 오류가 발생하게 됩니다.
3-1. 기본 자료형
- Int
Int 는 정수를 뜻하는 Integer라는 영어 단어의 줄임말로서 부호 있는 정수형 값을 저장하는 데 사용되는 자료형입니다.
Int 형이 저장할 수 있는 정수형 값의 범위에는 제한이 있는데, 이 제한은 컴퓨터의 CPU에 따라서 결정됩니다. 예를 들어, 8 bit의 CPU를 가진 맥이라면 Int 형에 2 ^ 8 인 256개까지 정수를 저장할 수 있습니다. 그래서 허용 범위는 -128 ~ 127 입니다. 이런 방식으로 CPU에 따라 정수의 범위가 제한이 됩니다.
또한, Int형의 범위를 제한시키는 서브 자료형이 별도로 있습니다. 위 범위처럼 제한을 하고자 한다면 Int8로 기입하시면 됩니다. 마찬가지로, Int16, Int32, Int64도 있습니다.
- UInt
UInt는 Unsigned Integer를 줄인 단어입니다. 부호가 없는 정수란 뜻으로서, Int 형과 마찬가지로 정수형 값을 저장하지만, 음수를 담을 수 없는 자료형입니다. 즉, 나이, 참여 인원 수, 반복 횟수 등을 담는 자료형을 구현할 때 유용하게 쓰입니다.
- Double & Float
이 두 자료형은 실수형 값을 저장할 수 있는 자료형이라는 공통점이 있지만, Double 형은 64bit 부동소수점 자료형으로서 32bit 부동소수점 자료형인 Float보다 더 넓은 범위의 소수점 값을 저장할 수 있습니다.
일반적으로 Float형은 소수점 아래 7~8 자리의 값을 저장하고, Double형은 소수점 15~16자리의 값을 저장할 수 있습니다.
- Bool
Bool은 true/false 두 가지 종류의 값만 가질 수 있는 자료형으로서 주로 논리형을 저장하기 위해 사용됩니다.
- String
String 형은 프로그래밍을 할 때 Int 형과 더불어 가장 많이 사용되는 자료형 중의 하나입니다.
- Character
한 개의 문자를 저장할 수 있는 단일 자료형입니다. 스위프트는 Character 형 데이터의 값을 표현할 때도 String 형과 마찬가지로 큰따옴표를 사용합니다.
1234567891011121314//: Playground - noun: a place where people can playimport UIKitvar firstLetter: Character = "L"var lastLetter: Character = "G"cs 다음으로는 변수와 상수 선언 뒤에 타입 추론과 어노테이션에 대해 알아보도록 하겠습니다.
3-2. 타입 추론과 타입 어노테이션
먼저 예제를 살펴봅시다.
1234567// 선언과 초기화를 동시에var day = 7// 선언과 초기화 분리var year : Intyear = 2016cs 위의 예제처럼 두 가지 방식으로 변수를 선언과 초기화를 할 수 있습니다. 분리를 하게되면 항상 타입 어노테이션을 붙여주셔야 합니다. 빼고선 한 번 보도록 하겠습니다.
위 그림처럼 에러가 발생합니다. 그러므로 변수 선언과 초기화를 분리하게 될 경우, 명시적으로 타입 어노테이션을 붙여줘야 합니다. 동시에 하는 경우에는 자동적으로 타입 추론을 해서 컴파일러가 타입을 지정하기 때문에 명시적으로 지정을 하지 않게 되는 것 입니다.
그러면 꼭 명시적으로 타입을 명시적으로 지정해줘야 하는 경우를 살펴보도록 하겠습니다.
1. 변수나 상수의 선언과 초기화를 분리할 경우
선언과 동시에 초기화를 하는 경우에는 타입 추론을 통해서 자동으로 타입이 결정되므로 타입 어노테이션이 필요없습니다. 하지만 선언과 초기화를 분리하면 타입 추론이 불가능해 집니다. 따라서 이런 경우는 타입을 직접 선언해주는 타입 어노테이션이 필요합니다.
123var company : Stringcompany = "Apple"cs 2. 직접 다른 타입을 지정할 필요가 있을 경우
이 경우는 타입 추론으로 얻어지는 타입이 아닌 다른 타입을 원할 경우 입니다. 예제를 통해서 쉽게 보도록 하겠습니다.
1234var intThree = 3var floatThree : Float = 3cs 이렇게 작성하고선 어떻게 컴파일러가 처리하는 지 보겠습니다.
보시는 바와 같이 Float 형은 실수 형으로 저장되어서 출력되는 것을 볼 수 있습니다.
3-3. 타입이 서로 다른 변수의 결합
프로그래밍 과정에서는 서로 다른 타입으 ㅣ변수나 상수를 결합해야 하는 경우가 간혹 발생합니다. 타입이 서로 다른 변수, 예를 들어 문자열과 숫자를 결합하려면 어떻게 해야 할까요?
12345var grade = "Your grade is "var gradePoint = 99var gradeTotal = grade + String(gradePoint)cs 변수의 값을 다른 타입으로 변경할 필요가 있으면 명시적으로 바꾸고자 하는 타입의 인스턴스를 만들어야 합니다. 다행이 스위프트의 기본 자료형 객체들은 다른 타입의 값을 자신의 타입에 맞게 변환하여 새로운 객체를 만드는 방법을 제공합니다.
요약하자면 정수형 값을 문자열로 바꾸고 싶을 때 아래처럼 String() 생성자를 사용해서 새로운 문자열 인스턴스를 만들 수 있습니다.
String(문자열로 바꾸고 싶은 숫자)
반대로 문자열을 정수형이나 실수형으로 바꾸고자 할 때에도 비슷하게 적용가능 합니다. 문자열을 정수형으로 바꾸려면 다음과 같이 Int() 생성자를 사용해서 새로운 정수 인스턴스를 만들면 됩니다.
Int(정수형으로 바꾸고 싶은 문자열)
문자열 템플릿
C와 오브젝티브-C에서는 변수나 상수의 값을 문자열 속에 포함하기 쉽도록 문자열 포맷을 지원합니다. 이와 비슷한 방식으로 스위프트 역시 변수나 상수의 값을 문자열 속에 포함하기 쉽도록 문자열 템플릿을 지원합니다.
문자열 템플릿은 문자열에서 원하는 위치에 백슬래시(\)를 입력하고, 포함하려는 값이 들어있는 변수나 상수를 괄호로 감싸면 끝입니다.
end
* 이 강좌는 '꼼꼼한 재은씨의 스위프트2 프로그래밍'을 참고해서 작성했습니다.