/**
모든 프로그래밍에서 아래와 같은 상황은 항상 골치거리임
1. 데이터 타입에 ? 를 붙인다.
2. 일반 타입과 옵셔널 타입은 완전 다른 타입이다.
3. 일반 타입은 nil 을 할당할 수 없다 하지만 옵셔널 타입은 nil 할당 가능
*/
var yourName: String? // 선언
//yourName = "홍길동" // 초기화
print(yourName) // nil 은 값이 없음을 표현하는 키워드, 실제 값이 없진 않다.
var yourAge: Int? = nil
//var yourAge = nil // 옵셔널로 하면 타입을 지정해줘야함 타입추론으론 안됨.
var name: String? = "소야"
var num: Int? = 3
var optionalName: String?
print(optionalName)
print(num)
// 정식문법 표기
var num1: Int? = 2 // 간편표기
var num2: Optional<Int> = 0 // 정식문법
// 옵셔널 타입 연습
var optionalNum: Int? = nil
optionalNum = 10
print(optionalNum!) // 옵셔널 벗기기 선언 후 변수명에!
// 옵셔널 타입은 항상 var 로 사용해야함.
var optionalStr: String? = nil
// 옵셔널을 다른 변수에 담는다면 옵셔널 타입으로 된다.
var a: Int? = 7
var b = a
print(b)
// 옵셔널 타입에 일반타입을 담으면 옵셔널 타입이 사라지는 건 아니다. 안에 값만 변경 가능.
var c: Int = 5
b = c
print(b)
// 옵셔널 타입끼리는 연산이 불가능
var numA: Int? = 3
var numB: Int? = 7
//print(numA + numB)
var numC: Int? = nil
print(numC)