[Swift] 옵셔널

CHO·2023년 2월 11일
0

[Swift] 공부하기

목록 보기
4/13

Optional?
: 값이 있을 수도 있고, 없을 수도 있는 상태

옵셔널은 왜 필요할까요?
: Swift에서는 nil(값이 없음)을 사용한다.

null 과 nil의 차이는?
: null은 C에서 사용되는 개념인데, '어떠한 값도 가지지 않고 있다'라는 의미로 빈칸과도 같은 개념!(이용x, 할당 x, 적용 불가능), 즉 포인터가 가리키는 객체가 존재하지 않는다는 의미(C언어의 Pointer의 부재)
: nil은 단순한 의미에서는 null과 유사하지만, "어떤 값이 없느냐" 이게 중요하다.
: Swift 와 Object C에서의 의미가 미묘한 차이가 있다.
Objective-C의 nil은 Objective-C 객체의 클래스의 부재를 나타내고, Swif의 nil 값의 경우에는 Objective-C 객체의 부재를 나타낸다.
다시 말해 Objective-C에서의 nil은 존재하지 않는 객체에 대한 포인터이고, Swift에서의 nil은 포인터가 아니라, 단지 특정 타입에 대한 값의 부재를 보여주는 것이다.

옵셔널이 아닌 상수에 nil값을 할당하려면 아래의 코드처럼 컴파일 오류가 발생한다.

: 옵셔널은 nil의 가능성을 명시적으로 표현한다
: nil 가능성을 문서화 하지 않아도 코드만으로 충분한 표현이 가능해지고, 예외상황을 최소화해 안전한 코딩이 가능해진다!
: 옵셔널을 하면 nil이 들어올 수 있다! 라고 표현해줄 수 있게 된다~
: optional 타입이면 nil을 보낼 수 있지만~ optional 타입이 아니라면~ nil을 보낼 수 없다!

Optional 더 파헤치기!
-옵셔널 : 열거형(enum)과 general 의 콜라보이다!
: 열거형이 기본 타입이고 optional 값이 없다, optional 값이 wrapped에 있다 라고 표현이 가능!

-사용방법과 의미
: 느낌표 - 암시적 추출 옵셔널(Implicitly Unwrapped Optional)

: 물음표

옵셔널 추출(Unwrapping, 꺼내기)은 2가지 방법이 있다!
1. Optional Binding (옵셔널 바인딩)
: 옵셔널 값을 꺼내오는 방법 중 하나! nil체크 + 안전하게 값을 추출한다

(똑똑 값 들어있니 없니?)

  • 방법
    : if let, if var, guard let 을 사용해 옵셔널 추출

위의 x의 값은 optional 10이 나오고, y값은 nil의 값을 갖는다.
그리고 결과적으로 print("x = (xx)") 의 값이 나오게 되고 x의 값에는 10이 들어간 결과가 출력된다!

: guard let은 if let과 거의 비슷하지만, 차이점이 있다면 else인 부분만 작성이 가능하다. 즉 값이 nil이어서 옵셔널이 추출되지 않을 때에만 어떤 액션을 취할 수 있다.
*중요한 점 : guard let문을 통과하게 되면 저장된 상수는 전역변수로써 사용이 가능해진다!

추가로! gaurd let의 else문 안에는 항상 return (X), throw문이 와야한다. throw문은 예외처리문이다!!!

결과 : x값은 guard let 을 통과해서 잘 프린트 됨. y값은 nil이라 else문으로 빠져나온다. 하여 y is Optional 이라는 값을 출력하게 된다!

: if let VS guard let

: 옵셔널 추출 실패해도, 성공해도 모두 제어할 수 있다. 그러나 할당상수는 정해진 if let 문장 안에서만 사용할 수 있다. xx는 지역변수라서 밖에서 선언해서 사용할 경우 에러가 발생한다


: 옵셔널 추출 실패한 else문만 제어할 수 있다. 그리고 guard let 문 밖에서도 할당 상수를 자유롭게 사용할 수 있게 된다. (코드가 전역변수로써의 기능을 하게 됨)

  • 사용 이유
    : 강제 unwrapping 하는 것 보다 안전하게 unwrapping 할 수 있음

-옵셔널 타입은 다른 스트링값과는 다른 타입을 가짐

  1. Force Unwrapping (강제추출)

강제추출은 잘 사용하지 않음. 지양한다.

참고자료
https://seolhee2750.tistory.com/10
https://www.youtube.com/watch?v=RxScvfe1dyU&ab_channel=yagom

profile
매일 개념 익히고 적용합니다

0개의 댓글