4. 옵셔널과 언랩핑

Haribo·2022년 3월 29일
1

Ios - Swift 문법 정리

목록 보기
4/15

옵셔널이 뭔데요?

있을 수도 있고 없을 수도 있다.
-> 말장난인가?

말 그대로 값이 있을 수도 있고 없을 수도 있다는 뜻.
즉 알 수 없는 상태이다.

var someVariable: Int?
var someVariable: Int? = nil
var someVariable: Int = nil

세 가지의 코드를 써봤다.
처음은 저 someVariable이라는 변수가 값이 있는지 없는지 모르겠어요~ 라는 뜻이다. 그 표시로 ?를 끝에 붙혀서 사용한다.

그럼 값이 없다는 걸 어떻게 표시할까? 다른 언어에서는 NULL이라고 하는데 스위프트에서는 nil이라고 부른다. 처음에 옵셔널 표시 뒤에 두번째 처럼 표시해주자.

그럼 마지막 세번째는 말이 무엇일까?
정확히는 말이 안되는 말이다. 값이 없다는 걸 쓰기 위해선 반드시 옵셔널 표시를 해줘야하는데 ?(물음표)가 없다는 것은 값이 있다는 말이니 세번째는 모순인 셈이다. 하지만 이렇게는 할 수 있다.

if someVariable == nil {
    someVariable = 90
}

만약 변수가 값이 없다면 90을 넣겠습니다.
이걸 print해서 출력하면 아래 처럼 나오게 된다.

Optional(90)

왜냐면 값이 90으로 나오긴 하지만 태생적으로 변수가 값이 있는지 없는지 모르는 옵셔널 상태이기 때문에 이렇게 출력되는 것이다. 정말 보기 불편하기 그지 없다!!!
없앨 수는 없을까?

저걸 없애는 방법이 언랩핑이라고 부른다. 그럼 방법은? if let이라는 걸 쓰면 된다.

if let otherVariable = someVariable {
    print("언래핑 되었다 즉, 값이 있다. otherVariable : \(otherVariable)")

} else{
    print("값이 없다.")
}

뜻은. 만약 someVariable이 값이 있다면 ohterVariable에 넣어서 쓰겠습니다~ 라는 뜻.
내가 만든 otherVariable은 옵셔널 상태가 아니다 즉, someVariable에서 알맹이만(90) 쏙 뺴서 사용하면 그만. 그럼 값일 없을 경우도 있지 않겠는가? 그러면 간단하게 else를 써서 값이 없다고 출력해주면 끝.

반대로 값이 없으면 기본값으로 이것을 넣겠다~ 라는 뜻의 문장을 만들 수도 있다.

someVariable = nil 
let myValue = someVariable ?? 10 
print("myValue: \(myValue)")

someVariable에 값이 없으면 myValue에 10을 넣겠습니다. 그리고 아래처럼 출력하면 10이라고 뜬다.

또 다른것도 있다.

var first: Int? = 30 
var second: Int? = 50

print("처음: \(first)")
print("두번째: \(second)")

unwrap(first)
unwrap(second) 

// 함수같은 메소드 안에 넣는 것을 파라메터라고 한다. 재료라고 생각하자. 
func unwrap(_ parameter: Int?){ //여기에 쓰인 _는 오타가 아니다. 위에 unwrap()안에 parameter를 넣지 않게 하기위해 이렇게 함. 

    print("unwrap() called") 
    guard let unWrappedParam = parameter else{ 
        return
    } 
    print("unwrappedParam: \(unWrappedParam)")
}

first와 second는 둘다 처음에는 언랩핑을 하지 않았기 때문에 출력은 Optional(30),(50)으로 나올 것이다.

함수를 하나 만들어서 언랩핑하는 것을 만들어 보자. 이때 사용하는 것은 guard let이라는 방법이다.
이것은 값이 있으면 사용하고 없으면 반환한다는 의미인데 자세하게 말하면 다음과 같다.
parameter가 값이 있으면 unWrappedParam으로 사용하고 없으면 리턴(지나간다)한다. 이것은 함수뿐만 아니라 위에서 if let 처럼 밖에서도 사용 가능하다.

이제 unwrap()함수를 만들었으니 두 변수를 넣고 다시 출력을 해보면 옵셔널이 사라진다. 야호~!

세줄 요약.
1. 옵셔널은 값이 있는지 없는지 모르는상태. 표시는 타입에 ?(물음표)를 붙혀서 사용.
2. 출력을 할때 언랩핑을 사용해서 옵셔널을 없앨 수 있음.
3. 언랩핑의 종류는 if let (else), let, gurad let (else) 등이 있다.

0개의 댓글

관련 채용 정보