πŸ₯– Bread Basics/Swift

Swift 곡식 λ¬Έμ„œ 정리 - κΈ°λ³Έ μ—°μ‚°μž (Basic Operators)

BreadDev 2025. 4. 10. 17:33
728x90

μ•ˆλ…•ν•˜μ„Έμš” μ˜€λŠ˜μ€ Swift ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ κΈ°λ³Έ μ—°μ‚°μžμ— λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. μ—°μ‚°μžλŠ” Swiftμ—μ„œ 값을 μ‘°μž‘ν•˜κ³  κ³„μ‚°ν•˜λŠ” 데 ν•„μˆ˜μ μΈ μš”μ†Œμž…λ‹ˆλ‹€.

πŸ“Œ μ—°μ‚°μžλž€ 무엇인가?

μ—°μ‚°μž(Operator)λŠ” 값을 체크, λ³€κ²½, λ˜λŠ” κ²°ν•©ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” κΈ°ν˜Έλ‚˜ κ΅¬λ¬Έμž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄:

  • λ§μ…ˆ μ—°μ‚°μž(+)λŠ” 두 숫자λ₯Ό λ”ν•©λ‹ˆλ‹€: let i = 1 + 2
  • 논리 AND μ—°μ‚°μž(&&)λŠ” 두 λΆ€μšΈ 값을 κ²°ν•©ν•©λ‹ˆλ‹€: if enteredDoorCode && passedRetinaScan

Swift의 μ—°μ‚°μžλŠ” C와 μœ μ‚¬ν•˜μ§€λ§Œ λͺ‡ κ°€μ§€ μ€‘μš”ν•œ κ°œμ„  사항이 μžˆμŠ΅λ‹ˆλ‹€:

  • λŒ€μž… μ—°μ‚°μž(=)λŠ” 값을 λ°˜ν™˜ν•˜μ§€ μ•Šμ•„ μ‹€μˆ˜λ‘œ 비ꡐ μ—°μ‚°μž(==) λŒ€μ‹  μ‚¬μš©ν•˜λŠ” 였λ₯˜λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€
  • μ‚°μˆ  μ—°μ‚°μžλŠ” 기본적으둜 μ˜€λ²„ν”Œλ‘œμš°λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€

πŸ“Œ μ—°μ‚°μžμ˜ μ’…λ₯˜ (μˆ μ–΄)

Swift의 μ—°μ‚°μžλŠ” μž‘μš©ν•˜λŠ” ν”Όμ—°μ‚°μžμ˜ μˆ˜μ— 따라 λ‹€μŒκ³Ό 같이 λΆ„λ₯˜λ©λ‹ˆλ‹€:

1. 단항 μ—°μ‚°μž (Unary Operators)

단일 λŒ€μƒμ— μž‘μš©ν•˜λŠ” μ—°μ‚°μžμž…λ‹ˆλ‹€.

  • 단항 접두사 μ—°μ‚°μž: λŒ€μƒ μ•žμ— μœ„μΉ˜ (예: -a, !b)
  • 단항 접미사 μ—°μ‚°μž: λŒ€μƒ 뒀에 μœ„μΉ˜ (예: c!)

2. 이항 μ—°μ‚°μž (Binary Operators)

두 λŒ€μƒ 사이에 μœ„μΉ˜ν•˜λŠ” μ—°μ‚°μžμž…λ‹ˆλ‹€ (예: a + b).

3. μ‚Όν•­ μ—°μ‚°μž (Ternary Operators)

μ„Έ λŒ€μƒμ— μž‘μš©ν•˜λŠ” μ—°μ‚°μžμž…λ‹ˆλ‹€. Swiftμ—λŠ” ν•˜λ‚˜μ˜ μ‚Όν•­ μ—°μ‚°μžμΈ μ‚Όν•­ 쑰건 μ—°μ‚°μž(a ? b : c)만 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ λŒ€μž… μ—°μ‚°μž (Assignment Operator)

λŒ€μž… μ—°μ‚°μž(=)λŠ” 값을 λ³€μˆ˜μ— ν• λ‹Ήν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€:

let b = 10
var a = 5
a = b  // aλŠ” 이제 10

μ—¬λŸ¬ 값을 ν•œ λ²ˆμ— λŒ€μž…ν•˜λŠ” νŠœν”Œ 뢄해도 κ°€λŠ₯ν•©λ‹ˆλ‹€:

let (x, y) = (1, 2)
// xλŠ” 1, yλŠ” 2

