정적 멤버
Coddy Swift 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 14번째.
static 속성은 어떤 인스턴스가 아니라 타입 자체에 속합니다. 사본은 정확히 하나이며, 타입 이름을 통해 읽습니다:
struct Temperature {
static let freezing = 0.0
static let boiling = 100.0
var celsius: Double
}
print(Temperature.boiling - Temperature.freezing)출력:
100.0static var는 변경될 수 있으므로, 생성된 인스턴스 수를 세는 카운터처럼 모든 인스턴스가 공유하는 데이터에 유용합니다:
class Ticket {
static var issued = 0
let number: Int
init() {
Ticket.issued += 1
number = Ticket.issued
}
}
let a = Ticket()
let b = Ticket()
print(a.number)
print(b.number)
print(Ticket.issued)출력:
1
2
2static func은 타입에서 호출됩니다. 함께 사용할 self 인스턴스가 없으므로 인수와 다른 정적 멤버만 사용합니다. 헬퍼와 인스턴스를 생성하는 이름 있는 방법을 두기에 적합합니다:
struct Color {
var red: Int
var green: Int
var blue: Int
static func gray(_ level: Int) -> Color {
Color(red: level, green: level, blue: level)
}
}
let c = Color.gray(128)
print(c.red + c.green + c.blue)출력:
384타입 내부에서 Self는 해당 타입의 이름을 지정하는 또 다른 방법이므로, 정적 멤버는 Self.issued와 같이 작성할 수 있습니다. 인스턴스 메서드는 정적 멤버를 읽을 수 있지만, 정적 메서드는 인스턴스에서 호출되는 것이 아니므로 인스턴스 속성을 읽을 수 없습니다.
struct Level {
static let maximum = 10
var current = 1
func isMax() -> Bool { current == Self.maximum } // 인스턴스가 static을 읽음
static func describe() -> String { "levels 1-\(maximum)" } // static이 static을 읽음
}챌린지
쉬움Order 클래스를 완성하세요. 정적 속성 nextId는 1에서 시작하며, 각각의 새 주문은 현재 nextId를 id로 사용한 후 그 값을 증가시킵니다. 정적 상수 taxPercent는 10입니다. 인스턴스 메서드 total()은 소계에 세금을 더한 값(내림)을 반환하며, 정적 메서드 summary(of:)는 주문 배열을 받아 3 orders, 660 total을 반환합니다.
제공된 코드는 줄마다 소계 하나를 읽고, 각각에 대한 주문을 생성하며, 각 주문에 대해 #1: 110을 출력하고 마지막으로 요약을 출력합니다.
코드는 Order.swift에 작성하세요. main.swift에는 제공된 입력/출력 코드가 들어 있으며 편집할 수 없습니다.
직접 해보기
// 제공된 입력/출력 코드: 그대로 유지하세요
var input: [String] = []
while let line = readLine() { input.append(line) }
var orders: [Order] = []
for line in input {
let order = Order(subtotal: Int(line)!)
orders.append(order)
print("#\(order.id): \(order.total())")
}
print(Order.summary(of: orders))
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: Swift 플레이그라운드