Menu
Coddy logo textTech

클래스는 참조입니다

Coddy Swift 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 5번째.

클래스는 참조 타입입니다. 변수에는 객체의 복사본이 아니라 객체에 대한 참조가 저장됩니다. 인스턴스를 다른 변수에 할당하면 동일한 객체를 가리키는 두 번째 이름이 생깁니다:

class Wallet {
    var coins = 10
}

let mine = Wallet()
let alias = mine
alias.coins = 25
print(mine.coins)

출력:

25

===는 두 참조가 동일한 인스턴스를 가리키는지 확인합니다. 모든 속성이 일치하더라도 서로 다른 두 인스턴스는 서로 다른 객체입니다:

class Wallet {
    var coins = 10
}

let a = Wallet()
let b = a
let c = Wallet()
print(a === b)
print(a === c)

출력:

true
false

인스턴스를 받는 함수는 호출자의 객체에서 작동하므로, 함수 내부에서 이루어진 변경 사항은 이후에도 그대로 반영됩니다:

class Wallet {
    var coins = 10
}

func payFee(_ wallet: Wallet) {
    wallet.coins -= 3
}

let w = Wallet()
payFee(w)
payFee(w)
print(w.coins)

출력:

4

let은 객체가 아니라 참조를 고정합니다. 클래스 인스턴스를 담은 상수는 다른 인스턴스를 가리킬 수 없지만, 해당 인스턴스의 var 속성은 여전히 변경할 수 있습니다. 인스턴스의 배열도 참조를 저장합니다:

class Wallet {
    var coins = 10
}

let shared = Wallet()
let team = [shared, shared]
team[0].coins = 99
print(shared.coins)
print(team[1].coins)

출력:

99
99
challenge icon

챌린지

쉬움

한 팀이 하나의 Budget을 공유합니다. 예산과 금액을 받아 남은 금액이 충분할 때만 금액을 차감하고, 지출이 허용되면 true를 반환하는 함수 spend(_:amount:)를 완성하세요. 그런 다음 runTeam(start:purchases:)를 완성하세요. 예산 하나를 만들고, 모든 구매가 동일한 예산에서 지출하도록 한 뒤, 구매마다 한 줄씩(ok 30 또는 denied 80) 반환하고 그 뒤에 left 20을 반환하세요.

제공된 코드는 시작 예산과 구매 내역을 쉼표로 구분된 한 줄로 읽고, 반환된 각 줄을 출력합니다.

코드는 Budget.swift와 Functions.swift에 작성하세요. main.swift에는 제공된 입력/출력 코드가 들어 있으며 편집할 수 없습니다.

직접 해보기

// 제공된 입력/출력 코드: 그대로 유지하세요
var input: [String] = []
while let line = readLine() { input.append(line) }
let purchases = input[1].split(separator: ",").map { Int($0)! }
for line in runTeam(start: Int(input[0])!, purchases: purchases) { print(line) }
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: Swift 플레이그라운드