Dog foot print

[SWIFT] Optional 본문

IOS/Swift

[SWIFT] Optional

개 발자국 2021. 7. 5. 23:51

옵셔널이란 ?

옵셔널의 개념은 쉽게 풀이하여, 값이 존재 할 수도 있고 없을 수도 있음을 표현한 자료형입니다. 다른 언어에서는 값이 없다는 표현으로 보통 null을 할당 하고는 하는데, 스위프트에서는 nil이라는 값으로 표현됩니다.

Dictionary 자료형을 사용 할 때, 키로 해당 값에 접근 하게되면 optional객체로 감싸진 값들을 볼 수 있습니다.

let country = ["korea" : "seoul"];
country["korea"] //Optional("seoul").

이는 스위프트가 오류가 존재해서가 아닌, “korea”라는 키를 가진 value가 없을 수 도 있으니 바로 오류를 범하기 전에Optional 객체로 감싼 결과 입니다.

이 예시는 String을 Int형으로 변경 할 때도 발생합니다.

Int("123") // Optional(123);
Int("swift") // => nil

만약 123이 아닌 다른 hello world같은 것을 타입 캐스팅을 하고, 다음 코드에서 이 코드가 숫자형인줄 알고 사용하려 했다면 앱이 강제 종료되게 됩니다. 이를 방지 하기 위해 Optional 객체로 감싸지게 된 것 입니다 .

옵셔널 타입 선언과 정의

만약 옵셔널 타입을 선언해주고 싶다면, 타입 선언 자료형에 ?를 붙여주시면 됩니다.

var appple : String? = "optional string";
var number : Int? = 123;
var numbers : Int[]?;

Unwrapping

Optional(123) + Optional(123) // 연산 불가 

Int("123")의 결과는 Optional(123) 이기 때문에 이 옵셔널 값을 바로 연산에 사용 할 수 없습니다. 즉 Optional(123) 은 정확히 숫자 123과 다른 값입니다. 그렇기에 이 값을 사용 할 수 있게 Optional객체를 해제해줘야 하는데, 이를 unwrapping이라 부릅니다.

Force unwrapping

let a = Int("123");
print(a!); // 123

Force unwrapping은 강제로 옵셔널을 제거해주는 방법입니다. 사용 문법은 optional 객체에 !를 붙여서 unwrapping 합니다. 그러나 이 방법은 위험이 동반 됩니다. 강제로 언 래핑 하였기 때문에 값이 nil 일수도 있는 위협이 존재합니다. 그러므로 사용시에는 정말 강한 확신이 존재하는 경우에만 사용 되어야 합니다.

Optional binding

if let result = Int("123"){
    print(result);
}else{
    //여기서는 result에 접근 불가
    print("숫자가 아닙니다.")
}

상수에 옵셔널 값을 할당하게 되면 nil인 경우에는 false를 반대의 경우에는 true를 반환 합니다. 그로 인하여, if문 내부에서 자연스럽게 unwrapping된 바인딩 상수를 사용 할 수 있게 되는 것 입니다.

automatic Unwrapped Optional

let a : Int? = 32 // optional(32)

if a == 32{
    print("32 입니다.")
}else{
    print("32가 아닙니다.")
}

옵셔널로 감싼 타입은 그 값을 확인하려면, unwrapping을 이용해야 합니다. 그러나, 이를 사용하지 않아도 되는 순간이 있는데 바로 비교 연산자를 사용 할 때 입니다. 만약 옵셔널 객체를 비교 연산자를 통해 비교하는 순간이 존재하면, 그때는 옵셔널 객체를 해제하고 그 값과 비교합니다. 물론 옵셔널 바인딩 처럼 그 하위 코드 블록에서 force unwrapping 해주어야 하는 것은 동일합니다.

correspond ??

let a = Int("123");
let b = Int("swift");

let result = (a ?? 0) + (b ?? 0); // 123 

것은 만약 해당 값이 `nil`인 경우에는 `??` 옆에 있는 값으로 대체하겠다는 구문입니다.은 force unwrapping을 해줄 필요 없이, 해당 구문에서 사용이 가능하기 때문에, 기본값을 부여 할 수 있을 때 유용하게 사용 될 수 있습니다.

Implicity unwrapped optional

let a : Int! = Int("123");
print(a) // 123

묵시적 해제는 절대 nil 이 아닌 값을 언 래핑 하겠다는 의미입니다. Optional 값을 사용하기 위해서는 force unwrapping 혹은 optional binding을 이용하여야 하지만 Optional 객체를 쓰긴해도 절대 nil이 아니라면 optional 객체를 무조건 force unwrapping 하겠다는 의미 입니다.

Note : 이 형태는 Optional 객체를 무조건 force unwrapping 하기 때문에, 절대적인 확신이 존재하지 않다면 사용을 권장 하지 않습니다.

반응형

'IOS > Swift' 카테고리의 다른 글

[Swift] Inout  (0) 2021.07.08
[SWIFT] 함수 시작하기  (0) 2021.07.07
[SWIFT] Dictionary  (0) 2021.07.05
[SWIFT] Set 집합  (0) 2021.07.01
[SWIFT] 문자열 보간법과 트리플 쿼우팅  (0) 2021.06.30
Comments