class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
let kim: Person = Person(name: "Kim", age: 20)
print(kim.age)
let han: Person? = Person(name: "Han", age: 25)
print(han!.age) //error
//print(han!.age)
// print(han?.age) //Optional(25), 옵셔널 체이닝
// print((han?.age)!)
// if let hanAge = han?.age {
// print(hanAge)
// } else {
// print("nil")
// }
옵셔널 체이닝에 관하여
var x: String? = "Hi" // x는 옵셔널 String 타입으로 선언되었으며, 초기 값은 "Hi"입니다.
x = nil // "Hi"를 제거하고 x를 nil로 설정합니다.
// print(x, x!)
// 이 코드는 에러를 발생시킵니다. 이유는 x가 nil이므로 x!로 강제 언래핑하려고 하면 런타임 에러가 발생합니다.
// 강제 언래핑(!)은 옵셔널이 nil이 아닐 때만 사용해야 합니다.
if let a = x {
print(a)
// 옵셔널 바인딩을 사용하여 x의 값을 안전하게 언래핑합니다.
// 하지만 현재 x는 nil이므로 if 블록 내부는 실행되지 않습니다.
}
let b = x!.count
// 이 코드도 에러를 발생시킵니다. 이유는 x가 nil인데 강제로 언래핑하려고 했기 때문입니다.
// 강제 언래핑은 값이 존재하지 않을 경우 프로그램이 충돌합니다.
print(type(of: b), b)
// 위 코드가 실행되지 않으므로 이 줄도 실행될 수 없습니다.
let b1 = x?.count
// 옵셔널 체이닝을 사용하여 x의 count에 접근합니다.
// x가 nil이면 b1은 nil을 반환하며, 에러 없이 안전하게 처리됩니다.
print(type(of: b1), b1, b1!)
// type(of: b1)는 Optional<Int>를 출력합니다.
// b1은 nil이며, b1!로 강제 언래핑하려고 하면 런타임 에러가 발생합니다.
let c = x ?? ""
// nil 병합 연산자(??)를 사용하여 기본값을 설정합니다.
// x가 nil이므로 c에는 ""(빈 문자열)이 할당됩니다.
print(c)
// c의 값은 ""(빈 문자열)이므로 출력 결과는 빈 줄입니다.
구분
| 구분 | Int? (옵셔널) | Int! (암시적 언래핑 옵셔널) |
| 정의 | 값이 있을 수도 있고 없을 수도 있는 타입. | 값이 반드시 있다고 가정하지만, 옵셔널로 선언된 타입. |
| 초기 상태 | 기본값은 nil. | 기본값은 nil. |
| 언래핑 필요 여부 | 값을 사용할 때 반드시 언래핑 필요 (if let, guard let, 또는 강제 언래핑). | 자동으로 언래핑되므로 별도의 언래핑 없이 사용 가능. |
| 안전성 | 안전하게 값을 확인하고 처리 가능. | 값이 nil일 경우 런타임 에러 발생 가능. |
| 사용 사례 | 값이 없을 가능성이 높은 경우 사용. | 초기화 이후 반드시 값이 있어야 하는 경우 사용. |
| 예제 코드 | var x: Int? = nil | var x: Int! = nil |
av audio player

| 기호 | 사용 | 목적사용 | 사례설명 |
| {} | 코드 블록 정의 | - 함수, 조건문, 반복문 등의 코드 블록 정의: { ... } | {}는 코드의 범위를 정의하며, 여러 명령어를 하나의 블록으로 묶습니다. |
| 객체 리터럴 정의 | - 객체 생성: let obj = { key: "value" }; | JavaScript와 같은 언어에서 객체 리터럴을 정의할 때 사용됩니다. | |
| () | 함수 호출 및 매개변수 전달 | - 함수 호출: myFunction(arg1, arg2) | 함수 호출 시 매개변수를 전달하거나, 수학적 표현식에서 그룹화를 위해 사용됩니다. |
| 조건식 및 제어문 그룹화 | - 조건식: if (x > 0) | 조건문이나 반복문의 조건을 정의할 때 사용됩니다. | |
| [] | 배열 또는 리스트 정의 및 접근 | - 배열 선언: let arr =[1][2][3]; | 배열이나 리스트의 요소를 정의하거나 접근할 때 사용됩니다. |
| 인덱스 접근 | - 요소 접근: arr | 배열의 특정 인덱스에 접근하거나 값을 수정합니다. | |
| < > | 제네릭 타입 정의 | - 제네릭 클래스/함수: class Box<T> {} | Java, C++, Swift 등에서 제네릭을 정의하여 타입 안정성을 높이고 재사용성을 제공합니다. |