주의점: Swift의 λŒ€μž… μ—°μ‚°μžλŠ” C와 달리 값을 λ°˜ν™˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 즉, if x = y {}와 같은 μ½”λ“œλŠ” μœ νš¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λŠ” λ“±ν˜Έ μ—°μ‚°μž(==)와 λŒ€μž… μ—°μ‚°μž(=)λ₯Ό ν˜Όλ™ν•˜λŠ” μ‹€μˆ˜λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€.

πŸ“Œ μ‚°μˆ  μ—°μ‚°μž (Arithmetic Operators)

SwiftλŠ” λͺ¨λ“  숫자 νƒ€μž…μ— λŒ€ν•΄ λ„€ κ°€μ§€ κΈ°λ³Έ μ‚°μˆ  μ—°μ‚°μžλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€:

1 + 2       // λ§μ…ˆ: 3
5 - 3       // λΊ„μ…ˆ: 2
2 * 3       // κ³±μ…ˆ: 6
10.0 / 2.5  // λ‚˜λˆ—μ…ˆ: 4.0

νŠΉμ§•: Swift의 μ‚°μˆ  μ—°μ‚°μžλŠ” 기본적으둜 κ°’ μ˜€λ²„ν”Œλ‘œμš°λ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•„μš”ν•œ 경우 μ˜€λ²„ν”Œλ‘œμš° μ—°μ‚°μž(&+, &-, &* λ“±)λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ§μ…ˆ μ—°μ‚°μžλŠ” λ¬Έμžμ—΄ 연결에도 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

"hello, " + "world"  // "hello, world"

πŸ“Œ λ‚˜λ¨Έμ§€ μ—°μ‚°μž (Remainder Operator)

λ‚˜λ¨Έμ§€ μ—°μ‚°μž(%)λŠ” λ‚˜λˆ—μ…ˆ ν›„ λ‚˜λ¨Έμ§€λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€:

9 % 4    // 1
-9 % 4   // -1

μž‘λ™ 방식: a % bλŠ” a = (b × λͺ«) + λ‚˜λ¨Έμ§€μ—μ„œ 'λ‚˜λ¨Έμ§€'λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. λ‹€λ₯Έ μ–Έμ–΄μ˜ λͺ¨λ“ˆλ‘œ μ—°μ‚°μžμ™€ 달리, Swiftμ—μ„œλŠ” μŒμˆ˜μ— λŒ€ν•΄ λ‚˜λ¨Έμ§€λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.

πŸ“Œ 단항 μ—°μ‚°μž (Unary Operators)

단항 λΊ„μ…ˆ μ—°μ‚°μž (Unary Minus Operator)

숫자의 λΆ€ν˜Έλ₯Ό λ³€κ²½ν•©λ‹ˆλ‹€:

let three = 3
let minusThree = -three       // -3
let plusThree = -minusThree   // 3

단항 λ§μ…ˆ μ—°μ‚°μž (Unary Plus Operator)

값을 λ³€κ²½ν•˜μ§€ μ•Šκ³  κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€:

let minusSix = -6
let alsoMinusSix = +minusSix  // -6

μš©λ„: μ‹€μ§ˆμ μΈ μž‘μ—…μ€ μˆ˜ν–‰ν•˜μ§€ μ•Šμ§€λ§Œ, 단항 λΊ„μ…ˆκ³Όμ˜ λŒ€μΉ­μ„±μ„ μœ„ν•΄ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ 볡합 λŒ€μž… μ—°μ‚°μž (Compound Assignment Operators)

λŒ€μž… μ—°μ‚°μžμ™€ λ‹€λ₯Έ μ—°μ‚°μžλ₯Ό κ²°ν•©ν•œ κ²ƒμœΌλ‘œ, μž‘μ—…μ„ 더 κ°„κ²°ν•˜κ²Œ ν‘œν˜„ν•©λ‹ˆλ‹€:

var a = 1
a += 2  // a = a + 2와 동일, aλŠ” 이제 3

μ°Έκ³ : 볡합 λŒ€μž… μ—°μ‚°μžλŠ” 값을 λ°˜ν™˜ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ let b = a += 2와 같은 ν‘œν˜„μ€ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

πŸ“Œ 비ꡐ μ—°μ‚°μž (Comparison Operators)

두 값을 λΉ„κ΅ν•˜κ³  κ²°κ³Όλ₯Ό λΆ€μšΈ κ°’μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€:

