Swift 기본 문법
✔️ 스위프트는 여러 언어의 경험 연장 선상에 있다. 따라서 기존에 어떤 언어를 다루어 본 경험이 있다면 스위프트 문법을 학습하면서 많은 부분이 비슷하다고 여길지도 모른다.
스위프트 기본 문법
- 헤더 파일을 작성할 필요가 없다.
→ 헤더파일과 소스파일이 통합된 하나의 *.swift 파일에서 필요한 내용을 자유롭게 정의하고 사용하면 된다. 스위프트는 클래스나 구조체를 선언할 때
정의
와구현
을 분리하지 않고 통합하여 작성하는 특징이 있다.
- 스위프트는 대소문자를 구분한다. 따라서 다음과 같은 관례를 지키는 것이 좋다.
- 함수와 메소드, 인스턴스 명의 첫 글자는 대문자로
- 클래스와 구조체, 프로토콜 등 객체의 첫 글자는 대문자
var a = 30 var A = 30 -> 두 변수는 완전히 다른 변수이다.
- 구문 끝의 세미콜론은 생략 가능
- 엔트리포인트 (시작점) 으로 사용되는 main() 함수가 없다. 대신,
@UIApplicationMain
어노테이션을 활용하여 앱을 시작하는 객체를 지장한다. 하나의 앱에서@UIApplicationMain
어노테이션이 붙은 객체는 단 하나뿐이어야 한다.
- 문자열 뿐 아니라 문자도 큰 따옴표를 사용한다.
- import 키워드를 사용하지만, 라이브러리와 프레임워크의 참조 용도이다.
- C나 자바처럼 한 줄 주석, 여러 줄 주석 처리 방식을 모두 사용 가능하다.
/* ViewController.swift FriendsCollection Created by exception on 2021/01/18. */ // 주석주석 주석은 중첩하여 사용할 수 있다.
try ~ catch
방식 오류 처리를 지원한다.
변수와 상수
✔️ 값을 저장한, 혹은 저장할 메모리 주소값을 이름으로 연결해 놓은 것을 변수와 상수
라고 한다.
✔️ 변수는 한 번 저장된 값을 다른 값으로 변경할 수 없는 반면에 변수는 필요에 따라 저장된 값을 몇 번이라도 다른 값으로 변경할 수 있다.
✔️ 변수라고 해서 아무 값이나 마음대로 저장할 수 있는 것은 아니다. 변수의 값을 변경할 때에는 처음 저장했던 값과 일치하는 타입이어야 한다.
✔️ 프로그래밍 소스 관리 목적상 변하지 않는 값은 상수에 저장하는 것이 훨씬 효율적이다. 실수로 값이 변경되는 것도 막을 수 있고, 값의 성격이 명확히 분류되어 관리에도 용이하기 때문이다.
✔️ 억지로 자료형을 집어넣으면? → 에러 발생! (컴파일 에러
)
변수와 상수 정의
변수를 선언할 때 : var + 변수명
상수를 선언할 때 : let + 상수명
var year = 1999 // 정수형 변수
let message = "Hello, world" // 문자열 변수
🚀 스위프트에서는 선언과 초기화를 분리할 수도 있다.
var year: Int // 정수형 변수 선언
year = 1999 // 초기화
🚀 변수와 상수의 이름 정의하기
- 알파벳과 한글 자음 및 모음, 아라비아 숫자를 사용할 수 있으며, 특수 기호나 한자, 이미지용 바이너리 코드까지 사용할 수 있다.
var str = "HI" var 마스터 = "저자" var aㅁs = 20.13 var ❤️ = "H"
- 연산자와 혼동할 수 있는 [ +, - , *, / ] 및 공백은 변수, 상수 명에 사용할 수 없다. 단, _ (언더바)는 사용할 수 있다.
var ab+c = "ab plus c" // X var ab_c = "ok" // OK
- 스위프트에서 예약어나 키워드로 등록되어 있는 단어는 변수나 상수명에 사용될 수 없다. 단, 대소문자를 바꾸어 사용하는 것은 가능하다.
var class = 1 // X var enum = 2 // X var extension = 3 // X var Class = 1 // O var Protocol = 2 // O
- 변수나 상수명의 첫 번째 자리에 숫자가 올 수 없다.
var 1abc = 123 // X var abc2 = 123 // O var a2cb2 = 123 //O
기본 자료형
🚀 Int
- 부호 있는 정수값을 저장할 수 있다.
- -128 부터 127까지의 값을 저장할 수 있다.
(8bit)
Int8
,Int16
,Int32
,Int64
서브 자료형
- 각각 8bit, 16bit, 32bit, 64bit의 크기
🚀 UInt
- Unsigned Integer를 줄인 단어로 부호가 없는 정수를 의미한다.
- 0을 포함하여 자연수 범위의 정수를 저장할 수 있다.
- 저장할 수 있는 범위는 0 ~ 255
- UInt도
UInt8
,UInt16,
UInt32
,UInt64
로 구분된 서브 자료형 존재
- 각 서브 자료형의 최소값은 0이고, 서브 자료형별 최대값은
(Int 서브 자료형 최대값 x 2) + 1
이다.
🚀 Double & Float
- Float 타입은 32bit 부동 소수점 자료형 ( 소수점 아래 7~8 자리까지의 값을 정확하게 저장 가능 )
- Double 타입은 64bit 부동 소수점 자료형 ( 소수점 아래 15 ~ 16 자리까지의 값을 정확하게 저장 가능 )
- Double값이 더 세밀한 값을 저장하는 데에 유리하고 당연히 메모리에서 차지하는 크기도 크다.
- Float 타입의 서브 자료형으로 사용되는 Float32와 Float64는 실제로 존재하는 객체가 아니라
typealias
에 의해 정의된 타입들이다. 여기서typealias
란, 타입을 가리키는 표현만 달리하는 것을 의미한다.
// A 32-bit floating point type
typealias Float32 = Float
// A 64-bit floating point type
typealias Float64 = Double
- 두 타입을 알리어스로 정의하고 있는 구문을 살펴보면 정의된 Float32는 Float이지만, Float64는 Double이다. 32bit 실수는 Float로 처리하고, 64bit 실수는 Double로 처리한다는 의미로 해석할 수 있다.
🚀 Bool
true
/false
두 가지 종류의 값만 가질 수 있는 자료형으로서 주로 논리값을 저장하기 위해 사용된다.
🚀 String
- 문자열을 저장할 때 사용된다.
🚀 Character
- 한 개의 문자를 저장할 수 있는 단일 자료형이다. String 타입에 저장된 문자열을 하나씩 분해하면 Character 타입이 된다.
타입 추론과 타입 어노테이션
타입 어노테이션이란, 변수나 상수를 선언할 때 그 타입을 명시적으로 선언해 줌으로써 어떤 타입의 값이 저장될 것인지를 컴파일러에 직접 알려주는 문법이다.
var name: String // 명시적 String 타입
var firstChr: Character // 명시적 Character 타입
var pi : Float // 명시적 Float 타입
var flag : Bool // 명시적 Bool 타입
타입 추론은 변수나 상수를 초기화할 때 입력된 값을 분석하여 변수에 적절한 타입을 컴파일러가 스스로 추론하는 기능이다.
✔️ 예를 들어, 초기 값으로 "Hi"가 입력되었다면 '아, 이 변수의 타입은 String 이겠군!' 이라고 추론하는 것이다.
✔️ 반드시 타입 어노테이션을 사용해야 하는 다음 두 가지 경우를 제외하면 타입을 명시적으로 선언하지 않아도 된다.
- 선언과 초기화를 분류할 경우
// 선언 + 타입 어노테이션 var year : Int // 초기화 year = 1999
- 타입 추론으로 얻어지는 타입이 아닌, 다른 타입을 직접 지정할 필요가 있을 때
var temper1 = 3 // Int 값으로 정의 var temper2 : Float = 3 // Float 타입으로 정의 -> 위의 두 값을 출력해보면 컴파일러는 3과 3.0으로 처리한다.
타입이 다른 변수끼리의 결합
✔️ 스위프트에서는 서로 다른 타입의 변수나 상수끼리의 결합 연산은 허용되지 않는다.
Int(<정수로 바꾸고 싶은 문자열>)
위처럼 새로운 인스턴스를 생성하여 합쳐주면 된다.
🚀 문자열 템플릿
- 변수나 상수의 값을 문자열 속에 포함시키는 방버븡로, 정수나 실수 등의 문자열이 아닌 값도 변환 과정이 없이 사용할 수 있도록 스위프트에서 제공하는 기능이다.
let apple = 3
let banana = 2
print("과일은 총 \(apple + banana)개 입니다.")
연산자
산술 연산자
구분 | 연산자 | 사용 예 | 의미 |
---|---|---|---|
단항 연산자 | - | -a | 값의 부호를 변경 |
이항 연산자 | + | a + b | 두 개의 값을 더함 |
이항 연산자 | - | a - b | 연산자 앞의 값에서 뒤의 값을 뺌 |
이항 연산자 | * | a * b | 두 개의 값을 곱함 |
이항 연산자 | / | a / b | 연산자 앞의 값을 뒤의 값으로 나눔 |
이항 연산자 | % | a % b | 연산자 앞의 값을 뒤의 값으로 나눈 나머지 |
비교 연산자
연산자 | 사용 예 | 의미 |
---|---|---|
< | a < b | a가 b보다 작으면 true, 아니면 false |
> = | a > b | a가 b보다 크면 true, 아니면 false |
< = | a < == b | a가 b보다 작거나 같으면 true, 아니면 false |
≥ | a > == b | a가 b보다 크거나 같으면 true, 아니면 false |
== | a == b | a가 b와 같으면 true, 같지 않으면 false (수학에서의 =와 같음) |
! = | a ! = b | a와 b가 같지 않으면 true, 같으면 false |
논리 연산자
연산자 | 사용 예 | 의미 |
---|---|---|
! (NOT) | !a | a가 true이면 false, false이면 true 반환 |
&& (AND) | a && b | a와 b 모두 true일 때 true, 둘 중 하나라도 false이면 false 반환 |
|| (OR) | a || b | a 또는 b 둘 중 하나라도 true라면 true, 둘 다 false일 떄 false 반환 |
범위 연산자
🚀 닫힌 범위 연산자 : 주어진 피연산자 a, b를 포함하는 범위를 나타내는 연산자
1 ... 5
연산자가 나타내는 값 : 1, 2, 3, 4, 5
🚀 반 닫힌 범위 연산자 : 주어진 양쪽 경계 중에서 왼쪽은 포함, 오른쪽은 포함하지 않는 연산자, 반대로 사용 불가
1 ..< 5
1, 2, 3, 4
// 1 >.. 5 는 불가!
대입 연산자
대입연산자 | 사용 예시 | 의미 |
---|---|---|
= | a = 1 | 변수 a에 1을 대입 |
+= | a += 1 | a = a + 1 |
-= | a -= 3 | a = a - 3 |
*= | a *= 3 | a = a * 3 |
/= | a /= 3 | a = a / 3 |
%= | a %= 3 | a = a % 3 |
<< = | a << = 3 | a = a << 3 |
>> = | a >> = 3 | a = a >> 3 |
&= | a &= 3 | a = a & b |
^= | a ^= 3 | a = a ^ b |
|= | a |= 3 | a = a | b |