swift 기초 문법 <2>

구찌댕댕이·2022년 6월 17일
0

swift 기초 문법

목록 보기
2/12
post-thumbnail

옵셔널

옵셔널이란? -> 값이 없을수도 있고 값이 있을수도 있다.
값이 없다면 nil을 반환하며 오직 옵셔널 타입만 nil을 저장하고 반환할 수 있다.
기본 자료형(String, Int, Double 등) 은 nil값을 저장할 수 없다! -> nil 도 저장하려면 옵셔널 타입으로 선언해야한다!
코틀린에서는 nullable 이 비슷한 개념이다.
함수형 개념에서 많이 사용 한다.
옵셔널 선언: 자료형 뒤 ? , 옵셔널 언래핑: 변수명 뒤 !

//Int형 vs Optional Int형
var o: Int = 0
var p: Int?
p = 10  // 옵셔널엔 값을 안넣어줘도 된다.
print(o)  // 0
print(p)  // Optional(10)
print(p!) // 10 -> '!'를 붙여줘서 강제 unwrapping -> nil값을 언래핑 하면 오류가 뜬다
print(Int("100")!) // '!' 가 없다면 optinal(100) 으로 나옴. '!' 를 붙여줘서 값을 빼옴
print(Int("Hi")!) // nil 값으로 나옴. -> 정수 값을 반환할수 없음.
var index: Int? // 타입 선언부 뒤에 '?' 사용. **변수명 뒤에 쓰는거 아님!!**

옵셔널 바인딩 : 강제 언래핑하는 또다른 방법

옵셔널 변수에 값이 있다면 또다른 변수나 상수에 그 값을 할당.
값이 없다면 if문의 조건은 false가 되어 if 문을 실행하지 않는다.

var p : Int?
p = 10
if let l = p {
	print(l) // optional(10)이 언래핑 됨
    } else {
    	print("nil") 
    } 

if var k = p {
	print(k)
    } else {
    	print("nil")
    }

여러 옵셔널 변수를 언래핑

콤마를 사용하여 한꺼번에 if let으로 언래핑

var pet1: String?
var pet2: String?
pet1 = "cat"
pet2 = "dog"
if let firstPet = pet1, let secondPet = pet2 { // 동시에 언래핑
	print(firstPet, secondPet)
    } else { 
    	print("nil")
    }

var m: Int?
var n: Int?
m = 20
n = 10
if let mm = m, let nn = n { // 동시에 언래핑
	print(mm, n)
    } else {
    	print("nil")
    }

두 가지 옵셔널 타입

var x : Int?
var y : Int!
옵셔널이 항상 유효한 값을 가질 경우 !를 사용하여 항상 언래핑 되도록 선언. -> 옵셔널 바인딩이나 강제 언래핑 필요 없음
클래스의 아웃렛 변수 초기화에서 많이 사용 (자동 생성되는 코드)

let j : Int? = 1 // Optional(1)
let jj : Int = j!  // 1 -> 옵셔널 강제 언래핑
let jjj = j  // Optional(1)
let h : Int! = 1  

let hh : Int = h  // 1 -> 옵셔널 자동 언래핑
let hhh : Int = h! // 1 -> 옵셔널 강제 언래핑
let hhhh = h  // Optional(1) -> 타입 명시가 되지 않아 옵셔널로 사용 될 가능성 있음
let hhhhh = h + 1  // 2 -> 옵셔널 자동 언래핑 이후 연산가능

// Class 에서 예시
class MyAge {
    var age : Int!
    init(age: Int) {
        self.age = age
    }
    func printAge() {
        print(age)  // Optional(1)
        print(age+1)  // 2 -> age! + 1 라고 쓰지 않아도 된다.
        let age1 : Int = age
        print(age1)  // 1
        let age2 = age + 2
        print(age2)  // 3 -> 자동 언래핑 후 연산
    }
}
var youn = MyAge(age: 1)
youn.printAge()

왜 옵셔널을 사용하나요?

변수 또는 상수에 아무런 값이 할당되지 않는 상황을 안전하게 처리하기 위함
프로그램의 안전성을 높이기 위해 오류를 발생 시키는 것 대신 nil 값을 반환하여 문제가 있음을 알린다.
예외 적인 상황에 적용하기 위해서 사용 -> 값을 입력 해야 하는데 값을 입력하지 않는 상황까지 고려하는 것.
변수나 상수에 값이 없을것 같은 상황이 올거같다? 그러면 옵셔널로 선언 해야함!
ex) 숫자를 입력하면 2배로 계산해서 보여주는 기능이 있는데 이때 아무 숫자도 입력하지 않고 확인 버튼을 눌렀을때를 대비하는것.

출처 : https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA

profile
개발자를 꿈꾸는 사람 입니당

0개의 댓글