๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿฅ– Bread Basics/Swift

Swift ๊ณต์‹ ๋ฌธ์„œ ์ •๋ฆฌ - ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ (Memory Safety)

by BreadDev 2025. 4. 13.
728x90

์•ˆ๋…•ํ•˜์„ธ์š”. ์˜ค๋Š˜์€ Swift ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ค‘์š”ํ•˜์ง€๋งŒ ์ข…์ข… ๊ฐ„๊ณผ๋˜๋Š” ๊ฐœ๋…์ธ '๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ(Memory Safety)'์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ์„ ์ดํ•ดํ•˜๋ฉด ๋” ์•ˆ์ •์ ์ด๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ปดํŒŒ์ผ ํƒ€์ž„๊ณผ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ Swift์˜ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ์ด๋ž€?

Swift๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋™์ž‘์„ ๋ฐฉ์ง€ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

  • ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜๊ธฐ ์ „์— ์ดˆ๊ธฐํ™”๋˜๋Š”์ง€ ํ™•์ธ
  • ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋œ ํ›„์—๋Š” ์ ‘๊ทผํ•˜์ง€ ์•Š๋„๋ก ๋ณด์žฅ
  • ๋ฐฐ์—ด ์ธ๋ฑ์Šค๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋Š”์ง€ ๊ฒ€์‚ฌ

๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ, Swift๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ๋™์ผํ•œ ์œ„์น˜์— ๋Œ€ํ•œ ๋‹ค์ค‘ ์ ‘๊ทผ์ด ์ถฉ๋Œํ•˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์˜ค๋Š˜ ์ค‘์ ์ ์œผ๋กœ ์‚ดํŽด๋ณผ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์ถฉ๋Œ ์ดํ•ดํ•˜๊ธฐ

๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์“ธ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค:

// one์— ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ์— ์“ฐ๊ธฐ ์ ‘๊ทผ
var one = 1

// one์— ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฝ๊ธฐ ์ ‘๊ทผ
print("We're number \(one)!")

๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์ถฉ๋Œ์€ ์ฝ”๋“œ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด ๋™์‹œ์— ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ์ ‘๊ทผํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ถฉ๋Œ์€ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ƒํ™œ ๋น„์œ : ์ข…์ด์— ์“ฐ์—ฌ์ง„ ์˜ˆ์‚ฐํ‘œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ณผ์ •์„ ์ƒ๊ฐํ•ด๋ณด์„ธ์š”. ์ƒˆ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋„์ค‘์—๋Š” ์ด์•ก์ด ์ผ์‹œ์ ์œผ๋กœ ๋งž์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์ ์— ๋ˆ„๊ตฐ๊ฐ€ ์ด์•ก์„ ๋ณด๋ฉด ์ž˜๋ชป๋œ ์ •๋ณด๋ฅผ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์˜ ์„ธ ๊ฐ€์ง€ ํŠน์„ฑ

๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์ถฉ๋Œ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ํŠน์„ฑ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  1. ์ ‘๊ทผ ์ข…๋ฅ˜: ์ฝ๊ธฐ ์ ‘๊ทผ์ธ์ง€ ์“ฐ๊ธฐ ์ ‘๊ทผ์ธ์ง€
  2. ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜: ์–ด๋–ค ๋ณ€์ˆ˜, ์ƒ์ˆ˜, ๋˜๋Š” ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋Š”์ง€
  3. ์ ‘๊ทผ ๊ธฐ๊ฐ„: ์ฆ‰๊ฐ์ ์ธ(instantaneous) ์ ‘๊ทผ์ธ์ง€ ์žฅ๊ธฐ(long-term) ์ ‘๊ทผ์ธ์ง€

๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์ถฉ๋Œ์€ ๋‹ค์Œ ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค:

  • ์ ์–ด๋„ ํ•˜๋‚˜์˜ ์ ‘๊ทผ์ด ์“ฐ๊ธฐ ์ ‘๊ทผ์ด๋‹ค
  • ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ์ ‘๊ทผํ•œ๋‹ค
  • ์ ‘๊ทผ ๊ธฐ๊ฐ„์ด ๊ฒน์นœ๋‹ค

