iOS실무 2주차

CDH·2025년 3월 12일

복습

데이터 타입(자료형, data type)

  • Swift에서 숫자를 저장하기 위한 변수 선언
  • Bool, Character, Int, Float, Double, String, Void
var myNumber = 10 // lowerCamelCase, UpperCamelCase
var myNumber : Int = 10 //int x = 10; //C언어

위와 같이 초깃값이 있을 경우에는 컴파일러가 타입 추론(type inference을 하므로 데이터 타입을 명시할 필요 없음 (var myNumber = 10 )

x= 10

  • // 주의 error '=' must have consistent whitespace on both sides, '=' 양쪽에 일관된 공백을 넣어야 함

자료형의 종류와 크기가 궁금할 때

var x = 10
print(type(of:x))
let s = MemoryLayout.size(ofValue: x)//8
let t = MemoryLayout<Int>.size
print(s, t) //swift memory size

결과
Int
8 8

문자열 안에서 변수나 상수 출력

var x = 10
print(type(of: x))
print(x)
print("x")
print("\(x)")
print("값은 \(x)입니다.") 
// 문자열 안에서 변수를 출력하는 방법: \(변수 또는 상수명)


Double, Float

  • 소수점이 있는 숫자
  • ex) 123.45
  • Double 타입(배정도, double precision) - 소수점 15자리 정밀도
  • Float 데이터 타입(단정도, single precision) - 소수점 6자리 정밀도

※ 소수점의 자료형을 명시하지 않으면 Float(32비트)이 아닌 Double(64비트)형으로 타입추론한다


그 외 자료형들

변수와 상수

  • 변수(var)는 값 변경 가능
  • 상수(let)은 값 변경 불가
  • 애플은 효율과 실행 성능을 위해 상수를 권장함
    ※ 상수(변수 포함)는 선언만 하고 값을 나중에 넣어도 됨 (자료형은 명시해야 함)

튜플(Tuple) + 과제

let myTuple = (10, 12.1, "Hi")
var myString = myTuple.2
print(myString) 

결과
Hi

let myTuple = (10, 12.1, "Hi")
print(type(of:myTuple)) 

결과
(Int, Double, String)

let myTuple = (count: 10, length: 12.1, message: "Hi")
print(type(of:myTuple))
print(myTuple.message, myTuple.2)

결과
(count: Int, length: Double, message: String)
Hi Hi


typealias Void = ()


Optional

옵셔널 타입(중요!)

값을 반환할 때 오류가 발생할 가능성이 있는 값옵셔널 타입이라는 객체로 감싸서 반환함

  • Int("100") // 100이 아닌 Optional(100)을 리턴함,print(Int("100")), Int형 initializer
  • Int("Hi") // 정수 값을 반환할 수 없음, 아무런 값도 반환할 수 없다는 의미로 nil을 반환
  • Swift에서 기본 자료형(Int, Double, String 등)은 nil값을 저장할 수 없음
  • nil도 저장하려면 옵셔널 타입으로 선언해야 함
  • 옵셔널 타입은 변수 또는 상수에 아무런 값이 할당되지 않는 상황을 안전하게 처리하기 위한 방법

  • 옵셔널 타입 변수를 선언하기 위해서는 타입 선언부 뒤에 “?” 문자를 씀
    - 주의 : 변수명 뒤에 “?”하는 것 아님

  • index라는 이름의 옵셔널 Int 변수를 선언
    - var index: Int?
    - index 변수는 정수 값을 갖거나 아무 값도 갖지 않을 수 있음(nil)

옵셔널 타입 강제 언래핑(forced unwrapping) 1

var x : Int?
var y : Int = 0
x = 10
print(x)
print(x!)
print(y)
x = x! + 2
print(x)

