2. Swift Optional
Swift언어의 특징 중 안전성이 높다는 점이 있었다.
그 특징에 기여를 하고 있는 기능인 Optional에 대해서 정리해 보았다.
Optional
변수 안에 값이 들어있는 경우와 안 들어 있는 경우를 둬 런타임 중 프로그램이 예기치 않게 종료되는 걸 예방할 수 있다.
사용 이유
만약 String의 변수를 Int로 형변환 한다고 생각해보자
다음 같은 상황일 것이다.
let myStr = "1234"
let myInt = Int(myStr)
print(myInt)
//출력값: Optional(1234)
print문에 의해 출력되는 값은 Optional(1234)이다.
이렇게 String에서 Int로 형변환 할때 옵셔널로 감싸 져서 나온다.
그 이유는 아래와 같은 상황이 있을 수 있기 때문이다.
let myStr = "1234abc"
let myInt = Int(myStr)
print(myInt)
//출력값: nil
이렇게 된다면 출력되는 값은 nil이 된다. 만약 다른 언어라면
이런 상황에서 Runtime error가 발생했을 것이다.
하지만 Optional을 이용하여 오류로 종료되는 것을 막을 수 있다.
이 것과 비슷한 많은 상황에 Optional이 사용되어 안전성을 높이는 것 같다.
Optional 변수의 선언
? 표현을 사용하여 선언할 수 있다.
let shortForm: Int? = Int("42")
let longForm: Optional<Int> = Int("42")
//출력값: Optional(42)
짧은 형식은 ?(물음표) 사용
긴 형식은 Optional<Int>로 사용
Optional 변수의 사용
Forced Unwrapping
- Optional 변수에 !를 사용하여 강제적으로 Optional를 풀어준다.
- 강제적으로 풀어주는 것이므로 만약 nil값이 들어가 있다면 오류가 발생한다.
- nil값이 아니라는 보장이 없다면 이 방법을 사용하지 않는 게 좋다고 한다.
Optional Binding
if let 변수명 = Optional 변수 {
내용
}
이렇게 사용하는 방법이다.
만약 Optional변수에 nil값이 아니라면 저 변수에 할당하여 일반 변수처럼 사용할 수 있는 것이다.
let myStr = "1234"
if let myInt = Int(myStr){
print(myInt)
}
//출력값: 1234
Optional Chaining
클래스, 구조체, 열거형의 내부 프로퍼티나 메서드 접근 시 사용되는 unwrapping 방법이다.
내부 프로퍼티의 접근은 .(dot)으로 한다.
person.name.firstname
이 과정에 nil이 포함되어 있을 수 있다.
그 경우를 대처하기 위해 ?를 사용해준다.
struct Name{
var firstname : String
var lastname : String
}
class Person{
var age:Int
var name: Name
init(age: Int, firstname:String,lastname:String){
self.age = age
name = Name(firstname:firstname,lastname:lastname)
}
}
이러한 클래스와 구조체가 있을 때
var person:Person? = Person(age : 18, firstname : "Choe", lastname : "Namra")
//우리의 반장 남라
Person 클래스를 Optional로 선언하면 접근할 때 ?를 이용해서 접근해야한다.
또한 Chain 중간에 nil이 있으면 nil을 반환하므로 체이닝의 반환값은 Optional 변수이다.
print(person?.age, person?.name)
//출력: Optional(18) Optional(main.Name(firstname: "Choe", lastname: "Namra"))
var person1:Person?
print(person1?.name.firstname)
//출력: nil
아직 완전하게 이해되지는 않았지만 이해한 부분까지만 적어보았다..
마무리
마무리
Swift로 처음 접해보는 Optional이라는 개념
분명 번거롭긴하지만 프로그래머의 실수를 예방해준다는 점에서 매우 좋은 기능인 것 같다.
아직 완벽하진 않지만 새로운 내용을 배우면 바로바로 추가해야겠다.
참고: https://babbab2.tistory.com/119?category=828998