옵셔널(Optional) 타입
Swift에서는 값이 없을 가능성이 있는 변수를 안전하게 처리하기 위해 옵셔널(Optional) 타입을 사용합니다.
1. 옵셔널이란?
옵셔널은 값이 존재할 수도 있고, 존재하지 않을 수도 있는 변수를 선언할 때 사용됩니다. 값이 없을 경우 nil을 반환할 수 있습니다.
2. 옵셔널 선언 방법
옵셔널 변수를 선언하려면 타입 뒤에 ?를 붙입니다.
var index: Int? // index는 Int 값을 가질 수도 있고, nil이 될 수도 있음
3. 옵셔널 값의 처리 방법
옵셔널 타입의 값을 사용할 때는 반드시 옵셔널을 해제(Unwrapping) 해야 합니다.
1) 강제 언래핑 (Forced Unwrapping)
!를 사용하여 강제로 값을 추출하는 방법이지만, 값이 nil일 경우 런타임 오류가 발생할 수 있습니다.
var number: Int? = 10
print(number!) // 10
2) 옵셔널 바인딩 (Optional Binding)
if let 또는 guard let을 사용하여 안전하게 옵셔널 값을 추출할 수 있습니다.
if let value = number {
print(value) // 10
}
guard let value = number else {
return
}
print(value) // 10
3) 옵셔널 체이닝 (Optional Chaining)
옵셔널이 연속적으로 포함된 객체를 다룰 때 ?를 사용하여 안전하게 호출할 수 있습니다.
class Person {
var name: String?
}
let person: Person? = Person()
print(person?.name) // nil (에러 발생하지 않음)
4) 기본값 제공 (Nil-Coalescing Operator)
?? 연산자를 사용하여 옵셔널이 nil일 경우 기본값을 제공할 수 있습니다.
let result = number ?? 0 // number가 nil이면 0을 반환
4. 옵셔널 언래핑 방법 (guard-let 제외)
옵셔널 값을 언래핑하는 여러 가지 방법을 정리하면 다음과 같습니다.
1) 강제 언래핑 (Forced Unwrapping) - 위험
var x: String? = "Hi"
print(x!) // "Hi" (하지만 x가 nil이면 런타임 오류 발생)
2) 옵셔널 바인딩 (Optional Binding) - 안전
if let a = x {
print(a) // "Hi"
}
3) Nil-Coalescing Operator - 안전
기본값을 제공하여 nil일 경우 대체 값을 반환합니다.
let c = x ?? ""
print(c) // "Hi"
4) 옵셔널 체이닝 (Optional Chaining) - 안전
옵셔널 프로퍼티나 메서드에 안전하게 접근할 수 있습니다.
let b = x?.count
print(b) // Optional(2)
5. 옵셔널 타입의 필요성
옵셔널은 값이 없을 가능성이 있는 변수를 안전하게 처리하기 위한 필수 개념입니다. Swift에서는 nil을 허용하지 않는 기본 타입(Int, Double, String 등)과 구분하여 안정적인 코드 작성을 가능하게 합니다.
클래스 vs. 객체 vs. 인스턴스
1. 클래스(Class)
- 객체를 생성하기 위한 설계도 역할을 하는 틀
- 예: class Dog {}
2. 객체(Object)
- 클래스에 의해 만들어진 실체
- 예: let coco = Dog() → coco는 객체
3. 인스턴스(Instance)
- 객체가 실제로 클래스에서 생성된 경우를 의미
- 모든 인스턴스는 객체지만, 모든 객체가 인스턴스는 아님
- 예: coco는 Dog 클래스의 인스턴스
형 변환(Type Casting)
1. 업캐스팅(Upcasting) - as
- 자식 클래스의 인스턴스를 부모 클래스로 변환
- 자연스럽게 변환 가능 (문제 발생 X)
예제:
let button: UIButton = UIButton()
let control: UIControl = button // 업캐스팅
2. 다운캐스팅(Downcasting) - as?, as!
- 부모 클래스의 인스턴스를 자식 클래스로 변환
- 명시적으로 변환해야 하며, 실패할 가능성이 있음
- as?: 실패하면 nil 반환 (안전함)
- as!: 실패하면 런타임 오류 발생 (주의 필요)
예제:
let control: UIControl = UIButton()
let button: UIButton? = control as? UIButton // 안전한 변환
let forcedButton: UIButton = control as! UIButton // 강제 변환 (위험)
반복문에서 빠져나오기 (break)
1. break 문이란?
- 반복문이 완료되기 전에 특정 조건이 충족되면 즉시 반복문을 종료하는 제어문
- 특히 무한 루프 방지나 특정 조건에서 반복을 중단할 때 유용
2. 사용법
for i in 1..<10 {
if i > 5 {
break
}
print(i)
}
출력:
1
2
3
4
5
3. 주의할 점
- if 문 다음 실행 코드가 한 줄이라도 반드시 {}(중괄호) 사용 필요
❌ 잘못된 예제:
for i in 1..<10 {
if i > 5 break // 오류 발생
print(i)
}
✅ 올바른 예제:
for i in 1..<10 {
if i > 5 {
break
}
print(i)
}
실습
1. 데이터 타입 (Data Type)
Swift에서 변수를 선언할 때 사용할 수 있는 주요 데이터 타입은 다음과 같습니다.
- 기본 데이터 타입: Bool, Character, Int, Float, Double, String, Void
- 변수 선언 예시:
var myNumber = 10 // 타입 추론(Type Inference)
var x: Int = 10 // 명시적 타입 선언
- 주의할 점:
- if 문에서 {}를 생략하면 오류 발생 (error: expected '{' after 'if' condition)
- print(x) 함수는 출력할 값을 콘솔에 표시
- Swift의 print 함수 정의 (구글링 결과 반영)
func print(
_ items: Any...,
separator: String = " ",
terminator: String = "\n"
)
- 실행 예시 및 출력 결과
print("Hello", "World") // Hello World
print("Swift", separator: "-") // Swift
print("End", terminator: "!") // End!
2. 데이터 타입 크기 확인 실습
Swift에서 데이터 타입의 크기를 확인하려면 MemoryLayout을 사용합니다.
var x = 10
print(type(of: x)) // Int
let s = MemoryLayout.size(ofValue: x) // 8바이트
let t = MemoryLayout<Int>.size // 8바이트
print(s, t)
출력 예시:
Int
8 8
3. 튜플 (Tuple) 실습
튜플은 여러 값을 하나의 단위로 묶어 저장하는 자료 구조입니다.
- 튜플 선언 및 초기화
let myTuple = (10, 12.1, "문자열")
print(myTuple.0) // 10
print(myTuple.1) // 12.1
print(myTuple.2) // "문자열"
- 이름이 있는 튜플
let person = (name: "John", age: 30)
print(person.name) // "John"
print(person.age) // 30
- 빈 튜플 (Void)
let emptyTuple: () = ()
print(emptyTuple) // ()
4. 옵셔널 값 언래핑 방법
옵셔널(Optional)은 값이 없을 수도 있는 변수를 선언할 때 사용합니다.
var x: String? = "Hi"
1) 강제 언래핑 (Forced Unwrapping) - 위험
print(x!) // "Hi" (하지만 x가 nil이면 런타임 오류 발생)
2) 옵셔널 바인딩 (Optional Binding) - 안전
if let a = x {
print(a) // "Hi"
}
3) Nil-Coalescing Operator - 안전
let c = x ?? ""
print(c) // "Hi"
4) 옵셔널 체이닝 (Optional Chaining) - 안전
let b = x?.count
print(b) // Optional(2)
5. 옵셔널과 연관 값 (Associated Value) 실습
Swift에서 enum을 사용하여 옵셔널을 직접 구현할 수도 있습니다.
public enum Optional<Wrapped> {
case none
case some(Wrapped)
}
옵셔널 값 할당 및 사용 예시:
var x: Int? = 20 // .some(20)
var y: Int? = Optional.some(10)
var z: Int? = Optional.none
var x1: Optional<Int> = 30
print(x, y, z, x1) // Optional(20) Optional(10) nil Optional(30)
과제
Swift 실습 및 과제 해결 정리
1. 정수 데이터 타입 (Int)
Swift에서 정수를 저장할 때 사용하며, 부호 있는 정수와 부호 없는 정수를 지원합니다.
var x: Int = 10
print("x: \(x)") // x: 10
print("Int32 Min = \(Int32.min) Int32 Max = \(Int32.max)")
// Int32 Min = -2147483648 Int32 Max = 2147483647
2. 튜플 (Tuple)
여러 개의 값을 하나로 묶어서 저장할 수 있는 데이터 구조
// 과제 1: myTuple의 자료형 확인
let myTuple = (10, 12.1, "Hi")
let (myInt, myFloat, myString) = myTuple
// 과제 2: 튜플의 값을 선택적으로 추출하고, 무시하고 싶은 값에 밑줄 사용
var (myInt2, _, myString2) = myTuple
// 과제 3: 각 값에 이름을 할당한 튜플
let myTupleNamed = (count: 10, length: 12.1, message: "Hi")
// 과제 4: myTuple 인스턴스의 message 값을 출력하는 코드
print(myTupleNamed.message, myTupleNamed.2)
// 실행 결과
//Hi Hi
3. 여러 옵셔널 변수 언래핑 (Optional Binding)
옵셔널 변수를 한 번에 언래핑하는 방법
if let firstPet, secondPet = pet1, pet2 {
print(firstPet, secondPet)
} else {
print("nil")
}
4. Nil-Coalescing Operator (??)
옵셔널 값이 nil일 경우 대체값을 제공하는 연산자
let defaultColor = "black"
var userDefinedColor: String? = nil
var myColor = userDefinedColor ?? defaultColor
print(myColor) // black
userDefinedColor = "red"
myColor = userDefinedColor ?? defaultColor
print(myColor) // red
let defaultAge = 1
var age: Int?
age = 20
print(age) // 20
var myAge = age ?? defaultAge
print(myAge) // 20
var x: Int? = 1
var y = x ?? 0
print(y) // 1
핵심 포인트:
- Int? 타입을 다룸 (첫 번째 코드에서는 String?).
- age ?? defaultAge → age가 nil이 아니므로 age 값이 사용됨.
- x ?? 0 → x가 1이므로 기본값 0은 사용되지 않음.
5. 범위 연산자 (Range Operators)
- 닫힌 범위 (...): x...y → x에서 시작하여 y로 끝나는 값 포함
- 반 열린 범위 (..<): x..<y → x에서 시작하여 y를 포함하지 않음
let names = ["A", "B", "C", "D"]
for name in names[2...] {
print(name) // C, D
}
6. 반복문에서 break
반복문에서 특정 조건을 만족하면 종료하는 기능
for i in 1..<10 {
if i > 5 {
break
}
print(i) // 1 2 3 4 5
}
7. BMI 계산을 switch-case로 변환
if-else문을 switch-case로 변경
let weight = 60.0
let height = 170.0
let bmi = weight / (height * height * 0.0001)
var body: String
switch bmi {
case ..<18.5:
body = "저체중"
case 18.5..<25:
body = "정상"
case 25..<30:
body = "1단계 비만"
case 30..<40:
body = "2단계 비만"
default:
body = "3단계 비만"
}
print("BMI:\(bmi), 판정:\(body)")
8. switch-case에서 범위 지정 매칭
범위를 활용한 switch문
let num = 25
var count: String
switch num {
case 0..<10:
count = "작다"
case 10..<99:
count = "적다"
case 100..<999:
count = "크다"
default:
count = "너무 큼"
}
print("\(count)입니다.") // 적다입니다.
9. switch-case에서 where절 사용
where절을 활용하여 추가 조건을 부여
var temperature = 60
switch temperature {
case 0...49 where temperature % 2 == 0:
print("Cold and even")
case 50...79 where temperature % 2 == 0:
print("Warm and even")
case 80...110 where temperature % 2 == 0:
print("Hot and even")
default:
print("Temperature out of range or odd")
}
'Study > iOS' 카테고리의 다른 글
[iOS] iOS 프로그래밍 실무 4주차 정리 (1) | 2025.03.27 |
---|---|
[iOS] iOS 프로그래밍 실무 3주차 정리 (0) | 2025.03.20 |
[iOS] iOS 프로그래밍 실무 1주차 정리 (0) | 2025.03.06 |
[iOS] iOS 프로그래밍 기초 14주차 정리 (26) | 2024.12.05 |
[iOS] iOS 프로그래밍 기초 13주차 정리 (2) | 2024.11.28 |