/* 
x = x + 2  // 불가능. 위와 같이 !를 사용하여 강제로 언래핑 필요
y = x      // 불가능. x와 y의 자료형이 각각 다르기 때문

아래와 같은 에러가 발생함. (if let이나 gaurd let을 사용해야 함)

원래는(강의에서) 이런 결과가 나옴

forced unwrapping

var x : Int? // nil
// x = 10
if x != nil { 
// 여기서 x!=nil 과 같이 붙여 쓰면 강제 언래핑이 돼서 주의해야 함
    print(x!)
} else {
    print("nil")
}

결과
nil

※ 강제 추출 연산자(!)는 높은 우선순위를 가진다.
옵셔널 값이 nil일 경우 crash가 생길 수 있으므로 옵셔널 바인딩 또는 옵셔널 체인을 사용하는 것이 좋다

옵셔널 타입 강제 언래핑(forced unwrapping) 2 : optional binding

  • 강제 언래핑하는 다른 방법으로, 옵셔널 바인딩(optional binding)을 이용하여
    옵셔널에 할당된 값을 임시 변수 또는 상수에 할당

optional binding

  • online swift compiler 에서는 옵셔널형의 변수나 상수를 출력할 때 as Any를 사용해줘야 에러 없이 사용 가능함
// online swift compiler 에서는 옵셔널형의 변수나 상수를 출력할 때 as Any를 사용해줘야 에러 없이 사용 가능함
var x: Int?
x = 10
print(x as Any) // 옵셔널을 Any로 변환하여 출력

if let xx = x { //옵셔널 변수 x가 값(10)이 있으므로 언래핑해서 일반 상수 xx에 대입하고 if문 실행
    print(xx) // 일반 Int 값이므로 문제 없음
    print(x as Any, xx as Any) // x도 Any로 변환하여 오류 방지
} else {
    print("nil")
}
/* 결과
Optional (10)
10
Optional (10) 10
*/


// 또는 아래와 같이 작성

var x: Int? 
print(x as Any)

if let x {  // Swift 5.7부터는 if let x 라고 써도 됨
    print(x)
} else {
    print("nil")
}
/* 결과
nil
nil
*/

참고 : https://docs.swift.org/swift-book/documentation/the-swift-programming-language/revisionhistory/

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/thebasics/

여러 옵셔널을 언래핑 (콤마 사용) + 과제

  • 주의: 콤마를 사용할 때 let을 다시 사용 해줘야 됨
var pet1: String?
var pet2: String?

pet1 = "cat"
pet2 = "dog"

if let firstPet = pet1, let secondPet = pet2 {
    print(firstPet, secondPet)
} else {
    print("nil")
}

과제 : 위 소스를 short form of if-let to the Optional Binding으로 변경

var pet1: String?
var pet2: String?
pet1 = "cat"
pet2 = "dog"

if let pet1, let pet2 {
    print(pet1, pet2)
} else {
    print("nil")
}

Nil-Coalescing Operator (Nil합병연산자) ??

  • 옵셔널변수 ?? nil일 때 할당되는 값
  • 옵셔널 변수의 값이 nil이면 ?? 다음 값으로 할당됨

var age : Int?
age = 20
print(age) //과제:값은? Optional(20)
var myAge = age ?? 1
print(myAge) //과제: 값은? 20


중요:옵셔널을 언래핑하는 여러가지 방법(guard-let제외)

var x: String? = "Hi"
print(x, x!)

if let a = x {
    print(a)
}
let c = x ?? ""
print(c)

// = "Hi" 를 지우면 에러 발생. (강제 언래핑이 존재하기 때문)


암묵적인 언래핑(implicitly unwrapped) 옵셔널

Implicitly Unwrapped Optional 특징

  • 형 다음에 ?가 아닌 !를 쓰는 옵셔널 형

  • Int!, String!

  • 먼저 일반 옵셔널 값으로 사용하려고 하지만, optional로 사용할수 없는 경우 Swift는 값을 자동으로 강제로 품

  • Optional로 사용할 수 없으면 자동으로 unwrap함


두 가지 Optional 형 : Int? vs Int!

참고 : 앱을 만들 때는 암묵적 언래핑(implicitly unwrapped)을 사용하는 경우가 많다

옵셔널 변수는 값을 초기화하지 않으면 자동으로 nil 값을 초기화한다 (변수에 nil값을 넣을 수 없음)

연산자(operator)

대입 연산자

증가 연산자(++)와 감소 연산자(--)는 없음

비교 연산자

범위 연산자

과제 (실행 결과)

let names = ["A", "B", "C", "D"]

// 2... (2부터 끝까지)
for name in names[2...] {
    print(name)
}

// ...2 (처음부터 2까지)
for name in names[...2] {
    print(name)
}

// ..<2 (처음부터 2 전까지)
for name in names[..<2] {
    print(name)
}

C
D
A
B
C
A
B