자동으로 옵셔널이 적용되는걸 볼 수 있다
var num = [1, 2, 3, 4]
print(num[0], num[3]) // optional(1) optional(4)
print(num.first!) // 1
for i in 0...num.count-1{
print(num[i]) // 0,1,2,3,4
}
print(num[1...2]) // 2,3
num[0...2] = [10,20,30]
print(num) // 10,20,30,4
//let x = [1, 2, 3, 4] //불변 배열은 초깃값에서 변경 불가
//x.append(5)
var num = [1,2,3]
print(num)
num.append(4)
print(num)
num.append(contentsOf :[6,7,8])
print(num) //[1, 2, 3, 4, 6, 7, 8]
num.insert(5, at: 4)
print(num) //[1, 2, 3, 4, 5, 6, 7, 8]
num.remove(at: 3)
print(num) //[1, 2, 3, 5, 6, 7, 8]
num.removeLast()
print(num) //[1, 2, 3, 5, 6, 7]
print(num.firstIndex(of: 2)) //Optional(1), 2가 처음으로 나오는 첨자
if let i = num.firstIndex(of: 2)
{ //2
가 처음으로 저장된 방의 값을 20으로 바꿈
num[i] = 20 //num[1] = 20
}
print(num) //[1, 20, 3, 5, 6, 7]
num = num + num
print(num) //[1, 20, 3, 5, 6, 7, 1, 20, 3, 5, 6, 7]
num += [8,9]
print(num) //[1, 20, 3, 5, 6, 7, 1, 20, 3, 5, 6, 7, 8, 9]
num.removeAll()
print(num) //[]
배열을 갖고 놀 수 있다
여러 기능들이 있는 걸 볼 수 있다.
var num = [1,2,3,10,20]
print(num) // [1,2,3,10,20]
print(num.min()) //Optional(1)
print(num.max())//Optional(20)
print(num.min()!) //1
print(num.max()!) //20
var num = [1,5,3,2,4]
num.sort() //오름차순 정렬하여 원본 변경
print(num) //[1, 2, 3, 4, 5]
num[0...4] = [2,3,4,5,1]
num.sort(by:>) //내림차순 정렬하여 원본 변경
print(num) //[5, 4, 3, 2, 1]
num[0...4] = [2,3,4,5,1]
num.reverse() //반대로 정렬하여 원본 변경
print(num) //[1, 5, 4, 3, 2]
print(num.sorted()) //오름차순 정렬 결과를 리턴하고, 원본은 그대로, var x = num.sorted()
//[1, 2, 3, 4, 5]
print(num) //[1, 5, 4, 3, 2]
print(num.sorted(by:>)) //내림차순 정렬 결과를 리턴하고, 원본은 그대로
//[5, 4, 3, 2, 1]
print(num)//[1, 5, 4, 3, 2]
sort <- 원본 배열을 바꾼다
sorted <- 원본 배열을 유지하고 새로운 배열을 리턴한다
| 접근 제어자 | 설명 | 접근 가능 범위 |
| open | 모든 모듈에서 접근 및 상속 가능. | 모든 모듈 |
| public | 모든 모듈에서 접근 가능하지만 상속 및 오버라이드는 제한적. | 모든 모듈 |
| internal | 같은 모듈 내에서만 접근 가능. | 같은 모듈 |
| fileprivate | 같은 파일 내에서만 접근 가능. | 같은 파일 |
| private | 선언된 범위 내에서만 접근 가능. | 같은 클래스/구조체 |
| package | 같은 패키지 내에서만 접근 가능. | 같은 패키지 |
접근 제어자
class PrivateClass {
private var privateProperty = "Private"
private func privateMethod() {
print("Accessible only within this class.")
}
func accessPrivateProperty() {
print(privateProperty) // 출력: Private
privateMethod()
}
}
let instance = PrivateClass()
// instance.privateProperty // 에러: private 속성에 외부에서 접근 불가
// instance.privateMethod() // 에러: private 메서드에 외부에서 접근 불가
Extension
클래스, 구조체, 열거형, 프로토콜에 새로운 기능을 추가할 때 사용한다.

