이 포스팅은 iOS Experience 시리즈 18 편 중 4 번째 글 입니다.

  • Part 1 - 01: 스토리보드의 장단점
  • Part 2 - 02: 코드리뷰 Part 1
  • Part 3 - 03: 코드리뷰 Part 2
  • Part 4 - This Post
  • Part 5 - 05: Optional Chaining의 동작 방법
  • Part 6 - 06: UITableView에 대해서
  • Part 7 - 07: 코드리뷰 Part 3
  • Part 8 - 08: 패키지 매니저
  • Part 9 - 09: URL Loading System
  • Part 10 - 10: Lazy를 잘 안쓰는 이유
  • Part 11 - 11: iOS Gitignore
  • Part 12 - 12: Toast UI에 대한 생각
  • Part 13 - 13: XCTest
  • Part 14 - 14: RunLoop
  • Part 15 - 15: UIApplication
  • Part 16 - 16: 코드리뷰 Part 4
  • Part 17 - 17: MVC to MVVM
  • Part 18 - 18: VIPER
▼ 목록 보기

IBOutlet에서의 Optional

  • 암시적 옵셔널 !은 nil인 상태를 가질 수 있으나, 바인딩을 하지않고 접근이 가능하다.
  • 옵셔널 ?을 사용하여 선언하면 바인딩을 한 후에야 해당 변수에 접근이 가능하다.
  • 스토리보드에서 ctrl을 누르고 코드에 넣으면 ! 로 선언이 되어서 자동적으로 들어가게 된다.
  • 인위적으로 ?로 선언을 바꾸는 것과 어떤 차이가 있을까?

암시적 옵셔널의 경우

image기본 화면

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var textLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        self.textLabel.text = "반영 Text"
    }
}
  • 현재 상황은 IBOutlet을 선언은 했지만, 실제 스토리보드의 뷰 인스턴스와 연결을 하지 않은 상태이다.
  • 이런 상황에서 아래 코드를 보면, 뷰가 로드되고, 해당 변수에 접근을 하게 된다.
  • 현재는 암시적 옵셔널이기 때문에 옵셔널 체이닝을 하지 않고도 해당 변수에 접근할 수 있다.
  • 이 상태에서 빌드하면 어떻게 될까?

imageRuntime Error

  • 당연히 런타임 에러다.
  • 왜냐하면 뷰가 로드된 후에, 해당 label instance를 IBOutlet을 통해 연결하지 않았는데(nil인데) 변수에 접근하라 했으니 잘못된 접근을 한 것.
  • 이런 경우 연결을 안했으니 연결해라. 라는 척도로써 작용할 수 있다.

옵셔널로 정의한 경우

스크린샷 2021-07-06 오후 11 08 27런타임 문제 없음

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var textLabel: UILabel?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        self.textLabel?.text = "반영 Text"
    }
}
  • 이번에는 옵셔널로 선언해보았다.
  • 이 경우, 해당 변수에 접근하기 위해서는 옵셔널 체이닝 을 사용해야 한다.
  • 옵셔널 체이닝의 정확한 동작방법은 다음 글에서 다루도록 하겠다.
  • 일단 textLabel이 nil이기 때문에, 해당 구문이 실행되지 않는다.
  • 그렇기 때문에 정상작동한다.
  • 이 경우, 개발자의 실수가 발생했고, QA에서도 발견을 못한 경우, 사용자가 크래시를 경험하지 않는다. 는 점이 있다.

장단점 정리

  • 암시적 옵셔널
    • 잘못된 뷰 인스턴스에 접근했을 경우, 런타임 에러가 난다.
    • 연결 여부를 확실히 개발 단계에서 알 수 있다.
    • QA 기간에 이런 오류를 발견할 가능성이 있다.
  • 옵셔널
    • 런타임에 에러가 나지 않는다.
    • 하지만 기능이 동작하지 않는 앱을 사용자가 사용할 수 있다.
    • 앱이 크래시는 나지 않는다.

정답은 없다. 선택의 영역이다.