์ฆ‰๊ฐ์  ์ ‘๊ทผ๊ณผ ์žฅ๊ธฐ ์ ‘๊ทผ

๋Œ€๋ถ€๋ถ„์˜ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์€ ์ฆ‰๊ฐ์ ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ ‘๊ทผ์ด ์‹œ์ž‘๋˜๊ณ  ์™„๋ฃŒ๋˜๋Š” ์‚ฌ์ด์— ๋‹ค๋ฅธ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค:

func oneMore(than number: Int) -> Int {
    return number + 1
}

var myNumber = 1
myNumber = oneMore(than: myNumber)
print(myNumber) // "2" ์ถœ๋ ฅ

ํ•˜์ง€๋งŒ ์žฅ๊ธฐ ์ ‘๊ทผ์€ ์ ‘๊ทผ์ด ์‹œ์ž‘๋˜๊ณ  ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ๋‹ค๋ฅธ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์žฅ๊ธฐ ์ ‘๊ทผ์€ ์ฃผ๋กœ:

  • ํ•จ์ˆ˜์™€ ๋ฉ”์„œ๋“œ์˜ in-out ํŒŒ๋ผ๋ฏธํ„ฐ
  • ๊ตฌ์กฐ์ฒด์˜ mutating ๋ฉ”์„œ๋“œ

์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ in-out ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ถฉ๋Œ ์ ‘๊ทผ

ํ•จ์ˆ˜๋Š” ๋ชจ๋“  in-out ํŒŒ๋ผ๋ฏธํ„ฐ์— ์žฅ๊ธฐ ์“ฐ๊ธฐ ์ ‘๊ทผ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์‹œ์ž‘๋  ๋•Œ ์‹œ์ž‘๋˜์–ด ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋  ๋•Œ๊นŒ์ง€ ์ง€์†๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ 1: in-out ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์ „์—ญ ๋ณ€์ˆ˜ ์ถฉ๋Œ

var stepSize = 1

func increment(_ number: inout Int) {
    number += stepSize  // stepSize ์ฝ๊ธฐ
}

increment(&stepSize)  // ์˜ค๋ฅ˜: stepSize์— ์ถฉ๋Œ ์ ‘๊ทผ

์ด ์ฝ”๋“œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. increment(&stepSize)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด:

  1. stepSize์— ๋Œ€ํ•œ ์žฅ๊ธฐ ์“ฐ๊ธฐ ์ ‘๊ทผ์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค(number๊ฐ€ stepSize๋ฅผ ์ฐธ์กฐ)
  2. ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ stepSize์˜ ๊ฐ’์„ ์ฝ์œผ๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค
  3. ์ด๋•Œ ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ๋Œ€ํ•œ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ ์ ‘๊ทผ์ด ๊ฒน์ณ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค

ํ•ด๊ฒฐ์ฑ…: ๋ช…์‹œ์ ์ธ ๋ณต์‚ฌ๋ณธ ๋งŒ๋“ค๊ธฐ

// ๋ช…์‹œ์  ๋ณต์‚ฌ๋ณธ ์ƒ์„ฑ
var copyOfStepSize = stepSize
increment(&copyOfStepSize)

// ์›๋ณธ ์—…๋ฐ์ดํŠธ
stepSize = copyOfStepSize
// stepSize๋Š” ์ด์ œ 2์ž…๋‹ˆ๋‹ค

์˜ˆ์ œ 2: ์—ฌ๋Ÿฌ in-out ํŒŒ๋ผ๋ฏธํ„ฐ ์ถฉ๋Œ

func balance(_ x: inout Int, _ y: inout Int) {
    let sum = x + y
    x = sum / 2
    y = sum - x
}

var playerOneScore = 42
var playerTwoScore = 30
balance(&playerOneScore, &playerTwoScore)  // OK

balance(&playerOneScore, &playerOneScore)
// ์˜ค๋ฅ˜: playerOneScore์— ์ถฉ๋Œ ์ ‘๊ทผ

