본문 바로가기

카테고리 없음

iOS 6주차

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

클래스, 구조체, 열거형, 프로토콜에 새로운 기능을 추가할 때 사용한다.