(중요) nil-Coalescing Operator (nil합병연산자) ??

  • 옵셔널변수 ?? nil일 때 할당되는 값
  • 옵셔널 변수의 값이 nil이면 ?? 다음 값으로 할당됨
  • 옵셔널 변수의 값이 nil이 아니면 언래핑된 값이 나옴
let defaultAge = 1
var age : Int? 
age = 20
print(age) //과제:값은? Optional(20)
 
var myAge = age ?? defaultAge  //age가 nil이 아니므로 언래핑된 값이 나옴
print(myAge) //과제: 값은? 20 (언래핑된 값)
var x : Int? = 1
var y = x ?? 0
print(y) // 1 출력

형 변환(as로 upcasting:자식인스턴스를 부모클래스로 변환)

형 변환(as! as?로 downcasting:부모인스턴스를 자식클래스로 변환)


제어문(Control Flow)

참고 : 없어진 문법

(중요) for-in 반복문

_로 참조체(i) 생략 가능

for i in 1...5 {
 print("\(i) 안녕")
 }
 for _ in 1...5 {
 print("안녕")
 }

배열의 항목 접근

let names = ["A", "B", "C", "D"]
for name in names {
 print(name)
}

A
B
C
D

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/collectiontypes/


dictionary의 항목 접근

  • 키와 밸류가 있다
  • 순서가 없기 때문에 매번 결과가 다르게 나온다
let numberOfLegs = ["human": 2, "Ant": 6, "Dog": 4]
 //dictionary는 key:value형식의 배열
for (animalName, legCount) in numberOfLegs {
 print("\(animalName)s have \(legCount) legs")
 }

human have 2 legs
Ants have 6 legs
Dogs have 4 legs


## while 반복문


repeat~while 반복문


반복문에서 빠져나오기(break)

  • 반복문이 완료되는 조건 전에 반복문을 빠져나오기
    - 특히 무한 루프를 생성할 경우

  • 현재의 반복문에서 빠져나와서 반복문 바로 다음에 있는 코드를 실행

중요!! 에러 수정 과제: error: expected '{' after 'if' condition
if 문 다음의 실행 코드가 한 줄이라도 괄호({})를 필수적으로 사용

생성형 AI사용 (Grok3) - 질문 : 위 코드를 올바르게 수정해줘

수정 코드

for i in 1..<10 {
    if i > 5 {
        break
    }
    print(i)
}

결과
1
2
3
4
5


continue문


if문


if문 조건에서 콤마:조건나열(condition-list)

아래의 주석과 같이 하면 에러 발생

 var a : Int? = 1
 var b : Int? = 2
 print(a,b)
 if let a1=a, let b1=b { //a와 b가 nil이 아니면, 언래핑하여 a1과 b1에 대입
print(a1,b1)
 }
 // if let a1=a && let b1=b { //error: expected ',' joining parts of a multi-clause condition
 //
 print(a1,b1)
 // }

if~else문

다중 if-else문


if let vs guard let

guard let의 가독성이 더 좋다


switch-case문

switch-case문예제

switch-case문 주의 사항

수정된 코드

let anotherCharacter: Character = "a"
switch anotherCharacter {
case "a": // 실행문이 필요함
    print("소문자 a") 
case "A":
    print("A글자")
default:
    print("A글자 아님")
}

결과
소문자 a

switch-case문 결합하기 : 콤마 사용


switch-case문에서의 범위 지정 매칭 (+과제)

let weight = 60.0
let height = 170.0
let bmi = weight / (height*height*0.0001)// kg/m*m
var body = ""



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


switch-case에서 where절 사용하기

where : 조건을 추가

  • 특정 패턴과 결합하여 조건을 추가
var numbers: [Int] = [1, 2, 3, 4, 5]
for num in numbers where num > 3 {
print(num)
}

결과
4
5


fallthrough

함수와 메서드(method)
클로저(closure)
클래스(class)

함수


전달인자/매개변수 vs 리턴값(반환값)


메서드(method)


함수를 선언하는 방법

func message(name: String, age: Int)-> String {
    return("\(name) \(age)")
}

Swift 함수 정의와 호출하기


C언어에서Swift 함수변경연습

 func add(x:Int, y: Int)-> Int {
 return(x+y)
 }
 add(x:10,y:20)
 
print(type(of:add))

0개의 댓글