iOS

iOS 프로그래밍 기초 (3주) [optional,as,nil,연산자,제어문]

DeathStar183 2024. 9. 20. 10:17

이번주차에 보고 갈것들

 

- 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)