1 == 1   // κ°™μŒ: true
2 != 1   // 닀름: true
2 > 1    // 보닀 큼: true
1 < 2    // 보닀 μž‘μŒ: true
1 >= 1   // 보닀 ν¬κ±°λ‚˜ κ°™μŒ: true
2 <= 1   // 보닀 μž‘κ±°λ‚˜ κ°™μŒ: false

같은 νƒ€μž…μ˜ νŠœν”Œλ„ 비ꡐ할 수 μžˆμŠ΅λ‹ˆλ‹€:

(1, "zebra") < (2, "apple")   // true (1이 2보닀 μž‘κΈ° λ•Œλ¬Έ)
(3, "apple") < (3, "bird")    // true (3은 κ°™μ§€λ§Œ, "apple"이 "bird"보닀 μž‘μŒ)
(4, "dog") == (4, "dog")      // true (λͺ¨λ“  μš”μ†Œκ°€ κ°™μŒ)

νŠœν”Œ 비ꡐ κ·œμΉ™: νŠœν”Œμ€ μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ ν•œ μš”μ†Œμ”© λΉ„κ΅ν•©λ‹ˆλ‹€. 두 값이 λ‹€λ₯΄λ©΄ κ·Έ 비ꡐ κ²°κ³Όκ°€ 전체 νŠœν”Œ λΉ„κ΅μ˜ κ²°κ³Όκ°€ λ©λ‹ˆλ‹€.

πŸ“Œ μ‚Όν•­ 쑰건 μ—°μ‚°μž (Ternary Conditional Operator)

μ„Έ λΆ€λΆ„μœΌλ‘œ 이루어진 νŠΉλ³„ν•œ μ—°μ‚°μžλ‘œ, 쑰건에 따라 두 ν‘œν˜„μ‹ 쀑 ν•˜λ‚˜λ₯Ό μ„ νƒν•©λ‹ˆλ‹€:

let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeightλŠ” 90

ꡬ문: condition ? value1 : value2 쑰건이 trueλ©΄ value1을, falseλ©΄ value2λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

πŸ“Œ Nil-κ²°ν•© μ—°μ‚°μž (Nil-Coalescing Operator)

μ˜΅μ…”λ„ 값이 nil일 λ•Œ 기본값을 μ œκ³΅ν•˜λŠ” μ—°μ‚°μžμž…λ‹ˆλ‹€:

let defaultColorName = "red"
var userDefinedColorName: String?   // nil둜 μ΄ˆκΈ°ν™”λ¨

let colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName이 nilμ΄λ―€λ‘œ "red"κ°€ μ‚¬μš©λ¨

ꡬ문: a ?? b aκ°€ nil이 μ•„λ‹ˆλ©΄ μ–Έλž˜ν•‘λœ aλ₯Ό λ°˜ν™˜ν•˜κ³ , nil이면 bλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. μ΄λŠ” a != nil ? a! : b의 μΆ•μ•½ν˜•μž…λ‹ˆλ‹€.

πŸ“Œ λ²”μœ„ μ—°μ‚°μž (Range Operators)

λ‹«νžŒ λ²”μœ„ μ—°μ‚°μž (Closed Range Operator)

for index in 1...5 {
    print("\(index) × 5 = \(index * 5)")
}
// 1 × 5 = 5λΆ€ν„° 5 × 5 = 25κΉŒμ§€ 좜λ ₯

ꡬ문: a...b aλΆ€ν„° bκΉŒμ§€μ˜ λͺ¨λ“  값을 ν¬ν•¨ν•˜λŠ” λ²”μœ„λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€(a와 b λͺ¨λ‘ 포함).

반-μ—΄λ¦Ό λ²”μœ„ μ—°μ‚°μž (Half-Open Range Operator)

let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
    print("Person \(i + 1): \(names[i])")
}
// Person 1: AnnaλΆ€ν„° Person 4: JackκΉŒμ§€ 좜λ ₯

ꡬ문: a..<b aλΆ€ν„° b-1κΉŒμ§€μ˜ 값을 ν¬ν•¨ν•˜λŠ” λ²”μœ„λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€(aλŠ” ν¬ν•¨ν•˜μ§€λ§Œ bλŠ” μ œμ™Έ).

단-λ°©ν–₯ λ²”μœ„ (One-Sided Ranges)

λ²”μœ„μ˜ ν•œμͺ½ 끝만 μ§€μ •ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€:

