본문 바로가기

iOS

iOS_3grade - 2주차

print("안녕") // 문자열 출력
print(123) // 정수 출력
var age = 20
var name = "Smile"
print(age)
print(age, name) //공백으로 구분
print("나이는 \(age)입니다") // 문자열 보간 (string interpolation), \(변수명 or 상수명)
print(1, 2, 3) //공백으로 구분
print(1, 2, 3, separator: "-") //공백 구분자를 변경
print("Smile")
print("Han")
print("Hello", terminator: " ") // 줄 바꿈(\n) 대신 공백을 끝에 추가
print("World!")
print("다음", terminator: "") // 줄 바꿈도, 공백도 추가하지 않음
print("입니다.")
print(2,s,t)

 

자료형을 알 수 있는 함수 - type(of: ))

Character 형은 자료형을 명시하지 않을 경우 String 형으로 출력이됨.

 

mac에서의 기본적인 자료형의 크기는 64비트, 플랫폼마다 다름

타입 어노테이션은 변수의 자료형을 직접 지정하는

것이고, Swift는 타입 어노테이션이 없을 경우 타입 추론을 함

 

 

 

레이블이 있다면 포함해서 자료형에 표시됨

 

void = () 는 빈 튜플

 


옵셔널형이 아닌 자료형의 변수는 선언시에 반드시 값이 존재해야함

but, 옵셔널형 변수는 값이 없어도 됨. 있을 때는 해당 자료형에 대한 값이 있고, 없을 경우 nil이라는 값을 가짐

옵셔널 변수 출력 시 경고 메세지가 뜨며 항상 Optional() 에 래핑된 상태로 출력됨

- > 옵셔널을 언래핑하여 사용해야만 함.

언래핑 방법

1. 강제 언래핑 : 옵셔널형 변수 뒤에 느낌표를 붙여서 언래핑

- 옵셔널 변수가 값이 없는 nil의 상태일 경우 crash가 발생하기 때문에 주의

위의 예제에서 공백이 없을 경우, 옵셔널을 언래핑 하는 ! 연산자의 우선순위가 가장 높기 때문에 x! = nil 이라는 조건식이 나옴.

- 에러 발생, 반드시 공백을 넣을 것

 

2. 옵셔널 바인딩

세가지의 방법으로 간편하게 사용할 수 있고, 조건이 nil일 경우 if 문이 실행 안됨

 

var x : Int?
var y : Int?
x = 10
y = 20
if let xx = x, let yy = y {
    print(xx, yy)
}
else {
    print("nil")
}


if let x = x, let y = y {
    print(x, y)
}
else {
    print("nil")
}


if let x, let y {
    print(x, y)
}
else {
    print("nil")
}​

 

3. nil 병합 연산자


Swift에서 옵셔널(Optional) 은 값이 있을 수도 있고(nil), 없을 수도 있는 타입입니다.
옵셔널과 관련해서 자주 보이는 기호가 ?! 인데, 둘은 의미와 안전성이 꽤 다릅니다. 아래에서 구조적으로 설명할게요.


1️⃣ ? : Optional (안전한 옵셔널)

? 는 값이 있을 수도 없을 수도 있는 타입을 의미합니다.

var name: String?

이 뜻은:

  • name 에 String 값이 있을 수도 있음
  • nil일 수도 있음

예:

var name: String?

name = "Kim"
name = nil

둘 다 가능.


🔹 값을 사용하려면 Unwrapping 필요

옵셔널은 바로 사용할 수 없습니다.

var name: String? = "Kim"

print(name.count) // 오류

그래서 Unwrapping 해야 합니다.

방법 1️⃣ Optional Binding

if let name = name {
    print(name.count)
}

방법 2️⃣ Guard

guard let name = name else { return }
print(name.count)

방법 3️⃣ Optional Chaining

print(name?.count)

2️⃣ ! : Implicitly Unwrapped Optional

! 는 암시적으로 unwrap 되는 옵셔널입니다.

var name: String!

뜻:

  • 실제로는 Optional
  • 사용할 때 자동으로 unwrap

예:

