문법적인 부분이 공부할게 참 많다고 느끼는데다가 뭔가 공부를 제대로 한걸 테스트 할려고 하니 시간이 부족한것같다.
일단 어제에 이어서 계속해서 문법 강의를보면서 정리르하지만 할거랑 신경쓸게 많은것같다
(개념적인 부분은 알지만 문법적, 혹은 부가설명에서 꼬리물고 나오는 내용들때문에 계속 시간이 지연되는것같다)
일단 오늘 보면서 정리를 한 내용들이다.
함수는 재사용이 가능한 코드의 집합으로, 특정 작업을 수행하는 코드 블록이다.
func
키워드를 사용하여 시작한다.()
를 사용하여 함수를 실행한다.()
안에는 파라미터를 넣을 수 있다.// 함수의 기본 사용방법
// 함수의 정의(선언)
func 함수이름(파라미터 이름: 파라미터 타입) -> 반환타입 {
// 구현부
return 반환 타입의 값
}
// 파라미터가 여러개인 경우
func 함수이름(파라미터1 이름: 파라미터1 타입, 파라미터2 이름: 파라미터2 타입) -> 반환타입 {
// 구현부
return 반환 타입의 값
}
// 파라미터가 없는 경우
func 함수이름() -> 반환 타입 {
// 구현부
return 반환 타입의 값
}
// 반환값이 없는 경우
func 함수이름(파라미터 이름: 파라미터 타입) {
// 구현부
// 반환타입이 없기때문에 return이 없어도 된다.
// 반환타입이 없는데 중간에 함수를 탈출하고 싶을 때 return을 사용할 수 있다.
}
// 파라미터가 없고, 반환값도 없는 경우
func 함수이름() {
// 구현부
}
// 함수실습
// 함수의 선언
func sayHello(name: String) -> String { // sayHello 이름의 함수를 정의합니다. 파라미터는 name이며 타입은 String이고, 함수의 반환값의 데이터타입은 String.
return "\(name)님 안녕하세요!" // 파라미터 name을 사용하여 문자열을 만들어 반환한다.
}
// 함수의 사용
sayHello(name: "Swift") // 결과값은 문자열로 "Swift님 안녕하세요!" 다.
// 함수의 선언
func printHello() {
print("안녕하세요!")
}
// 함수의 사용
printHello()
func add(a: Int, b: Int) -> Int {
return a + b
}
let result = add(a: 3, b: 5) // add 함수를 사용하여 받은 결과값을 result 상수에 할당한다.
print(result) // 8
함수 파라미터 이름의 분리
함수의 구현부에서 사용하는 이름과 함수 호출할 때 사용하는 이름을 다르게 설정할 수 있다.
기본적으로 함수의 선언부에서 정한 파라미터의 이름은 함수의 구현부와 호출부에서 동일하게 사용된다.
func sayHello(name: String) {
print("\(name)님 안녕하세요.")
}
sayHello(name: "Ryu")
// sayHello 함수를 정의하는 곳에서 파라미터의 이름이 name이면
// sayHello 함수를 호출하는 곳에서도 파라미터의 이름은 name을 사용한다.
Swift에서는 구현부에서 사용하는 파라미터의 이름과 호출부에서 사용하는 파라미터의 이름을 다르게 할 수 있다.
함수의 코드 스타일
소문자
로 시작해서 Camel Case
로 맞춰야한다.소문자
로 시작해서 Camel Case
로 맞춰야한다.->
연산자 앞뒤로 공백을 넣는다.// ✅ 함수의 이름은 messageToBirthday로 message to birthday 의 Camel Case
// ✅ 파라미터의 이름은 isTodayBirthDay로 소문자 Camel Case
func messageToBirthday(isTodayBirthDay: Bool) -> String {
// 구현부
}
// ❌ 함수의 이름이 소문자로 시작하지만 Camel Case가 아니여서 읽기 힘들다.
// ❌ 파라미터의 이름이 소문자로 시작하지만 Camel Case가 아니여서 읽기 힘들다.
func messagetobirthday(istodaybirthday: Bool) -> String {
// 구현부
}
변수나 상수에는 단일 값 뿐만 아니라 여러 값을 모아 저장할 수 있다.
이를 위해 Collection Type을 사용하며, Swift에서 자주 사용되는 Collection Type인 Array
, Set
, Dictionary
이 있다.
Array
배열
이라고 한다.[데이터타입]
형식으로 타입을 정의할 수 있다.[]
안에 index를 입력하여 접근할 수 있다.let array = [1, 2, 3, 4]
array[0] // array 상수에 0번째 값 -> 1
배열 기본 생성 방법
// Array 기본 생성 방법
// 타입 추론으로 생성하기
var array1 = [10, 20, 30] // 컴파일러는 배열에 10,20,30이 있는것을 보고 array의 타입이 Int의 배열이라고 추론한다.
let emptyArray = [] // ❌ Error 발생 : 배열의 타입을 추론할 수 없다.
let emptyArray2: [String] = [] // ✅ String 배열이라고 알려주었기 때문에 정상 작동
// 타입을 명시해서 생성하기
// 변수나 상수뒤에 콜론(:)을 넣고 뒤에 대괄호로 감싼 데이터 타입을 사용하면 타입을 정할 수 있다.
let array: [String] = ["가", "나", "다"] // 한국어로 번역해보면 array 상수의 타입은 String 배열이고 할당값은 "가", "나", "다" 값이 들어가 있는 배열이다.
var emptyArray: [String] = [] // emptyArray 변수의 타입은 String 배열이고 빈 배열을 할당한다.
let emptyArray2 = [String]() // 타입뒤에 괄호를 넣어서 빈 배열을 생성할 수 있다.
배열에 저장된 값에 접근하는 방법
let array = [10, 20, 30]
// 변수이름[]를 사용하면 배열의 접근해서 값을 가져올 수 있다.
array[0] // 값 : 10
array[2] // 값 : 30
array[3] // ❌ : array 값의 갯수는 3이기 때문에 0,1,2 index를 갖고 있어요. 3에 접근하면 크래시가 발생한다
배열과 반복문, 조건문 등을 같이 사용할 수 있다
// for in 을 사용해서 배열의 값만큼 반복
var array = [1, 2, 3, 4, 5, 6]
for value in array { // array의 값을 반복하여 아래 코드블록을 실행합니다. 지금 값은 value 상수에 넣어서 코드블록에서 사용.
print(value)
}
/* 출력 값
1
2
3
4
5
6
*/
for index in 0 ..< array.count { // 0이상 array.count 미만의 조건으로 코드블록을 실행, 현재 값은 index에 저장.
print("Index : \(index), Array Value : \(array[index])")
}
/* 출력 값
Index : 0, Array Value : 1
Index : 1, Array Value : 2
Index : 2, Array Value : 3
Index : 3, Array Value : 4
Index : 4, Array Value : 5
Index : 5, Array Value : 6
*/
배열에서 제공하는 유용한 변수와 함수들
타입, 변수 뒤에 .이 있다면 제공하는 함수나 변수를 사용할 수 있다.
. 는 ~의로 번역?
ex1 ) array.first : array 의 first 변수
ex2 ) array.append(10) : array의 append 함수를 호출.
배열에 값 추가
// 배열에 값을 추가하기
var array = [10, 20, 30] // 처음 입력한 값에서 변경하려면 var변수로 만들어야 한다.
print(array) // 출력 값 : [10, 20, 30]
// 배열 마지막에 추가하기
// Array가 제공하는 append함수를 사용하면 뒤에 마지막에 값을 추가할 수 있다.
array.append(40) // array 변수에 마지막에 40을 추가
print(array) // 출력 값 : [10, 20, 30, 40]
// Array 뒤에 array를 추가할 수 있다.
array.append(contentsOf: [41, 42, 43])
print(array) // 출력 값 : [10, 20, 30, 40, 41, 42, 43]
// index를 사용하여 원하는 위치에 값 추가하기
// Array의 insert 함수를 사용하면 원하는 index에 값을 넣을 수 있다.
array.insert(5, at: 0) // array insert를 호출합니다. insert 함수는 0번째 인덱스에 5를 추가.
print(array) // 출력 값 : [5, 10, 20, 30, 40, 41, 42, 43]
배열에 값 제거
// 배열의 값 제거하기
var array = [10, 20, 30, 40, 50]
// Array에서 제공하는 removeLast함수를 사용하면 맨 뒤의 값을 삭제할 수 있다.
array.removeLast() // array의 removeLast 함수를 호출.
print(array) // [10, 20, 30, 40]
// Array에서 제공하는 removeFirst 함수를 사용하면 첫번째 값을 제거할 수 있다.
array.removeFirst() // array의 removeFirst 함수를 호출합니다. removeFirst 함수는 첫번째 값을 제거.
print(array) // [20, 30, 40]
// Array에서 제공하는 remove(at: Int) 함수를 사용하면 원하는 인덱스의 값을 제거할 수 있다.
array.remove(at: 1) // array의 remove 함수를 호출합니다. remove 함수는 1번째 값을 삭제.
print(array) // [20, 40]
// Array에서 제공하는 removeAll 함수를 사용하면 모든 값을 삭제할 수 있다.
array.removeAll() // array의 removeAll 함수를 호출.
print(array) // [] 빈배열!
배열에서 제공하는 유용한 변수
// 배열의 개수를 알려주는 변수
var array = [10, 20, 30, 40, 50]
array.count // 5 -> 배열이 갖고있는 값의 갯수를 알려주는 변수
// 배열이 비어있는지 확인하는 변수
array.isEmpty // false -> 배열이 값을 갖고있어서 false
Set
Set
특징Set의 기본생성
// 기본값이 없을 때 생성하는 방법
var emptySet: Set<String> = []
var emptySet2 = Set<String>()
// 기본값이 있을 때 생성하는 방법
var defaultSet: Set<String> = ["A", "B", "C"]
// 기본값이 있을 경우 타입 추론이 가능
var typeInferredSet: Set = ["A", "B", "C"]
// for in 반복문을 사용하여 현재 Set에 있는 값들을 출력할 수 있다
for value in typeInferredSet {
print(value)
}
// 위의 for문의 결과는 "A", "B", "C" 순서를 보장하지 않는다
Set에서 제공하는 유용한 변수 및 함수
// Set에서 사용되는 유용한 변수
var defaultSet: Set<String> = ["A", "B", "C"]
// Set에 몇개의 값이 있는지 확인하는 count 변수
defaultSet.count // 3 -> 현재 defaultSet에는 "A", "B", "C" 3개가 저장되어 있다.
// Set에 값이 있는지 확인하는 isEmpty 변수
defaultSet.isEmpty // false -> defaultSet은 비어있지 않아서 false가 출력
// Set에서 제공하는 유용한 함수
var defaultSet: Set<String> = ["A", "B", "C"]
// Set에 값이 들어있는지 유무를 확인하는 contains 함수
defaultSet.contains("A") // true
defaultSet.contains("a") // false
// "A"와 "a"는 소문자와 대문자의 차이가 있기 때문에 다른값이다.
// Set에 값을 추가하는 insert 함수
defaultSet.insert("D")
print(defaultSet) // ["A", "D", "C", "B"] : Set은 순서를 보장하지 않기때문에 계속 바뀌어서 출력돤다.
defaultSet.insert("A")
print(defaultSet) // ["A", "D", "C", "B"] : "A"는 이미 값이 있기때문에 들어가지 않는디.
// Set에서 값을 삭제하는 remove 함수
defaultSet.remove("A")
print(defaultSet) // ["D", "C", "B"] : A의 값을 삭제하고 3개가 남았다.
defaultSet.remove("1")
print(defaultSet) // ["D", "C", "B"] : "1"이란 값은 없어서 아무런 변화가 없다.
// Set에서 모든 값을 삭제하는 removeAll 함수
defaultSet.removeAll()
print(defaultSet) // [] : 모든 값을 삭제해서 빈 Set가 된다.
Dictionary
key
)와 값(value
)의 쌍으로 데이터를 저장하는 Collection Type.Dictionary
특징key
와 value
가 쌍으로 저장된다.key
는 중복을 허용하지 않고 중복된 key
에 새로운 값을 할당하면 value
가 최신의 값으로 업데이트 된다.[ ]
대괄호 안에 :
를 기준으로 key
, value
를 나누어서 사용한다.Key
값에 접근하려면 [ ]
대괄호 안에 Key
값을 넣으면 된다.Dictionary 기본 생성 방법
// 기본값이 없는 Dictionary
// [ Key Type : Value Type ]
var emptyDictionary: [String: Int] = [:]
// 변수의 이름은 emptyDictionary 이고
// 타입은 Dictionary로 Key의 타입은 String이고 Value의 타입은 Int.
// 빈 Dictionary를 할당한다.
var emptyDictionary2 = [Int: String]()
// 변수의 이름은 emptyDictionary2 이고
// 빈 Dictionary를 만들어서 할당한다.
// Key는 Int 타입이고 Value는 String 타입이다.
// 기본값이 있는 Dictionary
var defaultDictionary: [String: String] = ["A": "Apple", "B": "Banana"]
// 변수의 이름은 defaultDictionary이고 타입은 딕셔너리다.
// 딕셔너리의 Key 타입은 String이고 Value 타입도 String.
// "A" Key에는 "Apple", "B" Key에는 "Banana"를 저장한다.
var defaultDictionary2 = ["A": "Apple", "B": "Banana"]
// 변수의 이름은 defaultDictionary이고 할당값은 딕셔너리 값이다.
// "A" Key에는 "Apple", "B" Key에는 "Banana"를 저장한다.
// 컴파일러가 Key, Value의 타입을 추론하여 [String: String]으로 정해준다.
Dictionary 사용 방법
// Key 값에 접근하려면 []안에 Key를 넣으면 된다.
var defaultDictionary = ["A": "Apple", "B": "Banana"]
print(defaultDictionary["A"]) // "A" Key가 저장하고 있는 "Apple"이 출력된다.
defaultDictionary["C"] = "Cherry"
print(defaultDictionary) // ["A": "Apple", "C": "Cherry", "B": "Banana"]
// "C"에 "Cherry"가 추가되어 출력된다.
defaultDictionary["A"] = "Avocado"
print(defaultDictionary["A"]) // "A" Key가 저장하고 있는 "Avocado"가 출력된다.
print(defaultDictionary) // ["A": "Avocado", "C": "Cherry", "B": "Banana"]
// 이제 "A"에는 "Apple"이 아닌 "Avocado"가 저장된다
Dictionary에서 제공하는 유용한 변수
var defaultDictionary = ["A": "Apple", "B": "Banana"]
// Dictionary에서 저장되어 있는 값의 갯수를 확인하는 count 변수
print(defaultDictionary.count) // 2 : 2개의 값이 저장되어 있다(Key-Value 쌍은 하나로 본다.)
// Dictionary에서 값이 저장되어있는지 확인하는 isEmpty 변수
print(defaultDictionary.isEmpty) // false : 값이 비어 있지 않디.
// Dictionary에서 저장되어 있는 Key 값들을 확인하는 keys 변수
print(defaultDictionary.keys) // "A", "B" : 순서를 보장하지 않아서 순서가 바뀔 수 있다.
// Dictionary에서 저장되어 있는 Value 값들을 확인하는 values 변수
print(defaultDictionary.values) // "Banana", "Apple" : 순서를 보장하지 않아서 순서가 바뀔 수 있다.
익명 함수
라고 불리는 클로저는 함수와 유사하게 특정 작업을 수행하는 코드블록이다.이름
, 파라미터
, 반환타입
, 구현부
)에서 이름
을 제외한 파라미터
, 반환타입
, 구현부
로 구성되어 있다.데이터타입
으로 클로저를 사용할 수 있다.타입으로 사용하는 방법
// 타입으로 사용할 때 표현방법
(파라미터 데이터 타입) -> 리턴 타입
Void
라고 명시한다.()
괄호는 있어야한다.Optional
타입으로 사용할 수 있다.()
로 감싼 후 ?
를 입력해야 한다.let closure: (Int, String) -> Void // 파라미터는 튜플(Int, String) 타입이고
// 반환타입은 없다.
// 만약 -> Void가 생략되었다면 튜플과 같다.
let closure2: (Int) -> Void // 파라미터는 1개로 Int이며 반환타입은 없다.
let closure3: () -> Void // 파라미터는 없고 반환타입은 없다.
// 파라미터는 ()로 감싸고 있어서 Void를 생략할 수 있다.
let closure4: (Int) -> Int // 파라미터는 1개이고 Int 타입이며, 반환값은 Int다.
let closure5: (String, Int) -> Int // 파라미터는 튜플(String, Int) 타입이고
// 반환타입은 Int다.
let optionalClosure: ((Int) -> Int)? // 옵셔널 타입.
// 만약 ()가 없었다면 리턴값이 Int? 라고 판단된다.
클로저 구현하는 방법
// 기본적인 구현 방법
// 중괄호로 시작하고 파라미터와 구현부 부분을 in 키워드를 사용하여 나눈다.
{ 파라미터 이름 in
// 구현부
// 리턴
}
in
키워드를 사용하여 앞에는 파라미터 이름을 뒤에는 구현부를 분리하여 작성한다.$0
으로 사용할 수 있다. ($0
, $1
, $2
…)in
키워드까지 생략해야 한다.in
을 생략해야 한다.