일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 30개프로젝트로배우는iOS앱개발withSwift초격차패키지Online.
- 패스트캠퍼스
- 자바스크립트
- 코딩자격증
- 패캠챌린지
- 파이썬
- 수강료0원챌린지
- 직정인자기계발
- 환급챌린지
- 패캠강의후기
- 패스트캠퍼스후기
- 직장인인강
- 패캠인강후기
- 코딩교육
- 패캠reactnative
- 직장인공부
- fastcampus
- reactnative강의
- 오공완
- 패캠
- 코딩테스트
- 직장인자기계발
- 자바
- Today
- Total
라티의 작은 일기장
[2일차] 옵셔널과 옵셔널 바인딩 본문
아직 기본 문법을 공부 중이다... 다른 일정들과 병행 중에 있다지만 학습 곡선이 완만해지지 않도록 더 노력할 것이다.
옵셔널?
옵셔널이란, 값이 있을 수도 있고 없을 수도 있는 상태를 말한다. 이과인이라 어느 고양이가 한 마리 떠오른다...
강의에서 들고 있는 예시를 한 번 살펴보자.
var name:String = "Rati"
name이라는 변수를 생성하고 "Rati"라고 하는 String 타입의 값을 할당하는 코드이다.
그럼 만약 변수 name에 값을 할당하고 싶지 않은 채로 생성하려면 어떻게 해야 할까?
var name:String = ""
이렇게 큰따옴표 내부에 어떠한 값도 넣지 않으면 될까?
그렇지 않다. 이 코드는 name이라는 변수를 생성하고 '비어있는 문자열'을 할당하는 코드인 것이다.
값을 할당하지 않으려 할 때, 타 언어를 공부해본 우리는 자연스럽게 하나의 키워드를 떠올릴 수 있다.
바로 NULL.
Swift에서는 이것을 nil이라고 표현한다.
var name:String = nil
그렇지만 nil은 변수에 할당할 수 있는 값이 아니다. 그저 아무것도 없음을 표현하는 상태일 뿐.
따라서 위 코드는 "'nil' cannot initialize specified type 'String'"이라는 에러를 발생시킬 것이다.
옵셔널은 바로 이 때 사용된다.
var name:String?
변수의 타입 뒤에 ?라는 연산자를 붙여주면 이 name은 옵셔널 변수가 되고, 값을 할당하지 않으면 nil로 초기화된다.
코드에는 아무 값도 할당하지 않았지만, 옵셔널 변수는 값을 할당하더라도 컴파일러 입장에서는 값이 있을 수도, 없을 수도 있는 불확실성을 가지고 있기 때문에 일반적인 변수들과 연산 및 대입 등이 불가능하다. 새삼 Swift의 안전성에 놀랐다.
옵셔널 변수 name의 값에 특정 문자열을 붙인 값을 저장하는 fullName 변수는 이렇게 에러를 발생시킨다.
에러 메시지에 따르면 옵셔널은 변수를 감싼 포장지와도 같기에, String 타입의 value를 활용하려면 포장지를 벗겨줘야 한다.
그래서 이렇게 옵셔널 변수를 일반 변수와 같이 활용하려면 옵셔널 바인딩이라는 포장지 해제 작업이 필요하다.
옵셔널 바인딩?
말 그대로 옵셔널 상태를 해제하는 것이다.
해제 방법은 명시적 해제와 묵시적 해제로 나뉘고, C언어의 형변환(Casting)에서의 표현과 의미를 같이 한다.
명시적 해제는 ! 연산자를 통해 강제로 해제하는 것이다.
var number:Int? = 3
print(number!)
하지만 명시적 형변환이 그랬듯 프로그래머가 강제로 무언가를 한다는 것은 항상 위험성을 내포한다.
프로그램 입장에서 더욱 안정적인 것은 묵시적 해제이다.
if let result = number {
print(result)
} else {
return
}
이런식으로 컴파일러 입장에서의 불확실성을 if 조건문 등으로 해소시켜주면 된다.
위 코드는 result 상수에 옵셔널 변수의 값이 존재한다면 그 값을 저장해서 출력하고, 옵셔널 변수에 값이 없다면 그대로 반환한다.
다음과 같이 guard 문법을 활용할 수도 있다.
func test() {
let number: Int? = 5
guard let result = number else {return}
print(result)
}
guard 문은 해당 Line의 실행 결과가 true인 경우에만 실행하고, false라면 else문을 실행하는 문법이다.
옵셔널 변수를 활용한다면 주로 사용하게 될 것 같다.
패스트캠퍼스 바로가기 : http://bit.ly/3Y34pE0
> 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'Swift' 카테고리의 다른 글
[6일차] 상속 (0) | 2023.02.25 |
---|---|
[5일차] 프로퍼티 (0) | 2023.02.24 |
[4일차] 초기화 구문 init() (0) | 2023.02.23 |
[3일차] 구조체와 클래스 (0) | 2023.02.22 |
[1일차] Swift 기본 문법 공부 및 첫인상 (0) | 2023.02.20 |