Swift 기초 문법
1. Hello World!
1. Comment 주석
- sample code
// 한줄 주석 /// 한 줄 주석 + Quick Help Markup /* 한 줄 이상 주석 */
- result
2. 출력하기
- sample code
print(3.14) // 3.14 var num = 1 print(num) // 1 print("숫자",num) // 숫자 1 print("숫자 \(num) ") // 숫자 1 print("숫자 " + String(num)) // 숫자 1
- result
3. 구문 끝의 세미콜론(Semicolon)은 생략이 가능 ( ; )
- 각 라인의 마지막에 붙는 ; 은 옵션
- 한 라인에 다중 명령을 사용할 때 필수
- sample code ` print(1); print(2); print(3); `
- result
- 에러메세지 없이 잘 실행됨
4. 스위프트는 대소문자를 구분
var a = 30
var A = 40
- ‘a’ 와 ‘A’ 는 완전히 서로 다른 변수임
2. Constansts and Variables (상수와 변수)
- 상수와 변수는 현재 어떤 데이터에 대한 상태값, 속성 정보 등을 담고 있는 컨테이너
- 상수 (Constants) : 변하지 않을 값을 저장
- 변수 (Variables) : 프로그램의 실행에 따라 변하는 값을 저장
let maxStudent = 30
maxStudent = 20 // error 변경 불가
var numStudent = 15
numStudent = 10 // ok 변경 가능
1. Naming
- 변수 이름을 정할 때 의미, 방식, 길이 등 확인
- 영어 외에도 유니코드 문자를 포함한 대부분의 문자를 사용해 변수 이름 짓기 가능
- 이모티콘도 지원함
- Swift 에서 사용되는 키워드일 경우 backquote (
`
) 를 이용해 사용 가능
let `let`=1
- 변수로 사용 할 수 없는 이름
- 같은 스코프 범위 내에서 중복되는 이름
스코프 <- 같은 영역
let a = 1
let a = 2 (x)
let a = 1
func add(){
let a = 2
} (o)
- 공백
- 수학 기호
- 화살표
- 숫자로 시작하는 이름 ( 시작 외에는 사용 가능 )
2. Type Annotation & Type Inference
1. Type Annotation ( 타입 명시 )
- 선언 시 자료의 타입을 명확하게 지정
let thisYear : Int = 2018
let thisLanguage : String = " Swift 4 "
var num : Double = 3.14
2. Type Inference ( 타입 추론)
- 변수 선언 시 초기화로 사용되는 값의 타입을 통해 변수의 타입을 추론하여 적용
let name = "Dean" // String 로 추론
let char = "A" // String 로 추론
var age = 24 // Int 로 추론
var weight = 66.7 // Double 로 추론
- swift 는 문자도 문자열로 추론함 그러므로 문자로 지정하고 싶을 때는 타입 명시를 해주어야함
- float 변수 형을 사용 하고 싶을 때 타입 명시 해야함
type(of:index)
: index의 타입 확인 가능
3. Literals & Types
- 상수 : 고정된 값 (메모리 주소) 을 가지는 심볼 또는 식별자
- 리터럴
- 고정된 값으로 표현되는 문자 (데이터) 그 자체
- 정수/실수/문자/문자열/불리언 리터럴 등
- Int : 정수값을 저장
- UInt : 양의 정수값을 저장, 양의 정수 범위만 다루는 데이터에는 Int 보다 훨씬 효율적
- Double : 실수값을 저장, 64bit 부동소수점 자료형, 소수점 아래 15~16자리의 값에 대한 정확도를 보장
- Float : 실수값을 저장, 32bit 부동소수점 자료형 , 소수점 아래 7~8자리까지의 값을 정확하게 저장
- Bool : true or false 두 가지 종류의 값만 저장, 논리값
- String : 문자열을 저장
- Character : 단 한개의 문자를 저장할 수 있는 단일 자료형
4. Typealias
- 문맥상 더 적절한 이름으로 기존 타입의 이름을 참조하여 사용하고 싶을 경우 사용
-
typealias type name = type expression
- ex)
typealias AudioSample = UInt16
var maxAmplitudeFOund = Audio.Sample.min
5. Type Conversion (타입 변환)
var num = 10
var doubleNum=Double(num) // Double로 변환
var i = 20
var j = 5.6
var k = 0.0
k = j * Double(i) // int 와 double 연산 하는 방법
- 서로 다른 타입은 비교하거나 연산 불가
let h = UInt8(25)
let x = 10 * h
type(of:x) // UInt8 로 추론
- 위 코드가 실행되는 이유는 10 이라는 상수가 타입이 명시 되어있지 않기 때문에 h의 타입인 UInt8 로 추론되어 * 연산이 되기 때문
Q. 양수 사용 시 Int / UInt 중 어느 것이 좋을까?
- A. Int
- why? 연산 중 음수가 나오는 경우도 있으므로 안전성이나 사용성, 타입 추론, 변환 등 에서 Int 가 유리함
Q. magnitude 와 abs 의 차이점
let number : Int = -15
let magnitudeNumber = number.magnitude // UInt 타입으로 변경
let absNumber = abs(number) // 기존 타입을 유지하면서 양수로 변경
- magnitude는 UInt 으로, abs는 Int 로
- abs 가 절대값을 구할 때 더 편함, abs는 항상 같은 타입으로 반환해주기 때문에
3. Basic Operators
1. Unary Operator (단항 연산자)
-a // 항 하나만으로 연산 가능
2. Prefix (전위 표기법)
-a // 변수 앞에 연산자를 표기
3. Postfix (후위 표기법)
c! // 변수 뒤에 연산자를 표기
4. Binary Operator (이항 연산자)
a + b // 항이 두가지 있어야 연산 가능
5. Infix (중위 표기법)
a + b // 항 사이에 표기
6. Ternary Operator (삼항 연산자)
- Swift 에서 삼항 연산자는 단 하나
a > 0 ? "positive" : "negative" // a 가 0 보다 크면 positive 작으면 negative
7. 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
8. Overflow
- overflow 연산하고 싶을 때 & 사용 ` var add : Int8 = Int8.max &+ 1`
9. Comparison Operators ( 비교 연산자 )
- Equal to operator
a == b
- a 와 b 가 같으면 true, 같지 않으면 false
- Not equal to operator
a != b
- a 와 b 가 같지 않으면 true, 같으면 false
- Greater than operator
a > b
- a 가 b 보다 크면 true, 그렇지 않으면 false
- Greater than or equal to operator
a >= b
- a 가 b 보다 크거나 같으면 true, 그렇지 않으면 false
- Less than operator
a < b
- a 가 b 보다 작으면 true, 그렇지 않으면 false
- Less than or equal to operator
a <= b
- a 가 b 보다 작거나 같으면 true, 그렇지 않으면 false
10. Logical Operators ( 논리 연산자 )
- Logical AND Operator
- a && b , a 와 b 모두 true 면 true, 둘 중 하나라도 false 면 false
true && true //t true && false //f false && true //f false && false //f
- a && b , a 와 b 모두 true 면 true, 둘 중 하나라도 false 면 false
- Logical OR Operator
- a || b , a 또는 b 둘 중 하나라도 true 면 true, 둘 다 false일 때 false 반환
true || true //t true || false //t false || true //t false || false //f
- a || b , a 또는 b 둘 중 하나라도 true 면 true, 둘 다 false일 때 false 반환
- Logical Negation Operator
- !a , a 가 true 면 false, false 면 true
!true //f !false //t
- !a , a 가 true 면 false, false 면 true
11. Range Operators ( 범위 연산자 )
- Closed Range Operator
0...100
: 0 부터 100 까지 ( 0 과 100 을 포함 )
- Half-Open Range Operator
0..<100
: 0 부터 99 까지 ( 0만 포함 )
- One-Sided Ranges
1...
: 1 부터 쭉 ( 1 포함 )...100
: ~ 100 까지..<100
: ~ 99 까지
4. Function
- 일련의 작업을 수행하는 코드 묶음을 식별할 수 있는 특정한 이름을 부여하여 사용하는 것
1. Input 과 Output 이 모두 있는 것 (Function)
func getNum(num:Int)-> Int{ // getNum() Int 형을 받음
var a : Int = 10
return a // output a
}
2. Input 이 없고 Output 만 있는 것 (Generator)
func getNum()->Int{
return a
}
3. Input 이 있고 Output 은 없는 것 (Consumer)
func getNum(num : Int){
code
}
4. Input 과 Output 이 모두 없는 것
func getNum(){
code
}
5. Argument Labels and Parameter Names
func someFunction(firstParameterName : Int, secondParameterName : Int){
print(firstParameterName, secondParameterName)
}
- Argument Labels : 함수 밖에서 불리는 이름 ex) firstParameterName, secondParameterName
- Parameter Names : 변수 타입 ex) Int Double String etc…
Parameter
- 매개변수 = 인자 = Parameter
- 인수를 담는 변수의 한 종류로서 해당 함수 내부 스코프에만 영향
- 대부분 call by value 가 기본
- call by reference 는 호출할 때 사용한 전달인자에까지 영향
Argument
- 전달인자 = 인수 = 실인수 = Argument
- 함수 호출 시 그에 필요한 데이터를 전달
Q. Argument Labels 와 Parameter Names 를 다르게 하는 이유?
- A. 동일하게 지정하면 함수 밖에서 사용하거나 협업하는 타인이 코드를 볼 때 무슨 내용인지 이해하기 쉽지 않기 때문에 이름을 다르게 하여 코드 내용의 이해를 돕기 위해
6. Omitting Argument Labels
-
Argument Label 의 생략이 가능한 경우 _ 를 사용하여 생략
func someFunction(_ firstParameterName : Int, secondParameterName : Int){ code } someFunction(10, secondParameterName: 29)
7. Default Parameter Values
-
기본값 주기
func someFunction(first : Int = 10, second : Int){ } someFunction(second : 20) // first에 자동으로 10이 들어감
8. Variadic Parameters
-
같은 타입의 변수를 하나 이상 입력할 때 사용
func getGrade(_ score : Double...)->Double{ var total=0.0 for number in score{ total+=number } return total/Double(score.count) } getGrade(4.5, 4.0, 4.4, 4.1)
9. Nested Functions
-
외부에는 숨기고 함수 내부에서만 사용할 함수를 중첩하여 사용 가능
func outsideFunction(){ func inside1Function(){ } func inside2Function(){ } if { inside1Function() } else { inside2Function() } }