[야곰] Swift 개념정리 - Optional

Judy·2022년 2월 21일
0

Swift 공부

목록 보기
4/11

아는 것 같은건 아는게 아니다!

앱도 만들어보고 코딩테스트 공부도 해봤지만 사실 Swift 자체를 공부한 적이 거의 없었다.

야곰 커리어 스타터캠프를 기다리며 개념강의를 들어봤고 제대로 익히기 위해 개념정리를 쓰기로 한다!




Optional


이전에도 프로젝트를 하다가 옵셔널에 대한 내용을 정리한 적이 있다.

하지만 그냥 그렇구나.. 하면서 코딩했을 때 어떻게 돌아갔는지, Xcode가 고치라면 고치는 대로 제대로 이해하지 못하고 써왔다...

1. Optionals


옵셔널은 C나 Object-C에는 없는 개념이라 생소한 타입으로 값이 없을지도 모르는 상황에서 사용한다.

옵셔널 타입의 의미

  • 값이 존재한다
  • 값이 존재하지 않는다


즉 옵셔널일 경우 값이 존재하거나, nil 인 것이다.

nil : 값이 없는 상태
-> 옵셔널이 아닐 경우 nil을 넣을 수 없음


옵셔널에 만약 값이 존재한다면 그냥 사용할 수는 없고 옵셔널 추출을 통해 값을 사용할 수 있다.


옵셔널을 사용하는 이유

  • nil의 가능성을 표현 - 효율적
  • 옵셔널이 아니라면 nil일 걱정할 필요 없음 - 안전성

2. 옵셔널 선언

var optionalValue: Optional<Int> = nil
var optionalValue: Int? = nil


옵셔널 변수를 선언할 때는 Optional<타입>을 이용하거나 또는 간단하게 타입 뒤에 ?를 붙이면 된다.


3. 암시적 추출 옵셔널 - Implicitly Unwrapped Optionals


var optionalValue: Int! = 100

암시적 추출 옵셔널은 타입 뒤에 !를 붙여서 선언한다.

implicitOptionalValue += 1
implicitOptionalValue = nil
//implicitOptionalValue += 1	// 런타임 에러

당연히 옵셔널이니 nil일 수도 있고, 다른 변수나 상수처럼 사용이 가능하다.

하지만 잘못된 접근 시 런타임 에러가 발생할 수 있다.

optionalValue = nil
//optionalValue += 1	// 일반 변수처럼 사용 불가능

반대로 ?를 이용한 기본 옵셔널 타입은 기존의 변수처럼 사용이 불가능하다.


4. 옵셔널 추출 - Optional Unwrapping


옵셔널인 상태에서는 값이 있는지 없는지 알 수 없기 때문에 바로 사용할 수 없다.

옵셔널 변수에 값이 있을 때 그 값을 사용하기 위해서는 옵셔널 추출을 해야한다.

1) 옵셔널 바인딩 - Optional Binding

옵셔널 바인딩을 통해 옵셔널 타입이 nil인지 확인하고 안전하게 값을 추출한다.

if-let

  • 상수는 구문 내에서만 사용가능
  • 컴마(,)를 이용해 여러 옵셔널 타입을 바인딩 할 수 있음 ( 하나라도 nil일 경우 구문에 들어가지 않음)

2) 강제 언래핑 - Force Unwrapping

옵셔널 타입인 변수 뒤에 !를 붙여 값을 강제로 추출하는 방법도 있다.

var myName: String? = "hana"

printName(myName!)

myName = nil
print(myName!) // 강제추출시 값이 없으므로 런타임 오류 발생


하지만 만약 nil일 경우 런타임 에러가 발생하기에 반드시 값이 있다고 확신하는 경우에만 사용해야 한다.

암시적 추출 옵셔널은 처음부터 강제 추출을 가정한 것과 같아 ! 없이 추출할 수 있다.


5. 옵셔널 체이닝 - Optional Chaining


사용자정의 타입을 정의하다보면 프로퍼티가 다른 프로퍼티와 연결될 수 있다.

만약 그 프로퍼티가 옵셔널 타입이라면 값을 사용하기 위해선 연결된 모든 프로퍼티를 추출해야 하는데 if let 구문을 이용하면 지나치게 반복적이고 효율성이 떨어진다.

옵셔널 체이닝은 nil일지 모르는 프로퍼티들을 묶어서 추출하는 방법이다.

class First{
	var first: Second?
}

class Second{
	var number = 10
}

let jane: First? = First()

if let result = jane?.first?.second {
	print("result is second value")
}else{
	print("result is nil")
}

프로퍼티들을 .(아래첨자)로 연결해서 순서대로 nil인지 확인하고 넘어가게 된다.

만약 연결된 프로퍼티 중 하나라도 nil이 있다면 nil을 반환하고 모두 값이 있다면 값을 반환한다.

값으로 반환했더라도 불러온 결과 값은 옵셔널 타입이 된다.


6. nil 병합 연산자


nil 병합 연산자는 값이 nil일 가능성이 있을 때 대안을 제시하는 것으로

" 만약 nil이면 이 값으로 해줘!! " 하는 것이다.

var value: String

value = jane?.first?.second ?? "없음"

위에 예시에서 ?? 키워드를 이용하여 nil이 아니면 해당 값이 할당되고 nil이면 자동으로 " 없음 "을 가지게 된다.





[참고자료]

The Basics: Swift 5.6

Optional Chaning: Swift 5.6

profile
iOS Developer

0개의 댓글