// 2번 μΈλ±μŠ€λΆ€ν„° λκΉŒμ§€
for name in names[2...] {
    print(name)
}
// Brian, Jack 좜λ ₯

// μ²˜μŒλΆ€ν„° 2번 μΈλ±μŠ€κΉŒμ§€
for name in names[...2] {
    print(name)
}
// Anna, Alex, Brian 좜λ ₯

// μ²˜μŒλΆ€ν„° 2번 인덱슀 μ „κΉŒμ§€
for name in names[..<2] {
    print(name)
}
// Anna, Alex 좜λ ₯

ꡬ문:

  • a...: aλΆ€ν„° λκΉŒμ§€μ˜ λ²”μœ„
  • ...b: μ²˜μŒλΆ€ν„° bκΉŒμ§€μ˜ λ²”μœ„(b 포함)
  • ..<b: μ²˜μŒλΆ€ν„° b-1κΉŒμ§€μ˜ λ²”μœ„(b μ œμ™Έ)

πŸ“Œ 논리 μ—°μ‚°μž (Logical Operators)

λΆ€μšΈ 값을 μ‘°μž‘ν•˜λŠ” μ—°μ‚°μžλ‘œ, μ„Έ κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€:

논리적 NOT μ—°μ‚°μž (!)

λΆ€μšΈ 값을 λ°˜μ „μ‹œν‚΅λ‹ˆλ‹€:

let allowedEntry = false
if !allowedEntry {
    print("μΆœμž… κΈˆμ§€")
}
// "μΆœμž… κΈˆμ§€" 좜λ ₯

κΈ°λŠ₯: trueλ₯Ό false둜, falseλ₯Ό true둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

논리적 AND μ—°μ‚°μž (&&)

두 쑰건이 λͺ¨λ‘ true일 λ•Œλ§Œ trueλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€:

let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
    print("ν™˜μ˜ν•©λ‹ˆλ‹€!")
} else {
    print("μΆœμž… κΈˆμ§€")
}
// "μΆœμž… κΈˆμ§€" 좜λ ₯

νŠΉμ§•: 첫 번째 값이 falseλ©΄ 두 번째 값은 ν‰κ°€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(단락 평가).

논리적 OR μ—°μ‚°μž (||)

두 쑰건 쀑 ν•˜λ‚˜λΌλ„ trueλ©΄ trueλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€:

let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
    print("ν™˜μ˜ν•©λ‹ˆλ‹€!")
} else {
    print("μΆœμž… κΈˆμ§€")
}
// "ν™˜μ˜ν•©λ‹ˆλ‹€!" 좜λ ₯

νŠΉμ§•: 첫 번째 값이 trueλ©΄ 두 번째 값은 ν‰κ°€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(단락 평가).

논리 μ—°μ‚°μž κ²°ν•© 및 λͺ…μ‹œμ  μ†Œκ΄„ν˜Έ

μ—¬λŸ¬ 논리 μ—°μ‚°μžλ₯Ό κ²°ν•©ν•΄ λ³΅μž‘ν•œ 쑰건을 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
    print("ν™˜μ˜ν•©λ‹ˆλ‹€!")
} else {
    print("μΆœμž… κΈˆμ§€")
}

가독성 ν–₯상: μ†Œκ΄„ν˜Έλ₯Ό μ‚¬μš©ν•˜λ©΄ 볡합 ν‘œν˜„μ‹μ˜ μ˜λ„λ₯Ό λͺ…ν™•νžˆ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 논리적 AND(&&)와 OR(||) μ—°μ‚°μžλŠ” μ™Όμͺ½λΆ€ν„° ν‰κ°€λ©λ‹ˆλ‹€.


μ—°μ‚°μžλŠ” Swift ν”„λ‘œκ·Έλž˜λ°μ˜ κΈ°λ³Έ μš”μ†Œλ‘œ, λ‹€μ–‘ν•œ κ°’ μ‘°μž‘μ„ κ°„κ²°ν•˜κ³  효율적으둜 μˆ˜ν–‰ν•  수 있게 ν•΄μ€λ‹ˆλ‹€. 특히 Swift만의 νŠΉμ§•μΈ μ˜€λ²„ν”Œλ‘œμš° λ°©μ§€, λ²”μœ„ μ—°μ‚°μž, nil-κ²°ν•© μ—°μ‚°μž 등은 더 μ•ˆμ „ν•˜κ³  읽기 μ‰¬μš΄ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€.