[Swift] 옵셔널의 개념과 강제 언래핑

2023. 1. 19. 20:29·Apple/Swift
728x90
반응형

Optional Int형

  • Optional(10)
  • Optional Int형을 만들기 위해서는 Int? 또는 Int!를 사용한다.
  • -Int형 값을 저장하는 것은 물론이고 값을 저장 안 할 수도 있다.(값이 없음) (nil)

옵셔널 타입

  • 값을 반환할 때 오류가 발생할 가능성이 있는 값은 옵셔널 타입이라는 객체로 감싸서 반환한다.
  • Int("100")은 100이 아닌 Optional(100)을 리턴함, print(Int("100")), Int형 initializer
  • Int("Hello")은 정수 값을 반환할 수 없다. 이때 아무런 값도 반환할 수 없다는 의미로 nil을 반환하게 된다.
  • Swift에서 기본 자료형(Int, Double, Sting 등)은 nil값을 저장할 수 없다.
  • nil도 저장하려면 옵셔널 타입으로 선언해야 한다.
  • 옵셔널 타입은 변수 또는 상수에 아무런 값이 할당되지 않는 상황을 안전하게 처리하기 위한 방법을 제공하는 것이다.
  • 옵셔널 타입 변수를 선언하기 위해서는 타입 선언부 뒤에 "?" 문자를 사용한다.
  • ex) index라는 이름의 옵셔널 Int변수를 선언: var index: Int?

옵셔널 타입 강제 언래핑(forced unwrapping)

  • 옵셔널 변수에 값이 있으면 옵셔널로 "래핑되었다(wrapped)"고 한다.
  • 옵셔널에 래핑된 값은 강제 언래핑(forced unwrapping)으로 풀어준다.
4행에 주석을 제거하고 컴파일을 돌리면 Optional(22)가 출력된다.

 

옵셔널 타입 강제 언래핑 : optional binding

  • 강제 언래핑하는 또 다른 방법으로, 옵셔널 바인딩(optional binding)을 이용하여 옵셔널에 할당된 값을 임시 변수 또는 상수에 할당한다.

if let constantname = optionalName{
 //옵셔널 변수가 값이 있다면 언래핑해서 일반 상수 constantname에 대입하고 if문 실행
  //값이 없다면 if문의 조건이 거짓이 되어 if문을 실행하지 않음
}
 
if var variablename = optionalName {
  //옵셔널 변수가 값이 있다면 언래핑해서 일반 변수 variblename에 대입하고 if문 실행
  //값이 없다면 if문의 조건이 거짓이 되어 if문을 실행하지 않음
}     

컴파일을 실행하면 결과는 22와 nil이 출력된다.

여러 옵셔널을 언래핑

  • 여러 옵셔널 변수를 한 번에 언래핑을 할 수 있다.
  • 한 번에 언래핑을 하려면 콤마를 사용한다.
컴파일 결과: cat dog

 


두 가지 옵셔널 타입

  • 옵셔널이 항상 유효한 값을 가질 경우 옵셔널이 암묵적인 언래핑(implicitly unwrapped)이 되도록 선언할 수도 있다.
  • 클래스의 아웃렛 변수 초기화에서 많이 사용한다.(자동 생성되는 코드)
  • 이러한 방법으로 옵셔널이 선언 된다면 강제 언래핑이나 옵셔널 바인딩을 하지 않아도 값에 접근할 수 있다.
  • 암묵적인 언래핑으로 옵셔널을 선언하기 위해서는 선언부에 물음표(?) 대신에 느낌표(!)를 사용한다.
  • var x : Int? //옵셔널 변수 선언 방법 1
  • var y : Int! //옵셔널 변수 선언 방법 2

옵셔널을 사용하는 이유

  • 옵셔널 타입만이 값을 갖지 않는다는 의미의 nil 값을 가질 수 있다.
  • 즉, 값이 없는 상황이 생각보다 많기 때문에 그러한 상황에서 사용한다.
  • nil 값을 옵셔널이 아닌 변수나 상수에 할당할 수 없다.

 

감사합니다.


잘못된 내용이 있거나 더 좋은 내용 피드백은 언제나 환영합니다!
궁금하신 부분은 댓글로 질문 부탁드립니다!

728x90
반응형
저작자표시 (새창열림)

'Apple > Swift' 카테고리의 다른 글

[Swift] computed property, stored property, self, overloading  (0) 2023.02.01
[Swift] 클래스, 객체, 인스턴스  (0) 2023.01.31
[Swift] 함수와 메서드  (0) 2023.01.26
[Swift] 연산자와 제어문  (0) 2023.01.25
[Swift] 데이터 타입, 자료형, print 함수, 변수, 상수, 튜플  (2) 2022.07.08
'Apple/Swift' 카테고리의 다른 글
  • [Swift] 클래스, 객체, 인스턴스
  • [Swift] 함수와 메서드
  • [Swift] 연산자와 제어문
  • [Swift] 데이터 타입, 자료형, print 함수, 변수, 상수, 튜플
P_Piano
P_Piano
Apple 생태계 개발자가 되기 위한 학습과 경험의 기록
    반응형
    250x250
  • P_Piano
    피피아노의 개발 일지
    P_Piano
  • 전체
    오늘
    어제
    • 분류 전체보기 (201)
      • Apple (119)
        • iOS (22)
        • visionOS (4)
        • Swift (65)
        • UIKit (2)
        • SwiftUI (20)
        • RxSwift (2)
        • Xcode (4)
      • C언어 (5)
      • C++ (8)
      • Dart (1)
      • Python (3)
      • JavaScript (17)
      • Git (1)
      • CS (39)
        • 디자인 패턴 (6)
        • 네트워크 (20)
        • 운영체제 (8)
        • Database (5)
        • 자료구조 (0)
      • IT 지식 (2)
      • IT 뉴스 (4)
      • 출처 표기 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Xcode
    코딩테스트
    네트워크
    프로퍼티 래퍼
    비동기
    운영체제
    Optional
    오블완
    옵셔널
    제어문
    UIKit
    티스토리챌린지
    연산자
    visionOS
    자바스크립트
    combine
    메서드
    프로세스
    ios
    스위프트
    이니셜라이저
    함수
    디자인패턴
    Vision Pro
    swiftUI
    SWIFT
    변수
    Initializers
    배열
    클래스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
P_Piano
[Swift] 옵셔널의 개념과 강제 언래핑
상단으로

티스토리툴바