print(“Hello, world!, Hello Swift”)
Objective-C를 가지고 iOS 개발을 진행하고 있다가도, 마음 한구석에 Swift라는 놈이 신경이 쓰여 이제라도 Swift를 공부하면서 문법에 대해 정리해보려고 합니다.
애플에서 최초에 스위프트를 발표했을 때 스위프트 언어의 특징을 Safe, Modern, Powerful이라고 발표했습니다.
하지만 오픈소스로 전환되면서 특징을Safe, Fast, Expressive라고 변경되었습니다.
이 특징에 걸맞게 정말 멋지게 변하고 있는 언어입니다.
많은 분들이 접해봤을 C++, JAVA등의 언어는 명령형 프로그래밍(절자치향) 객체지향 프로그래밍 패러다임을 동시에 차용한 다중 프로그래밍 패러다임 언어입니다.
하지만Swift는여기에 더해서함수형 프로그래밍 패러다임과프로토콜 지향 프로그래밍 패러다임을 더한 언어이고, 스크립트 언어가 아닌컴파일 언어입니다.
# Semicolon (;)
Objective-C를 하다가 혹은, 다른 언어를 하다가 Swift를 처음 접할때 쉽게 적응되지 않는 부분이 Semicolon(;) 녀석입니다.
Swift에선 각 라인의 마지막에 붙는 세미콜론은옵션이고,
한 라인에 여러 구문(다중 명령)을 사용하고 싶을 경우는 세미콜론 필수
print(1); print(2); print(3);
//print(1);
//print(2);
//print(3);
# 주석(Comment)
주석이란 쉽게 말해 소스코드에 메모를 작성하는것 입니다.
주석을 자세히 적어주는게 중요하다는데 먼저 사용하는 이유는
- 빠르게 특정 부분의 코드를 비활성화
- 협업 또는 인계 시 이해를 돕기 위해
- 자기 자신을 위해
- 문서화
사용법
// : 한 줄 주석
/// : 한 줄 주석 + Quick Help Markup
/*
: 멀티 라인 주석 (Nested 가능)
*/
사실 주석이 없이도 쉽게 이해할 수 있을 만한 코드를 짜는 것이 베스트이긴
하지만, 이것 또한 쉽지 않으니 주석을 다는 습관을 들이시는 게 중요합니다.
# 변수와 상수 (Variables And Constants)
상수와 변수는 현재 어떤 데이터에 대한 상태 값, 속성 정보 등을 담고 있는 컨테이너
- 상수 (Constants) : 한 번 설정되면 값 변경 불가
- 변수 (Variables) : 설정한 값을 변경 가능
let maximumNumberOfLoginAttepmts = 10
maximumNumberOfLoginAttepmts = 20 // 불가
var maximumNumberOfLoginAttepmts = 10
maximumNumberOfLoginAttepmts = 20 // 변경 가능
Declare multiple constants or variables
: 한 줄에 다중으로 변수 선언 가능
var x = 0.0, y = 0.0, z = 0.0
x = 1
y = 2
z = 3
Naming
: 영어 외에도 유니코드 문자를 포함한 대부분의 문자를 사용해 네이밍 가능
let π = 3.14159
let 你好 = "你好世界"
let 🐶🐮 = "dogcow"
let 한글 = "세종대왕"
let `let` = 1 // Swift 에서 사용되는 키워드일 경우 backquote(`) 를 이용해 사용 가능
print(π)
print(你好)
print(한글)
print(🐶🐮)
print(`let`)
변수로 사용할 수 없는 이름
- 같은 스코프 범위 내에서 중복되는 이름
- 공백 문자
- 수학 기호 (√, ∑ 등)
- 화살표 (→, ← 등)
- 숫자로 시작하는 이름 (시작 부분 외에는 사용 가능)
// let 공 백 = "X"
// let √ = "root"
// let → = "arrow"
// let 369게임 = "12짝45짝..."
# 타입 명시(Type Annotation)와 타입 추론 Type Inference)
Swift 에는 2가지의 타입이 존재합니다.
Type Annotation
- 변수 선언 시 사용될 자료의 타입을 명확하게 지정하는 것.
let year: Int = 10
let language: String
language = “Swift 4”
var red, green, blue: Double
red = 255.0
green = 150.123
blue = 75
Type Inference
- 변수 선언 시 초기화로 사용되는 값의 타입을 통해 변수의 타입을 추론하여 적용하는 것.
/*
주의
let language
language = "Swift 4" // 이런식으로 타입추론을 쓰게 되면 var로 바꿔줘야 한다. (Type Annotation참고)
*/
let name: String = “Tori”
// type(of: name) -> String
let age: Int = 4
// type(of: age) -> Int
var weight = 6.4
// type(of: weight) -> Double 추론
var spelling = [“T”, “O”, “R”, “I”]
// type(of: spelling) -> Array<String> 타입 추론
type(of:)를 이용해 타입을 확인할 수 있습니다.
# 리터럴(Literals)
- 상수 : 고정된 값(메모리 주소)을 가지는 심벌/식별자
- 리터럴: 변수에 넣는 변하지 않는 데이터를 의미하는 것이다.
- 소스코드에서 고정된 값으로 표현되는 문자(데이터) 그 자체
- 정수/실수/문자/문자열/불리언 리터럴 등
var signedInteger: Int = 123
let decimalInteger = 17
let binaryInteger = 0b1001
//0b로 시작하면 2진법으로 사용가능
let octalInteger = 0o21
//0o로 시작하면 8진법 사용가능
let hexadecimalInteger = 0x11
//0x로 시작하면 16진법 사용가능
var bigNumber = 1_000_000_000
// 숫자가 크면 끊어서 사용할수 있게 Swift에서 제공
bigNumber = 000_001_000_000_000
bigNumber = 0b1000_100_000_000_000
bigNumber = 0o1000_100_000_000_000
bigNumber = 0x1000_100_000_000_000
0b로 시작하면2진법
0o로 시작하면8진법
0x로 시작하면16진법
# Type
Swift의 기본 데이터 타입들
- Bool
- Int, Uint
- Float, Double
- Character, String
Swift는 다른 데이터 타입과 자료 교환은 불가능!
Bool
- Swift에선 1,0으로 true, false를 표현을 할 수 없다.
- 앞에 is가 붙으면 Bool타입인걸 알 수 있다.
//Bool
var someBool : Bool = true;
someBool = false;
//에러를 발생 (C언어라고 생각하면 안됨, Bool타입에 INT형이 들어간 상황)
//someBool = 0
//someBool = 1
Int, Uint
- 8-bit : Int8, UInt8
- 16-bit : Int16, UInt16
- 32-bit : Int32, UInt32
- 64-bit : Int64, UInt64
- Platform dependent : Int, UInt (64-bit on modern devices)
메모리 사이즈
: MemoryLayout<타입>.size를 사용
타입 범위를 알고 싶을 때
* 타입.max
* 타입.min
MemoryLayout<Int>.size // 8
Int.max // 9223372036854775807
Int.min // -9223372036854775808
MemoryLayout<UInt>.size // 8
UInt.max // 9223372036854775807
UInt.min // 0
MemoryLayout<Int8>.size // 1
Int8.max // 127
Int8.min // -128
MemoryLayout<UInt8>.size // 1
UInt8.max // 255
UInt8.min // 0
Float, Double
- Double - 최소 소수점 이하15 자릿수 이하의 정밀도(Default Type)
- Float - 최소 소수점 이하6 자리수 이하의 정밀도
부동 소수점이므로 소수점 이하의 정밀도는 변경될 수 있음
// 기본타입으로 Double 입니다!
var floatingPointValue = 1.23
type(of: floatingPointValue) // Double
var floatValue: Float = 1.23
type(of: floatValue) // Float
String
- String :문자열타입. 유니코드 사용. 큰따옴표("") 사용.
var str = " " // 이렇게 선언하면 기본으로 String 타입.
var language: String = "Swift4"
Character
- Character :문자타입. 유니코드 사용. 큰따옴표("") 사용.
var nonCharacter = "C"
print(type(of: nonCharacter)) // String타입으로 나온다 (기본 타입이 String이기 때문에)
var character: Character = "C"
print(type(of: character)) // Character타입
character = " "
print(type(of: character)) // Character타입
character = ""
// Character타입이기떄문에 에러가 난다
// ""은 String 표현이고, Charter는 하나의 문자를 사용
# Typealias (별칭)
- 문맥상 더 적절한 이름으로 기존 타입의 이름을 참조하여 사용하고 싶을 경우 사용
- typealias =
- typealias를 쓸 때 이름은 대문자로 시작한다.
typealias MyInt: Int
typealias YourInt: Int
typealias MyDouble: Double
let age: MyInt = 100 // MyInt는 Int의 또 다른 이름
let year: MyDouble = 55.2 // 다른 자료형도 모두 별칭 가능
# Tuple(튜플)
튜플은 타입의 이름이 따로 지정되어 있지 않은, 프로그래머 마음대로 만드는 타입니다.
지정된 데이터의 묶음이라고 표현할 수 있습니다.
var person: (String, Int, Double) = ("jinTonics", 10, 888.5)
// String, Int, Double 타입을 갖는 튜플
print("이름: \(person.0), 나이: \(person.1), 신장: \(person.2)")
// 인덱스를 통해서 값을 가져올 수 있습니다.
//인덱스를 통해 값을 할당할 수 있습니다.
person.1 = 50
person.2 = 111.5
위의 예제를 보면 이름 대신 숫자를 표현하기 때문에 간편해 보일 수 있지만, 차후에 다른 프로그래머가 코드를 볼 때 각 요소가 어떤 의미를 갖는지 유추하기가 쉽지 않고, 이름 없이 인덱스만으로 각 요소의 데이터가 무엇을 나타내는지도 파악하기 쉽지 않습니다.
그래서 튜플의 요소마다 이름을 붙여줄 수도 있습니다.
//String, Int, Double 타입을 갖는 튜플
var person: (name: String, age: Int, height: Double) = ("kim", 28, 200)
// 인덱스를 통해서 값을 가져올 수 있습니다.
print("이름: \(person.name), 나이: \(person.age), 신장: \(person.height)")
# Type Conversion (형식 변환)
- 타입을 다른 타입으로 변환하는 것
- 타입()
ex) Int(), Double()
et height = Int8(5)
// 5를 Int8타입으로 변환
let h = UInt8(25)
// 25를 UInt타입으로 변환
let num = 10
let floatNum = Float(num)
type(of: floatNum) // Float 타입
let signedInteger = Int(floatNum)
type(of: signedInteger) // Int 타입
let str = String(num)
type(of: str) // String 타입
// magnitude, abs
let integer = Int(-15)
let magnitude = integer.magnitude // 15
let absNum = abs(integer) // 15
절대값을 나타내는magnitude와abs는 똑같이 15를 나타내는데 차이점은 무엇일까?
-> magnitude는UInt로 변환, abs는Int로 변환
# Basic Operation
- +
- -
- *
- /
용어
let a = 123
let b = 456
let c: Int? = 789
// Unary Operator (단항 연산자)
-a
// Prefix (전위 표기법)
-a
// Postfix (후위 표기법)
c!
// Binary Operator (이항 연산자)
a + b
// Infix (중위 표기법)
a + b
// Ternary Operator (삼항 연산자)
// Swift 에서 삼항 연산자는 단 하나
a > 0 ? "positive" : "negative"
대입 연산자 (Assignment Operators)
// Basic assignment operator
var value = 0
// Addition assignment operator
value = value + 10
// Subraction assignment operator
value = value - 5
// Multiplication assignment operator
value = value * 2
// Division assignment operator
value = value / 2
// Modulo assignment operator
value = value % 2
// Compound Assignment Operators
value += 10
value -= 5
value *= 2
value /= 2
value %= 2
Swift는++**,**--를 지원하지 않는다.
Ex)value ++,value --
'Swift' 카테고리의 다른 글
[Swift] 프로퍼티(Property) (0) | 2019.07.19 |
---|---|
[Swift] 객체지향 프로그래밍(OOP, Object-Oriented Programming) in Swift (0) | 2019.07.12 |
[Swift] 구조체와 클래스 (0) | 2019.07.12 |
[Swift] Collection Types (0) | 2019.07.12 |
[Swift] 열거형(Enumeration) (0) | 2019.07.12 |