var name: String! = "Kim"
print(name.count)   // unwrap 없이 사용 가능

⚠️ 문제점 (Crash 가능)

var name: String!
name = nil

print(name.count) // 런타임 크래시

이유

Unexpectedly found nil while unwrapping an Optional value

nil인데 강제로 풀어버림


3️⃣ 핵심 차이 정리

기호의미안전성사용 방식

? Optional 안전 반드시 unwrap
! Implicitly Unwrapped Optional 위험 자동 unwrap

4️⃣ 또 다른 ! (강제 Unwrap)

옵셔널 변수 뒤에 붙는 ! 도 있습니다.

var name: String? = "Kim"

print(name!)   // 강제 unwrap

뜻:

"nil 아니니까 무조건 풀어라"

하지만 nil이면 크래시


5️⃣ 실제 Swift 코드에서의 사용

일반적인 경우

var name: String?

UIKit / IBOutlet

@IBOutlet weak var label: UILabel!

이유

  • Interface Builder 연결 후에는 항상 존재

6️⃣ 그림으로 이해

Optional (?)

box
 └ value OR nil

Implicitly Unwrapped (!)

box
 └ value expected
    nil이면 crash

7️⃣ Swift 개발자들이 권장하는 규칙

대부분 상황:

? 사용

! 는 아래 경우만 사용

  • IBOutlet
  • 초기화 이후 반드시 값이 있는 경우
  • 프레임워크 요구

한줄 요약

?  = 안전한 Optional
!  = 위험하지만 편한 Optional

Any형은 어떤 자료형도 가능함 but, 매번 타입 검사를 해야해서 번거로울 수 있음

 

if 문 다음에는 실행문이 한 줄이어도 반드시 중괄호를 사용해야함

case 문에는 적어도 하나의 실행문이 존재해야함, 없으면 에러

Swift는 break 문을 사용하지 않아도 자동으로 루프를 빠져나옴

Swift에서 자주 사용하는 중요한 제어문(Control Flow) 들을 핵심 위주로 예제와 함께 정리해보겠습니다. Swift는 다른 언어와 비슷하지만 조건식 괄호가 필요 없고, 패턴 매칭이 강력한 특징이 있습니다. 🚀


1️⃣ if 조건문

가장 기본적인 조건문입니다.

let age = 20

if age >= 19 {
    print("성인입니다")
} else {
    print("미성년자입니다")
}

특징

  • 조건식에 괄호 ( ) 필요 없음
  • 반드시 Bool 값이어야 함
if age > 18 {
    print("성인")
}

Optional Binding과 함께 사용

Swift에서 매우 자주 사용하는 패턴입니다.

var name: String? = "Kim"

if let name = name {
    print("이름은 \(name)")
} else {
    print("이름이 없음")
}

옵셔널 값이 있을 때만 실행됩니다.


2️⃣ guard

조건을 만족하지 않으면 빠르게 함수에서 나가는 구조입니다.
Swift에서 안전한 코드 작성에 매우 많이 사용됩니다.

func printName(_ name: String?) {
    guard let name = name else {
        print("이름이 없습니다")
        return
    }

    print("이름: \(name)")
}

특징

  • 조건이 거짓이면 반드시 함수 종료
  • Optional unwrap에 많이 사용

3️⃣ switch

Swift의 switch는 매우 강력합니다.

let number = 3

switch number {
case 1:
    print("하나")
case 2:
    print("둘")
case 3:
    print("셋")
default:
    print("기타")
}

특징

1️⃣ break 필요 없음

다른 언어와 달리 자동 종료됩니다.

2️⃣ 범위 매칭 가능

let score = 85

switch score {
case 90...100:
    print("A")
case 80..<90:
    print("B")
case 70..<80:
    print("C")
default:
    print("F")
}

3️⃣ 여러 값 처리

let char = "a"

switch char {
case "a", "e", "i", "o", "u":
    print("모음")
default:
    print("자음")
}

4️⃣ for-in 반복문

Swift에서 가장 많이 사용하는 반복문입니다.

for i in 1...5 {
    print(i)
}

출력

1
2
3
4
5

배열 반복

let fruits = ["apple", "banana", "orange"]

