여러 개의 값을 하나로 묶는 박스
예를들어 ) 이름이랑 나이를 같이 저장하고 싶음
이럴 때 각각 따로 변수 만들 필요 없이, 하나로 묶어서 저장할 수 있는데 이걸 튜플이라고 함
let person = ("민수", 14)
// person.0은 "민수" (첫 번째 값)
// person.1은 14 (두 번째 값)
let person = (name: "민수", age: 14)
// person.name → "민수"
// person.age → 14
값마다 서로 다른 타입(문자, 숫자 등)을 넣을 수 있음
숫자를 쭉 이어주는 도구
예를들어 ) 1부터 5까지 👈 같은 걸 쉽게 표현할 수 있음
시작 숫자부터 끝 숫자까지 모두 포함함
1...4 // 1, 2, 3, 4
끝 숫자는 포함하지 않음
1..<4 // 1, 2, 3 (4는 안 들어감!)
5... // 5부터 계속 (끝 없음)
...5 // 처음부터 5까지
여러 줄 코드를 { } 중괄호로 묶은 것
if 조건 { 여기에 여러 줄 코드를 씀 }
조건이 틀리면 바로 나감 (빠른 탈출)
예를들어 ) 나이가 20살 이상 아니면 못함 👈 조건을 만들고 싶을 때
guard age >= 20 else {
print("20살 아님")
return
}
조건이 맞으면 계속 진행
조건이 틀리면 바로 멈춤
| if문 | guard문 |
|---|---|
| 조건이 맞으면 안쪽 코드 실행 | 조건이 틀리면 바로 탈출 |
| 둘 다 true/false 체크 | 주로 false일 때 멈추려고 사용 |
| 안쪽에서 처리 | 바깥에서 처리 (코드 간결) |
여러 선택지 중 하나를 고르는 문법!
예를들어 ) 숫자에 따라 다른 말을 하고 싶을 때:
switch score {
case 100:
print("perfect")
case 90:
print("good")
default:
print("ㅎㅎ..")
}
score가 100이면 perfect 출력
조건이 없으면 default가 실행
func 함수이름(파라미터 이름: 타입) -> 반환타입 {
// 구현부
return 반환값
}
func add(a: Int, b: Int) -> Int {
return a + b
}
func greet(name: String) {
print("\(name) Hi")
}
func getGreeting() -> String {
return "Hello"
}
func sayHello() {
print("Hello")
}
func greet(to name: String) {
print("\(name) Hi")
}
greet(to: "가현")
func sayBye(_ name: String) {
print("\(name) bye")
}
sayBye("가현")
같은 타입의 값들을 순서대로 저장
var arr: [Int] = [10, 20, 30]
arr.append(40)
arr.insert(5, at: 0)
arr.removeLast()
arr[1] // 인덱스로 접근
순서 없고, 중복 불가능
var mySet: Set<String> = ["A", "B", "C"]
mySet.insert("D")
mySet.remove("A")
mySet.contains("B")
키-값 쌍 저장
var dict: [String: String] = ["A": "Apple", "B": "Banana"]
dict["C"] = "Cherry" // 값 추가
dict["A"] // 값 접근
dict.removeValue(forKey: "B")
함수 이름, 변수 이름은 소문자로 시작하고 CamelCase 사용
func messageToUser(isBirthday: Bool) -> String {
// ...
}
익명 함수, 이름이 없는 함수
함수처럼 특정 작업을 수행하는 코드 블록
함수의 구성 요소 중 이름을 제외한 파라미터, 반환타입, 구현부로 구성 됨
(파라미터 타입) -> 리턴타입
let closure: (Int, String) -> Void = { intValue, stringValue in
print(intValue)
print(stringValue)
}
let closure2: (Int) -> Void = {
print($0)
}
let closure3: () -> Void = {
print("Hello")
}
let closure4: (Int) -> Int = { value in
return value * 2
}
let closure5: (String, Int) -> Int = {
return $0.count + $1
}
let optionalClosure: ((Int) -> Int)? = { value in
return value * 2
}
let emptyParameterClosure: () -> Void = {
print("World")
}
closure(10, "20") // 변수에 저장한 클로저 호출
print(optionalClosure?(10)) // 옵셔널 클로저 호출 (결과는 Optional(20))
let helloClosure = {
return "안녕하세요!"
}()
print(helloClosure) // 클로저 즉시 실행 후 값 저장
파라미터 생략 시 $0, $1 형태로 접근 가능
이 때 in 키워드도 생략
함수의 마지막 파라미터가 클로저일 경우,
함수 호출 괄호 밖에 클로저 구현 가능 → 가독성 증가
func trailingTest(key: String, closure: () -> Void) {
print(key)
closure()
}
trailingTest(key: "Key") {
print("Hello World")
}
| 표현 | 설명 |
|---|---|
| (Int, String) -> Void | 파라미터 2개, 반환값 없음 |
| (Int) -> Int | 파라미터 1개, Int 반환 |
| () -> Void | 파라미터와 반환값 없음 |
| ((Int) -> Int)? | 옵셔널 클로저 타입 |
프로그램 실행 중 데이터를 저장하는 임시 저장 공간
흔히 RAM이라고 부름
앱이 실행되면 iOS는 앱만을 위한 메모리 영역을 할당
예를들어 )
채팅앱에서 친구 목록이나 메시지들이 화면에 보이는 이유?
→ 어딘가에 그 정보들이 메모리에 저장되어 있기 때문
우리가 선언한 var, let, 함수 등도 모두 메모리에 저장됨
앱이 실행되면 iOS가 해당 앱만을 위한 메모리 공간을 정해줌
| 개념 | 요약 설명 |
|---|---|
| 클로저 | 이름 없는 함수. 변수에 저장 가능, 함수처럼 호출 가능 |
| 타입 | (파라미터) -> 리턴타입, 옵셔널로도 표현 가능 |
| 호출 | 변수이름(값), 옵셔널이면 변수이름?(값) |
| 트레일링 클로저 | 함수 호출 외부에서 클로저 작성 가능 |
| 메모리 | 실행 중 데이터를 저장하는 공간 (RAM) |
| 앱과 메모리 | iOS는 앱마다 메모리 공간을 따로 설정 |
오늘은 저번 주차에서 배웠던 내용을 한 번 복습함과 동시에 여러 다른 개념들을 익힐 수 있었던 거 같다 !