티스토리 뷰

개발 블로그/iOS

[Swift] Optional이란..?

개발자 아라찌 2019. 12. 20. 19:09
728x90

 

Swift엔 옵셔널이란게 있어!

옵셔널..? 그게 뭔데 ㅇ_ㅇ

옵셔널은 Swift코드를 보면서 자주 봤겠지만(보게 될꺼지만..?) 이렇게 생긴거에요..

let a: String? // 변수 초기화 안해??
a = "apeach" // 휴 편-안
print(a) // Optional("apeach")
// ????
print(a!) // apeach
// 띠용..

let b: String = "123"
print(Int(b)) // err
// ?????
print(Int(b)!) // 123
// ????

코드를 보면 이상한게 참 많죠?? !가 있는가 하면 ? 이것도 있고…
근데 이렇게 특이하게 생긴 Optional이 Swfit에선 짱짱한 기능이에요..

그럼 지금부터 Swift 언어 특징 중 하나인
Optional에 대해 알아보겠습니다요..

옵셔널이란..?

옵셔널은 값이 있을수도, 없을수도 있다는걸 나타내는 표현 수단이에요.
정확하게 말하면 …

옵셔널은 제네릭이 적용된 enum

?????

ㅋㅋ 간단하게 값이 있는지(!) 없을지도 모르는지(?)를 나타내는 수단이라고 생각하면 좋은데 Optional의 구조를 알고가면 도움이 될꺼에요. 옵셔널은 대략 이렇게 생겼어요.

public enum Optional<Wrapped>: ExpressibleByNilLiteral {
    case none
    case some(Wrapped)
    public init(_ some: Wrapped)
    ...
}

enum으로 정의되어있는데 <Wrapped> 라고 옆에 표시되어 있는데, 이게 바로 제네릭이에요. Int형이 올지, String이 올지 모르니깐 자료형 자체를 변수를 둬서 사용하는게 제네릭(틀리면 수정요청)

옵셔널 사용 이유

그럼 옵셔널이란게 뭔지 대충은 알겠는데 왜 쓰는건지 알아야겠죠??
옵셔널을 사용하는 이유는 안전하게 사용하기 위해, 그리고 가독성을 높이기 위해 사용해요

아까 보여줬던 위의 예시를 통해 설명하자면

let a: String? // 변수 초기화 안해??
a = "apeach" // 휴 편-안
print(a) // Optional("apeach")
// ????
print(a!) // apeach
// 띠용..

let b: String = "123"
print(Int(b)) // err
// ?????
print(Int(b)!) // 123
// ????

let a 라고 a라는 변수를 선언했는데 타입옆에 ? 가 있죠?? 이게 옵셔널로 선언했다는 표시고 이렇게 표시되면 a라는 변수는 이제부터 값이 있을수도, 없을수도 있다는 의미에요.
그래서 a라는 값에 “apeach”라는 값을 넣어줫지만 print문을 사용할때 옆에 Optional라는 추가 문구가 떠요. 만약 값을 안넣어줬다면 nil이 뜨는데 여기서 옵셔널의 강력한 기능이 나와요.
옵셔널로 변수를 선언하고 사용할때, Xcode에서 항상 안전하게 사용하라고 에러창 메세지가 나오는데, 이유는 값이 있는지 없는지 모르기 때문에 알려주는 것이고, 사용시 값이 없었다면 자동으로 nil로 초기화를 해줘서 에러날 일이 비교적 적어요.
약간 채로 에러날 부분들을 거르는 느낌이라고 해야하나..?

이제 b를 봐보면, let b를 통해 b에 “123”이라는 값을 부여했는데, 이를 Int 메소드를 통해 Int화 할려했는데 이렇게 하면 err창이 뜨는걸 볼 수 있어요. 왜냐하면 Int화 할때 그 값이 숫자가 아닐수도 있기 때문에 Int 메소드의 리턴값은 Int? 로 되어 있기 때문이죠. 즉 이것도 옵셔널이 붙어있어서 이걸 풀어주는 과정이 필요해요 =_=.. 그런데 그 값이 확실히 있어!! 라고 컴파일러한테 알려주는 표현 방법이 바로 ! 이거인거고..

옵셔널 선언

그럼 본격적으로 사용방법 중 옵셔널 선언방법에 대해 알아볼게요.

옵셔널은 선언시 타입 옆에 ? 를 붙혀주면 옵셔널이 되요.

let a: String?

옵셔널은 다양하게 쓸 수 있는데 메소드의 반환형에서도 사용할 수가 있어요. 이런식으로..

func makeImage(key: Bool) -> UIIMage? {
	if key == true {
		return UIImage()
	} else {
		return nil
	}
}

옵셔널 변수 사용

그럼 옵셔널로 선언한 변수는 어떻게 사용할까?

옵셔널 변수 사용방법은 크게 2가지가 있다.

  • 강제 추출
  • 옵셔널 바인딩
    
  • 추출이란 변수 옆에 !를 표시함으로써 강제로 옵셔널 변수에 값이 있으니 나 사용할래! 라고 강제로 사용하는걸 말한다.
2. a: String? = "apeach"
3. // apeach
  1. 바인딩은 if나 guard문을 사용하여 값이 nil인지를 먼저 확인 후에 없으면 사용하는 방법이다.
  2. if문 활용 옵셔널 바인딩
6. a: String? = "apeach"
7. let apch = a { // 만약 a에 값이 없다면 괄호안 코드 실행 x
8. // apeach
}
  1. guard문 활용 옵셔널 바인딩
10. a: String? = "apeach"
11. let apch = a else { // 만약 값이 없다면 return 되버림.
	return
}
12. // apeach
  1. Swift의 옵셔널에 대해서 알아봤어요.. 아직 미숙하지만 다음에는 옵셔널 체이닝이란 것도 한번 알아봐서 추가 포스팅을 해보겠습니다. 그럼 다들 좋은 하루되시구.. 힘내세용.. 화이팅..
728x90
댓글