iOS 프로그래밍 기초 (3주) [optional,as,nil,연산자,제어문]
이번주차에 보고 갈것들
- optional
- nil
- 연산자
- 제어문
- as
(빨간색글씨나 볼드체는 된것은 특히 더 중요한것을 의미합니다.)
(이제부터 부분적으로 참고용 코드도 함께 배포합니다.)
1-1. 옵셔널 타입 (Optional)
1-2. 옵셔널 타입이란 대체 무엇인가?
2-1. 일반 int형 vs 옵셔널 int형 예시 (언어 : swift)
일반 Int형 = Int형 값을 저장함
var x : Int = 10
print(x) // 10
옵셔널 Int형 = Int형 값을 저장 or 값이 없음을 반환 (nil)
var x : Int?
x = 10 //<<이걸 주석처리하면 값이 없다는걸 출력(nil이 출력됨)
print(x) //optional (10)
2-2. optional이 너무 거슬리다면? 원래대로 바꾸는 방법
var x : Int? //옵셔널 변수
var y : Int = 0
x = 10 // 주석처리시 = nil
print(x) // Optional(10)
print(x!) // << 강제 언래핑 시켜서 원래 변수인 10이 나옴
print(y)
// optional (10) , 10 , 0
x = x + 2 // 가능 optional (10) << 원래는 12지만 추가 출력이 없으므로 10이 됨
y = x // 불가능 error
x를 더하는건 가능하면서 x를 y에 대입하는건 왜 불가능할까?
x를 일단 강제 언래핑 했으므로 int형 10이다. 하지만 2를 더하면 위의 Int?로 다시 들어가면서 옵셔널 변수가 되어버린다.
당연히 일반형 Int형 정수 자리에 옵셔널 변수를 집어넣을수 없으므로 에러가 나게 된다.
2-3. 옵셔널 강제 언래핑시 주의사항
2-4. 옵셔널 강제 언래핑 2번째 방법 (optional binding)
옵셔널 바인딩을 이용한 강제 언래핑은 좀더 사용하기 간편하고 쉽습니다.
걍 변수를 상수화(let) 시켜서 사용해버리면 강제로 일반 Int형 변수로 끄집어 나와집니다.
이걸 제가 예시로 들어보겠습니다.
뭔가 많아 보이지만 요약해버리면 아래 코드 처럼 됩니다.
var pet1: String?
var pet2: String?
pet1 = "cat"
pet2 = "dog"
if let pet1, let pet2
{ print(pet1, pet2) } // short-form of if let to the optional binding
이렇게 요약이 가능합니다 (else는 가독성 좋아보이라고 빼버렸습니다.)
var pet1: String? = "cat"
var pet2: String? = "dog"
print((pet1 ?? "nil"), (pet2 ?? "nil"))
//극한으로 줄이면 이런 방식도 되긴 하는데 일단 스킵
2-5. 여러 옵셔널값 언래핑 (콤마 미사용)
요약해보자면, 저 옵셔널이 있고 강제 언래핑은 2가지 방법인가보다 라고 생각할수 있습니다.
하지만 안타깝게도 아니랍니다.......
아직 한발 남았습니다.
3-1. 두가지 옵셔널 타입 : Int? Int!
옵셔널 Int? 는 값을 저장할수 있거나 , 값이 없는 경우가 있지만 (nil)
Int! 는 항상 유효한 값을 가지고 있다는 옵셔널이란 점이 다릅니다. (암묵적인 언래핑이라고도 함)
3-2. 암묵적인 언래핑 옵셔널과 예시
!를 사용한 옵셔널은 그자체로 사용이 불가능하면 자동으로 언래핑됩니다.
3-3. 옵셔널을 사용하는 이유는?
옵셔널은 연관값을 가지는 enum이라는 말이 있으나, 이는 추후 열거형에서 다시 설명하겠습니다.
4. 연산자 (사실상 4-7만 보면됩니다.)
연산자의 우선순위와 결합성 (자료 참고 홈페이지들)
https://developer.apple.com/documentation/swift/operator-declarations
https://www.programiz.com/swift-programming/operator-precedence-associativity
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/basicoperators/
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/advancedoperators/
4-1. 대입 연산자
4-2. 산술 연산자
4-3. 복합대입 연산자
4-4. 증가,감소 연산자
4-5. 비교 연산자
4-6. 불리언 논리 연산자
4-7. 범위 연산자 (중요한 내용)
잠깐 마지막에 one-side어쩌고 하는걸 설명하고 넘어가겠습니다.
one-side, 즉 한쪽 범위만을 판정하는 연산자인 셈입니다.
let names = ["A", "B", "C", "D"]
for name in names[2...]
{ print(name) }
대충 풀어서 써보자면...
1. 상수화된 배열안에 문자열 A,B,C,D가 들어가 있습니다. (swift배열은 첫번째 배열이 0이 아니고 1임)
2. names 배열의 2번째 이후만 프린트문을 이용해 출력한다. (2... 는 2번째 이후, 즉 3번째부터를 의미)
3. 결론은 C와 D가 출력된다. [...2 , ..<2는 A만 출력됩니다]
이런식으로 쓸수있겠네요.
4-8. 삼항 연산자
5. 제어문 (control flow)
제어문도 익숙한 부분이 많으니 다른부분만 짚고 넘어가겠습니다.
5-1 for문 (for - in)
C계열과 다른점이 있다면 참조체인 i가 밑줄(_) 생략이 가능합니다.
for _ in 1...5 //참조체인 i가 없어도 작동
{ print("HI!") }
for i in 1...5
{ print("\(i) HI!") }
5-2 while문
결과는 뭐... 1에서 1000까지 더한값이겠죠? (500500)
5-3. repeat ~ while (do ~ while)문
5-4. break 및 에러 수정
여기에 오류가 있다는데 도대체 무슨 오류일지 알고 계시나요? (사실 답이 나와있긴 합니다.)
for i in 1..<10 {
if i > 5 { break } //<<if문 계열 특성상 break만 있어도 중괄호로 감싸야 에러 방지
print(i)
}
//중요!! 에러 수정: error: expected '{' after 'if' condition
//if 문 다음의 실행 코드가 한 줄이라도 괄호({})를 필수적으로 사용
바로 break 혼자만 있더라도 (if문 계열이면) 무조건 중괄호로 한번 감싸야 에러를 막습니다.
5-5. continue
5-6. if , if~else , 다중 if ~ else
이렇게 조건이 여러개인 경우는 switch ~ case로 바꿔먹기 아주좋은 예시이죠
솔직히 별거 없고 if > switch , else if가 > case로 변한게 대부분입니다.
let weight = 60.0
let height = 170.0
let bmi = weight / (height * height * 0.0001) // kg/m*m
var body: String
switch bmi {
case 40...: //범위 연산자를 이용한 깔끔한 표현
body = "3단계 비만"
case 30..<40:
body = "2단계 비만"
case 25..<30:
body = "1단계 비만"
case 18.5..<25:
body = "정상"
default:
body = "저체중"
}
print("BMI:\(bmi), 판정:\(body)")
5-7. guard문
조건식이 거짓일때 실행이라는 참 특이한 구성을 가진얘인데, 나이를 예시로 들어보겠습니다.
25살 까진 학생 신분이며, 그 이상이면 그냥 나이로 출력하는걸 전제로 한 코드입니다.
func myAge(value: Int?) {
guard let number = value, number =< 25 else {
print("당신은 아직 학생입니다.")
return
}
print("당신의 나이는"\(number)"살입니다.)") //조건식이 참일 때 실행
}
myAge(value: 17) // guard
myAge(value: 24) // guard
myAge(value: 31)
5-8. switch ~ case
5-9. switch ~ case 와 where절 결합
성적을 기반으로한 예시코드
let score = 91
switch score {
case 90...100 where score >= 95:
print("A+")
case 90...100:
print("A")
case 80..<90 where score >= 85:
print("B+")
case 80..<90:
print("B")
.....
5-10. fallthrough
6. 형변환 관련(as)