๋™์ผํ•œ ๋ณ€์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ in-out ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ „๋‹ฌํ•˜๋ฉด ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์“ฐ๊ธฐ ์ ‘๊ทผ์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ฉ”์„œ๋“œ์—์„œ self์— ๋Œ€ํ•œ ์ถฉ๋Œ ์ ‘๊ทผ

๊ตฌ์กฐ์ฒด์˜ mutating ๋ฉ”์„œ๋“œ๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๊ธฐ๊ฐ„ ๋™์•ˆ self์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ์ ‘๊ทผ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

struct Player {
    var name: String
    var health: Int
    var energy: Int

    static let maxHealth = 10
    mutating func restoreHealth() {
        health = Player.maxHealth
    }
}

์ด ์ƒํ™ฉ์—์„œ๋„ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

extension Player {
    mutating func shareHealth(with teammate: inout Player) {
        balance(&teammate.health, &health)
    }
}

var oscar = Player(name: "Oscar", health: 10, energy: 10)
var maria = Player(name: "Maria", health: 5, energy: 10)
oscar.shareHealth(with: &maria)  // OK

oscar.shareHealth(with: &oscar)
// ์˜ค๋ฅ˜: oscar์— ์ถฉ๋Œ ์ ‘๊ทผ

๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ์—์„œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ :

  1. mutating ๋ฉ”์„œ๋“œ๋Š” self(oscar)์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ์ ‘๊ทผ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค
  2. in-out ํŒŒ๋ผ๋ฏธํ„ฐ teammate๋„ ๋™์ผํ•œ oscar ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ์ ‘๊ทผ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค
  3. ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ๋Œ€ํ•œ ๋‘ ์“ฐ๊ธฐ ์ ‘๊ทผ์ด ๊ฒน์ณ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค

๐Ÿ“Œ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•œ ์ถฉ๋Œ ์ ‘๊ทผ

๊ฐ’ ํƒ€์ž…(๊ตฌ์กฐ์ฒด, ํŠœํ”Œ, ์—ด๊ฑฐํ˜•)์—์„œ๋Š” ๊ฐ’์˜ ์ผ๋ถ€๋ถ„์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์ „์ฒด ๊ฐ’์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํŠน์ • ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋ฉด ์ „์ฒด ๊ฐ’์— ์ ‘๊ทผํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

var playerInformation = (health: 10, energy: 20)
balance(&playerInformation.health, &playerInformation.energy)
// ์˜ค๋ฅ˜: playerInformation์˜ ํ”„๋กœํผํ‹ฐ์— ์ถฉ๋Œ ์ ‘๊ทผ

var holly = Player(name: "Holly", health: 10, energy: 10)
balance(&holly.health, &holly.energy)  // ์˜ค๋ฅ˜

๊ทธ๋Ÿฌ๋‚˜ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•ˆ์ „์„ฑ์„ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค:

func someFunction() {
    var oscar = Player(name: "Oscar", health: 10, energy: 10)
    balance(&oscar.health, &oscar.energy)  // OK
}

์œ„ ์˜ˆ์ œ์—์„œ๋Š” ๋‹ค์Œ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜์–ด ์•ˆ์ „ํ•œ ์ ‘๊ทผ์œผ๋กœ ํŒ๋‹จ๋ฉ๋‹ˆ๋‹ค:

  1. ์ธ์Šคํ„ด์Šค์˜ ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋งŒ ์ ‘๊ทผํ•จ(๊ณ„์‚ฐ ํ”„๋กœํผํ‹ฐ๋‚˜ ํด๋ž˜์Šค ํ”„๋กœํผํ‹ฐ ์•„๋‹˜)
  2. ๊ตฌ์กฐ์ฒด๊ฐ€ ์ง€์—ญ ๋ณ€์ˆ˜์˜ ๊ฐ’์ž„(์ „์—ญ ๋ณ€์ˆ˜ ์•„๋‹˜)
  3. ๊ตฌ์กฐ์ฒด๊ฐ€ ํด๋กœ์ €์— ์บก์ฒ˜๋˜์ง€ ์•Š๊ฑฐ๋‚˜ non-escaping ํด๋กœ์ €์—๋งŒ ์บก์ฒ˜๋จ