for fruit in fruits {
    print(fruit)
}

딕셔너리 반복

let scores = ["Kim":90, "Lee":85]

for (name, score) in scores {
    print("\(name): \(score)")
}

5️⃣ while

조건이 참이면 계속 반복합니다.

var count = 0

while count < 5 {
    print(count)
    count += 1
}

6️⃣ repeat-while

최소 1번 실행되는 반복문입니다.

var num = 0

repeat {
    print(num)
    num += 1
} while num < 5

7️⃣ break

반복문을 즉시 종료합니다.

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

출력

1
2
3
4

8️⃣ continue

현재 반복만 건너뜁니다.

for i in 1...5 {
    if i == 3 {
        continue
    }
    print(i)
}

출력

1
2
4
5

9️⃣ where (Swift 특징)

반복문에서 조건 필터링이 가능합니다.

for i in 1...10 where i % 2 == 0 {
    print(i)
}

출력

2
4
6
8
10

🔟 defer

Swift 특유의 제어문입니다.

함수 종료 직전에 실행됩니다.

func test() {
    defer {
        print("함수 종료")
    }

    print("실행")
}

test()

출력

실행
함수 종료

🔥 Swift에서 특히 중요한 제어문 TOP 5

실무 기준으로 많이 쓰이는 순서입니다.

1️⃣ if
2️⃣ guard
3️⃣ switch
4️⃣ for-in
5️⃣ defer


한줄 정리

Swift 제어문 특징

  • 괄호 없는 if
  • 강력한 switch
  • Optional 처리용 guard
  • for-in 중심 반복
  • defer로 정리 코드 실행

 


프로그래밍에서 파라미터(Parameter)아규먼트(Argument) 는 비슷하게 들리지만 사용되는 위치가 다릅니다. 핵심은 “정의할 때 vs 호출할 때” 입니다. 👇


1️⃣ 파라미터 (Parameter)

함수를 정의할 때 사용하는 변수입니다.
함수가 입력값을 받기 위해 준비해 둔 변수입니다.

func greet(name: String) {
    print("Hello \(name)")
}

여기서

name

파라미터(parameter) 입니다.

왜냐하면:

  • 함수 정의(definition) 에서 사용됨
  • 값을 받기 위한 변수

2️⃣ 아규먼트 (Argument)

함수를 호출할 때 실제로 전달하는 값입니다.

greet(name: "Tom")

여기서

"Tom"

아규먼트(argument) 입니다.

왜냐하면:

  • 함수 호출(call) 시 전달됨
  • 실제 데이터 값

3️⃣ 한눈에 보는 차이

구분ParameterArgument

사용 위치 함수 정의 함수 호출
의미 입력을 받는 변수 실제 전달되는 값
예시 name: String "Tom"

4️⃣ 코드 전체로 보기

func add(a: Int, b: Int) {
    print(a + b)
}

add(a: 3, b: 5)

여기서

Parameter

a
b

Argument

3
5

5️⃣ 쉬운 비유

📦 택배 비유

함수

func sendPackage(address: String)
  • address → 파라미터
    (택배 받을 주소칸)

함수 호출

sendPackage(address: "Seoul")
  • "Seoul" → 아규먼트
    (실제로 적은 주소)

6️⃣ Swift에서 조금 더 특이한 부분 (중요)

Swift는 외부 파라미터 이름내부 파라미터 이름이 있습니다.

func greet(to name: String) {
    print("Hello \(name)")
}

호출

greet(to: "Tom")

구조

to   → argument label
name → parameter

7️⃣ 정리 (핵심)

Parameter = 함수 정의에 있는 변수
Argument  = 함수 호출 시 전달하는 실제 값

func sum(a: Int, b: Int)  ← parameter
sum(a: 1, b: 2)           ← argument

 

'iOS' 카테고리의 다른 글

iOS_3grade - 4주차  (0) 2026.03.24
iOS_3grade - 3주차  (1) 2026.03.17
iOS_3grade - 1주차  (1) 2026.03.03
iOS_프로젝트  (1) 2025.12.08
iOS_week13  (1) 2025.11.24