Menu
Coddy logo textTech

값 의미론

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

구조체는 값 타입입니다. 구조체를 다른 변수에 할당하면 구조체가 복사됩니다. 복사본을 변경해도 클래스와 달리 원본은 변경되지 않습니다.

struct Point {
    var x: Int
}

var a = Point(x: 1)
var b = a
b.x = 99
print(a.x)
print(b.x)

출력:

1
99

같은 비교를 클래스로 해 보면 차이점이 드러납니다. 두 변수 모두 하나의 객체를 참조합니다.

class PointRef {
    var x: Int
    init(x: Int) { self.x = x }
}

let a = PointRef(x: 1)
let b = a
b.x = 99
print(a.x)

출력:

99

구조체를 함수에 전달하면 복사본도 함께 전달됩니다. 매개변수는 상수이므로, 변경된 버전을 반환하려면 함수가 지역 복사본을 만들고 이를 반환합니다:

struct Point {
    var x: Int
}

func shifted(_ p: Point, by dx: Int) -> Point {
    var copy = p
    copy.x += dx
    return copy
}

let start = Point(x: 1)
let moved = shifted(start, by: 4)
print(start.x)
print(moved.x)

출력:

1
5

구조체의 배열은 서로 독립적인 값을 보유합니다. 인덱스를 통해 요소를 변경하면 해당 요소만 변경되고, 배열을 복사하면 모든 값이 복사됩니다:

struct Score {
    var points: Int
}

var round1 = [Score(points: 1), Score(points: 2)]
var round2 = round1
round2[0].points = 50
print(round1[0].points)
print(round2[0].points)

출력:

1
50
challenge icon

챌린지

쉬움

tryDiscount(_:percent:)를 완성하세요. 이 함수는 Price 구조체를 받아 할인된 복사본을 반환합니다. 즉, 센트 금액을 백분율만큼 줄이고 내림합니다. 제공된 코드는 원래 가격과 할인된 가격을 출력하므로 원본은 변경되지 않은 상태로 유지되어야 합니다.

제공된 코드는 센트 단위의 가격과 줄마다 하나의 백분율을 읽고, 각 항목에 대해 was 1000, now 900을 출력합니다.

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

직접 해보기

// 제공된 입출력 코드: 있는 그대로 유지하세요
var input: [String] = []
while let line = readLine() { input.append(line) }
let original = Price(cents: Int(input[0])!)
for line in input.dropFirst() {
    let cheaper = tryDiscount(original, percent: Int(line)!)
    print("was \(original.cents), now \(cheaper.cents)")
}
quiz icon실력 점검

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

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

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