๐Ÿ“Œ ์•ˆ์ „ํ•œ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์œ„ํ•œ ํŒ

๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ง€์นจ:

  1. ๋ณ€์ˆ˜์˜ ๋ฒ”์œ„ ์ œํ•œํ•˜๊ธฐ: ์ „์—ญ ๋ณ€์ˆ˜๋ณด๋‹ค ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์„ ํ˜ธํ•˜์„ธ์š”
  2. ๋ช…์‹œ์ ์ธ ๋ณต์‚ฌ๋ณธ ์‚ฌ์šฉํ•˜๊ธฐ: ๋™์ผํ•œ ๋ณ€์ˆ˜์— ์—ฌ๋Ÿฌ ๋ฒˆ ์ ‘๊ทผํ•ด์•ผ ํ•  ๋•Œ๋Š” ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“œ์„ธ์š”
  3. in-out ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•˜๊ธฐ: ๋™์ผํ•œ ๋ณ€์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ in-out ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ „๋‹ฌํ•˜์ง€ ๋งˆ์„ธ์š”
  4. ๊ฐ’ ํƒ€์ž…์˜ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•œ ๋™์‹œ ์ ‘๊ทผ ํ”ผํ•˜๊ธฐ: ํŠนํžˆ ์ „์—ญ ๋ณ€์ˆ˜๋‚˜ escaping ํด๋กœ์ €์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•˜์„ธ์š”
  5. mutating ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ self์— ๋Œ€ํ•œ ์ฐธ์กฐ ์ฃผ์˜ํ•˜๊ธฐ: ํŠนํžˆ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ ํ™•์ธํ•˜์„ธ์š”

๐Ÿ“Œ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ๊ณผ ์„ฑ๋Šฅ ์‚ฌ์ด์˜ ๊ท ํ˜•

Swift์˜ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ ๊ทœ์น™์€ ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ด์ง€๋งŒ, ๋•Œ๋กœ๋Š” ๊ณผ๋„ํ•˜๊ฒŒ ์ œํ•œ์ ์œผ๋กœ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ์„ ์ฆ๋ช…ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋„ ์‹ค์ œ๋กœ๋Š” ์•ˆ์ „ํ•œ ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Swift์˜ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ ๊ฐ•์ œ๋Š” ์ ˆ์ถฉ์•ˆ์ž…๋‹ˆ๋‹ค:

  • ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐํƒ€์  ์ ‘๊ทผ(exclusive access): ๋” ์—„๊ฒฉํ•œ ์š”๊ตฌ์‚ฌํ•ญ
  • ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ(memory safety): ๋ฐฐํƒ€์  ์ ‘๊ทผ๋ณด๋‹ค ๋œ ์—„๊ฒฉํ•จ

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋” ์œ ์—ฐํ•œ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ท ํ˜•์€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋” ๋งŽ์€ ํŒจํ„ด์„ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ธ์‹ํ•˜๋ฉด์„œ ๊ณ„์† ๋ฐœ์ „ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ •๋ฆฌ

Swift์˜ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ๊ณผ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ด๋Š” ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ฃผ์š” ๊ฐœ๋…์„ ์ •๋ฆฌํ•˜๋ฉด:

  1. ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์ถฉ๋Œ์€ ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ๋Œ€ํ•œ ๋™์‹œ ์ ‘๊ทผ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค
  2. ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ ค๋ฉด ์ ์–ด๋„ ํ•˜๋‚˜์˜ ์“ฐ๊ธฐ ์ ‘๊ทผ์ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜๊ณ , ์ ‘๊ทผ ๊ธฐ๊ฐ„์ด ๊ฒน์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค
  3. ์žฅ๊ธฐ ์ ‘๊ทผ์€ ์ฃผ๋กœ in-out ํŒŒ๋ผ๋ฏธํ„ฐ์™€ mutating ๋ฉ”์„œ๋“œ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค
  4. ๊ฐ’ ํƒ€์ž…์˜ ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ์€ ์ „์ฒด ๊ฐ’์— ๋Œ€ํ•œ ์ ‘๊ทผ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค
  5. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋” ์œ ์—ฐํ•œ ์ ‘๊ทผ์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค