[Swift] 옵셔널(Optional)

민니·2022년 6월 21일
0

Swift 문법

목록 보기
4/17

🫥 옵셔널 🫥

  • 옵셔널 개념
  • 옵셔널 타입 선언과 정의
  • 옵셔널 값 처리


옵셔널 개념

  • nil을 사용할 수 있는 타입과 사용할 수 없는 타입을 구분하고, nil을 사용할 수 있는 타입을 가리켜 옵셔널 타입이라고 함.
  • 언젠가 오류가 발생할 수 있는 가능성이 있다면, 옵셔널 타입으로 정의해야 함.
  • 반환하고자 하는 값을 옵셔널 객체로 다시 한 번 감싼 형태.

Q. 그냥 편하게 모든 값을 옵셔널 타입으로 선언하고 사용하면 안 돼? 🤔
A. 값을 사용할 때마다 일일이 nil인지 아닌지 체크해야 해서, 프로그램 로직을 복잡하게 할 수 있음!

옵셔널 타입 선언과 정의

  • 일반 자료형 뒤에 물음표만 붙이면 됨.
ex)
//옵셔널 Int 타입
var optInt : Int?
//옵셔널 String 타입
var optStr : String?
  • 옵셔널 타입으로 자료형을 선언하면 자동으로 nil로 초기화됨.


옵셔널 값 처리

  • 옵셔널 선언 시 결과값으로 전달받는 것은 Optional이라는 객채이고, 내부에 우리가 원하는 값이 있음.
  • 원하는대로 사용하려면 옵셔널 객체를 해제해야 함!
    -> Optional Unwrapping
  • 옵셔널 해제 방법
    명시적 해제: 강제 해제, 비강제 해제
    묵시적 해제: 컴파일러에 의한 자동 해제, !연산자를 이용한 자동 해제

명시적 해제

- 강제 해제

  • 옵셔널 타입 값 뒤에 ! 기호만 붙여주면 됨.
  • '!'를 강제 해제 연산자라고 한다.
var optInt : Int? = 3
print("옵셔널 자체 값: \(optInt)") //Optional(3)
print("옵셔널 강제 해제 값: \(optInt!)") //3

Q. 그럼 그냥 모든 옵셔널 타입 변수를 강제 해제 해서 사용하면 안 돼...? 🤔
A. 값이 nil인 옵셔널 변수에 !를 붙이면 오류가 발생함! 그러면 옵셔널 타입을 사용하는 이유가 없잖아,,,

- 비강제 해제(옵셔널 바인딩) ⭐️⭐️⭐️⭐️⭐️

  • if let
var optName: String? = "mini"
if let safeName = optName {
	print("값이 변환되었습니다. 변환된 값은 \(safeName)" 입니다. ) 
} else {
	print("값 변환에 실패하였습니다.")
}
//출력: 값이 변환되었습니다. 변환된 값은 mini

✏️ if let 사용 시, 해당 블록 안에서만 사용이 가능하다.


  • guard let
var optName: String? = "mini"
guard let safeName = optName else { return }

print(safeName)
//출력: mini

✏️ guard let 사용 시, guard let 구문 밖에서도 할당한 상수를 자유롭게 이용할 수 있다. print(safeName)처럼!


묵시적 해제

- 컴파일러에 의한 옵셔널 자동 해제

  • 명시적으로 강제 해제를 하지 않아도 컴파일렁서 자동으로 옵셔널을 해제해 주는 경우
  • 옵셔널의 객체의 값을 비교 연산자를 사용하는 경우
  • 비교 연산을 처리할 때는, 옵셔널 타입 여부에 구애받지 않고 일반 자료형처럼 비교하면 됨
let tempInt = Int("123") //true
tempInt == 123 //true
tempInt == Optional(123) //true
tempInt! == 123 //true
tempInt! == Optional(123) //true

- ! 연산자를 사용한 자동 해제

  • 묵시적 옵셔널이라고도 불림
  • 옵셔널 타입이긴 하지만 값을 사용할 때는 자동으로 옵셔널을 해제하므로 굳이 !를 사용하여 해제할 필요 없음.
var str: String != "Swift Optional"
print(str)
// 출력: Swift Optional
  • ! 연산자 붙여서 정의 하면 옵셔널 타입이 됨. 일반적으로 사용할 때 강제 해제나 옵셔널 바인딩 과정 없이 일반적인 변수처럼 다루어도 됨.
  • 변수의 값이 nil이 될 가능성이 있다면 묵시적 옵셔널 해제를 사용하지 않아야 함
  • 클래스나 구조체 내에서 유용하게 사용된다.




출처: 꼼꼼한 재은씨의 Swift 문법편

0개의 댓글