반복문
- 반복문은 배열이나 Dictionary 같은 Collection Type이나 범위를 반복적으로 접근할 때 사용함.
for 반복문
- for in 을 사용하면 배열과 범위의 숫자를 반복할 수 있음.
// 컬렉션 타입에 대한 for in 반복문
let names = ["Anna", "Alex", "Brian", "Jack"]
// names 상수에 순서대로 이름을 넣음.
for name in names { // names 배열 안에 있는 값들을 반복하여 아래 코드 블록을 실행함.
// name에 names 배열의 데이터를 넣음.
print(name)
}
// 숫자의 범위를 사용한 for in 반복문
for index in 0...5 {
print(index) // 0 부터 5 까지의 숫자를 index에 할당하고 반복함.
}
while 반복문
- while 반복문은 조건이 true인 동안 코드블록을 반복 실행함.
while 조건 {
// 반복 실행할 코드
} // 조건이 true이면 코드블록을 실행하고, false이면 코드블록이 실행되지 않고 다음으로 넘어감.
반복문에서 흐름제어를 도와주는 break, continue
break
- 반복문이나 switch에서 즉시 종료하고, 코드블록을 빠져나올 때 사용됨.
- swich에서 특정 case에서 아무런 작업을 하지 않거나, 중간에 작업을 종료하고 싶을 때 사용함.
// for 반복문에서 더이상 반복이 필요 없는 경우.
for age in 15...99 { // 15에서 99까지 반복하여 코드블록을 실행함. 현재 숫자는 age에 넣음.
print(age) // age를 반복적으로 출력함.
if age >= 20 { // age가 20이상이면 코드블록을 실행함.
break // 반복문을 종료함.
}
}
// While 반복문에서 더이상 반복이 필요 없는 경우
var age = 15 // age 라는 변수에 15를 할당함.
while age < 100 { // age가 100 미만일 때 반복적으로 코드블록을 호출함.
print(age)
if age >= 20 { // 만약 age가 20 이상일 경우 아래 코드블록을 실행함.
break // 반복문을 종료함.
}
age += 1 // age에 1을 더한 값을 할당함.
}
continue
- 반복문 안에서 현재 반복을 건너뛰고 다음 반복으로 넘어갈 때 사용함.
// for in 에서 continue를 사용하여 반복문을 건너뛰는 방법
for number in 1...5 { // 1~5 반복
if number % 2 == 0 { // 2로 나눴을 때, 나머지가 0이면 아래 코드블록 실행
continue // 코드를 실행하지 않고, 다음 반복문으로 이동.
}
print(number)
}
// while에서 continue를 사용하여 반복문을 건너뛰는 방법
var number = 0 // 변수 number에 0 값을 할당.
while number < 5 { // number가 5 미만일 때 반복.
number += 1 // number에 1을 더한 값을 할당.
if number % 2 == 1 { // number를 2로 나눈 나머지 값이 1일 때 아래 코드블록(continue)을 실행
continue // 아래의 코드는 실행하지 않고 다음 반복문으로 넘어감.
}
print(number)
}
함수
- 함수는 재사용이 가능한 코드의 집합으로, 특정 작업을 수행하는 코드 블록임.
// 함수의 기본 사용방법
// 함수의 정의(선언)
func 함수이름(파라미터 이름: 파라미터 타입) -> 반환타입 {
// 구현부
return 반환 타입의 값
}
// 파라미터가 여러개인 경우
func 함수이름(파라미터1 이름: 파라미터1 타입, 파라미터2 이름: 파라미터2 타입) -> 반환타입 {
// 구현부
return 반환 타입의 값
}
// 파라미터가 없는 경우
func 함수이름() -> 반환 타입 {
// 구현부
return 반환 타입의 값
}
// 반환값이 없는 경우
func 함수이름(파라미터 이름: 파라미터 타입) {
// 구현부
// 반환타입이 없기때문에 return이 없어도 됩니다.
// 반환타입이 없는데 중간에 함수를 탈출하고 싶을 때 return을 사용할 수 있습니다.
}
// 파라미터가 없고, 반환값도 없는 경우
func 함수이름() {
// 구현부
}
- 코드를 구조적이고 효율적으로 작성하는 데 도움을 줌.
- 동일한 작업을 반복해서 작성할 필요 없게 도와줌.
- 함수는 선언과 사용으로 나눌 수 있음.
- 함수의 선언 : 함수를 정의하는 과정
- func 키워드를 사용하여 시작.
- 1. 함수의 이름, 2. 파라미터(이름, 타입), 3. 반환 타입, 4. 구현부
- 함수의 사용 : 정의한 함수를 호출하여 실제로 실행하는 과정
- 함수의 이름 뒤에 ()를 사용하여 함수를 실행함.
- () 안에는 파라미터를 넣을 수 있음.
- 함수를 사용하여 나온 결과값을 변수나 상수에 할당할 수 있음.
Swift에서는 구현부에서 사용하는 파라미터의 이름과 호출부에서 사용하는 파라미터의 이름을 다르게 할 수 있음.
- 첫 번째 이름 : 함수를 호출할 때 사용하는 이름
- 두 번째 이름 : 함수 구현부에서 사용하는 이름
// 호출부와 구현부를 나눈 케이스
func sayHello(to name: String) {
print("\(name)님 안녕하세요.")
}
sayHello(to: "수강생")
// 파라미터 이름 생략하는 케이스
func sayBye(_ name: String) {
print("\(name)님 안녕히가세요.")
}
sayBye("수강생")
Swift Convention Guide No.5
- 함수의 이름은 소문자로 시작해서 Camel Case로 맞추기.
- 파라미터의 이름은 소문자로 시작해서 Camel Case로 맞추기.
- -> 연산자 앞 뒤로 공백 넣기.
고급 데이터 타입(Collection Type)
- 변수나 상수에는 단일 값 뿐만 아니라 여러 값을 모아 저장할 수 있음.
- 이를 위해 Collection Type을 사용함. Array, Set, Dictionary
Array(배열)
- 동일한 데이터 타입의 여러개 값을 순서대로 저장하는 데이터 타입
- 대괄호로 감싸서 만들 수 있음
- 타입으로는 [데이터타입] 형식으로 타입을 정의할 수 있음.
- 순서(Index)는 0부터 시작.
- 배열에 접근하려면 [] 안에 index를 입력하여 접근할 수 있음.
let array = [1, 2, 3, 4]
array[0] // array 상수의 첫 번째 값 -> 1
// 배열의 크기보다 큰 Index에 접근하면 런타임 오류 발생.
// Array 기본 생성 방법
// 타입 추론으로 생성하기
var array1 = [10, 20, 30] // 컴파일러가 배열을 보고 array의 타입이 Int의 배열이라고 추론.
let emptyArray: [String] // 에러 발생.
let emptyArray2: [String] = [] // String 배열이라고 알려줬기 때문에 정상 작동
// 타입을 명시해서 생성하기
let array: [String] = ["가", "나", "다"]
var emptyArray: [String] = [] // emptyArray 변수의 타입은 String이고 빈 배열을 할당함.
let emptyArray: [String]() // 타입 뒤에 괄호를 넣어서 빈 배열을 생성할 수 있음.
Collection Type 을 활용한 반복문
// for in 을 활용하여 배열의 값만큼 반복 하기
var array = [1, 2, 3, 4, 5]
for value in array {
print(value)
}
for index in 0..<array.count {
print("Index : \(index), Array Value : \(array[index])")
}
- 배열에서 제공하는 유용한 변수와 함수들
- 타입, 변수 뒤에 . 이 있다면 제공하는 함수나 변수를 사용할 수 있음.
- . 은 ~의 로 번역하면 좋음.
- array.first : array의 첫 번째 변수
- array.append(10) : array의 append 함수를 호출함.
// 배열에 값 추가하기
var array = [10, 20 ,30]
array.append(40)
array.append(contentsOf: [41, 42, 43])
array.insert(5, at: 0)
// 배열에 값 제거하기
array.removeLast()
array.removeFirst()
array.remove(at: 1)
array.removeAll()
// 배열의 갯수를 알려주는 변수
array.count
array.isEmpty
array.first
array.last
Set(집합)
- 순서와 상관없이 같은 타입의 다른 값을 저장함.
- 순서가 없음.
- 중복을 허용하지 않음.
- 저장할 타입을 명시해줘야 함.
- 중복된 값을 입력하면 무시됨.
// 기본값이 없을 때 생성하는 방법
var emptySet: Set<String> = []
var emptySet2 = Set<String>()
// 기본값이 있을 때 생성하는 방법
var defaultSet: Set<String> = ["A", "B", "C"]
// 기본값이 있을 경우 타입 추론이 가능함.
var defaultSet3: Set = ["A", "B", "C"]
// for in 반복문을 사용하여 현재 Set에 있는 값들을 출력할 수 있음.
for value in defaultSet { // 순서를 보장하지 않음!
print(value)
}
Set에서 제공하는 유용한 변수 및 함수
var defaultSet: Set<String> = ["A", "B", "C"]
defaultSet.count
defaultSet.isEmpty // 비어있으면 true, 값이 있으면 false.
defaultSet.contains( "A" ) // 소문자와 대문자의 차이가 있기 때문에 다른값임.
defaultSet.insert( "D" )
defaultSet.remove( "B" )
defaultSet.removeAll()
Dictionary
- 순서와 상관없이 키(key)와 값(value)의 쌍으로 데이터를 저장하는 Collection Type
- key와 value가 쌍으로 저장됨.
- 순서가 없음.
- key는 중복을 허용하지 않고 중복된 key에 새로운 값을 할당하면 value가 최신의 값으로 업데이트 됨.
- [] 대괄호 안에 : 를 기준으로 key, value를 나누어서 사용함.
- key 값에 접근하려면 [] 대괄호 안에 key값을 넣으면 됨.
// 기본값이 없는 Dictionary
var emptyDict: [String: Int] = [:]
/* 변수의 이름은 emptyDict이고 타입은 Dictionary
key의 타입은 String, value의 타입은 Int
빈 Dictionary를 할당함.
*/
var emptyDict2 = [Int: String]()
/* 변수의 이름은 emptyDict2이고 타입은 Dictionary
key의 타입은 Int, value의 타입은 String
빈 Dictionary를 할당함.
*/
// 기본값이 있는 Dictionary
var defaultDict: [String: Int] = ["apple": 2, "banana": 5]
/* 변수의 이름은 defaultDict이고 타입은 딕셔너리임.
key의 타입은 Stirng, value의 타입은 Int
"apple" key에는 2, "banana" key에는 5를 저장함.
*/
var defaultDict2 = ["A": "apple", "B": "Banana"]
// 컴파일러가 key, value의 타입을 추론하여 [String:String]으로 정해줌.
// key 값에 접근하려면 []안에 key를 넣으면 됨.
var defaultDictionary = ["A": "Apple", "B": "Banana"]
defaultDictionary["C"] = "Cherry" // 추가
defaultDictionary["A"] = "Avocado"
defaultDictionary.count
defaultDictionary.isEmpty
defaultDictionary.keys // 키값 확인, 순서보장 x
defaultDictionary.values // 밸류값 확인, 순서보장 x
클로저
- 익명 함수라고 불리는 클로저는 함수와 유사하게 특정 작업을 수행하는 코드 블록.
- 함수의 4가지 요소(이름, 파라미터, 반환타입, 구현부) 에서 이름을 제외한 파라미터, 반환타입, 구현부로 구성되어 있음.
- 데이터 타입으로 클로저를 사용할 수 있음.
- 변수에 할당하여 재사용할 수 있음.
- 함수의 파라미터로 전달할 수 있음.
- 클로저가 더 큰 개념, 함수는 클로저에 포함되어 있음.
- 이름있는 클로저 : 함수
- 코드의 재사용성을 높이고, 비동기 처리, 컬렉션 연산 등의 장점이 있음.
// 클로저 구현 코드
let closure: (Int, String) -> Void = { intValue, stringValue in
// in 키워드를 사용하여 앞에는 파라미터 이름, 뒤에는 구현부 작성.
print(intValue)
print(stringValue)
}
closure(10, "hello") // 10, hello
let closure2: (Int) -> Void = {
// 파라미터의 이름 및 in 생략, 구현부에서 $0 사용
print($0)
}
closure2(100) // 100
let closure3: () -> Void = {
print("Hello")
}
closure3() // Hello
let closure4: (Int) -> Int = { value in
return value * 2
}
print(closure4(13)) // 26, 클로저 구현부에 print가 없기 때문!
let closure5: (String, Int) -> Int = {
return $0.count + $1
}
print(closure5("Hello", 10)) // $0 의 개수 = 5
let optionalClosure: ((Int) -> Int)? = { value in
return value * 2
}
print(optionalClosure?(100)) // Optional(200), 상수의 타입이 옵셔널이므로 결과값도 옵셔널
let emptyParameterClosure: () -> Void = {
print("World")
}
emptyParameterClosure() // World
let helloClosure = {
return "구현 및 할당"
}()
print(helloClosure) // 구현 및 할당, ()를 붙여서 구현하고 바로 할당함.
트레일링 클로저
- 함수를 호출할 때 마지막 파라미터가 클로저일 때 괄호를 닫은 뒤 작성할 수 있음.
- 장점 : 클로저 함수를 호출 외부에 작성해서 클로저의 구현부가 길어졌을 때, 가독성이 좋아짐.
func trailingTest(key: String, closure: () -> Void) {
print(key)
closure()
}
trailingTest(key: "Key name", closure: {
print("Hello")
})
trailingTest(key: "Hello") {
print("World") // 괄호를 닫은 뒤 작성할 수 있음.
}'문법' 카테고리의 다른 글
| [iOS] 2025.03.18 문법(class, init) (0) | 2025.03.18 |
|---|---|
| [iOS] 2025.03.18 문법(인스턴스) (0) | 2025.03.18 |
| [iOS] 2025.03.13 문법(열거형) (0) | 2025.03.13 |
| [iOS] 2025.03.11 문법(연산자, 조건문) (0) | 2025.03.11 |
| [iOS] 2025.03.10 Swift 문법, 알고리즘 특강 (0) | 2025.03.10 |