공부일지/Swift

2. Swift Optional

박수빈98 2022. 2. 7. 17:11

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

마지막은 반장짤