swift study 07. 옵셔널(Optional)

jess·2022년 7월 3일
0

Swift

목록 보기
6/19
post-thumbnail

🍃 출처 : 앨런 swift 문법 마스터 스쿨

📓 옵셔널 (Optional)

- 값이 있을 수도 있고, 없을 수도 있다.

  • 값이 있을 수도 있고, 없을 수도 있는 변수를 정의할 때에는 타입 어노테이션에 ? 를 붙여야 한다.
  • 초기값을 지정하지 않으면 기본값은 nil
var yourName: String
print(yourName)            // 	컴파일 에러
// <yourName>의 메모리 공간에 값이 없는데 접근해서 프린트 하려고 하는 것.
var yourName: String?
print(yourName)           //nil (값이 없음, 실제로 없는 건 아님)
// 그래서 이렇게 옵셔널 이라는 임시값을 넣어 강제종료가 되지 않게 하는 것
✨ 문자열 "" 은 값이 없는 것이고, 빈 값이 아니다
✨ 정수형 0은 0 이라는 값이 있는 것이고, 빈 값이 아니다
✨ String과 String? 은 아예 다른 데이터 타입이다

예시

var num: Int?
var str: String? = "안녕하세요"
print(num)          // nil
print(str)          // Optional("안녕하세요")

📓 강제 추출, 강제 언래핑 (Force Unwrapping)

  • nil이 아닌 값이 있다는 것을 확신하고 강제로 값을 추출 (값이 없는 경우 에러)
num!

📓 nil이 아닌지 확인 후, 강제추출

  • if문을 통해 nil이 아님을 먼저 확인 후, 강제 추출 (에러 가능성이 없어짐)
if num != nil {
   print(num!)
   }

📓 ⭐️ 옵셔널 바인딩 (일반적인 경우)

  • 옵셔널의 값이 존재하는지 검사한 뒤, 존재한다면 그 값을 다른 변수에 대입
    -if let / if var
    옵셔널의 값을 벗겨서 값이 있다면 if 문 안으로 들어가고, nil 이라면 그냥 통과
if let s = str {
    print(s)
}
var optionalName: String? = "양정인"   //옵셔널양정인
if let name = optionalName {
    print(name)                       //양정인 (nil이면 프린트안됨)
}
func doSomething(name: String?) {
    guard let name = optionalName else { return }
    print(name)
}
doSomething(name: "hello")

📓 닐 코얼레싱 (nil-coalescing)

  • 옵셔널 표현식 뒤에 기본값을 제시해서, 옵셔널의 가능성을 없앰
    (디폴트 값 제시가능한 경우)
optionalName ?? "양정인"
  • 앞의 옵셔널 표현식이 nil이라면, 기본값을 제시
var serverName: String? = "홍길동"
var userName = serverName ?? "미인증사용자"    // String타입
  • 값이 있다면 홍길동, nil이라면 미인증 사용자를 사용하겠다
  • 기본값을 제시할 수 있을 때 사용하는 문법

📓 옵셔널 체이닝

  • 표현식 자체가 옵셔널의 가능성이 있다는 것을 표현. 체이닝의 결과는 항상 옵셔널
    (옵셔널 타입에 대해 접근연산자 사용은 항상 ?를 붙임)
human?.choco?name
  • 언래핑 후 사용해야 함
  • chaining의 뜻이 "연쇄" 이듯이,
    옵셔널 체이닝은 말 그대로 옵셔널을 연쇄적으로 사용하는 것
  • .(dot)을 통해 내부 프로퍼티나 메서드에 연속적으로 접근할 때
    옵셔널 값이 하나라도 껴 있으면 그것은 옵셔널 체이닝,, 안껴잇음 아님
class Dog {
    var name: String?
    var weight: Int
    
    init(name: String, weight: Int) {
        self.name = name
        self.weight = weight
    }
    
    func sit() {
        print("\(self.name)가 앉았습니다.")
    }
    
    func layDown() {
        print("누웠습니다.")
    }
}


class Human {
    var dog: Dog?
}

// 옵셔널타입에 대해, "접근연산자"를 사용할때, ?(물음표)를 붙여서, 앞의 타입이 값이 nil을 가질 수도 있음을 표시


var choco = Dog(name: "초코", weight: 15)
choco.name
choco.sit()
//choco?.name = "초코얌"
//choco?.sit()              // Optional("초코얌")가 앉았습니다.
  • 타입이 옵셔널인 가능성이 있는 경우 점문법을 사용

0개의 댓글