Bibi's DevLog πŸ€“πŸŽ

[Swift Language Guide (5.7)] Structures and Classes ꡬ쑰체와 클래슀 λ³Έλ¬Έ

πŸ“±πŸŽ iOS/πŸ•Š Swift

[Swift Language Guide (5.7)] Structures and Classes ꡬ쑰체와 클래슀

λΉ„λΉ„ bibi 2023. 1. 25. 13:27

[Swift Language Guide (5.7)] Structures and Classes ꡬ쑰체와 클래슀

Structures and Classes - The Swift Programming Language (Swift 5.7)

ꡬ쑰체*와 *클래슀 λŠ” λ‹Ήμ‹ μ˜ ν”„λ‘œκ·Έλž¨ μ½”λ“œμ˜ ꡬ성 μš”μ†Œκ°€ λ˜λŠ” λ‹€λͺ©μ μ˜ μœ μ—°ν•œ κ΅¬μ‘°λ“€μž…λ‹ˆλ‹€. μƒμˆ˜, λ³€μˆ˜, ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œμ™€ 같은 ꡬ문을 μ‚¬μš©ν•΄ λ‹Ήμ‹ μ˜ ꡬ쑰체와 ν΄λž˜μŠ€μ— ν”„λ‘œνΌν‹°λ“€κ³Ό λ©”μ„œλ“œλ“€μ„ 더해 κΈ°λŠ₯을 더할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ“€κ³Ό λ‹€λ₯΄κ²Œ, SwiftλŠ” μ‚¬μš©μž μ •μ˜ ν΄λž˜μŠ€λ‚˜ ꡬ쑰체λ₯Ό μœ„ν•œ λ³„λ„μ˜ μΈν„°νŽ˜μ΄μŠ€μ™€ κ΅¬ν˜„ νŒŒμΌμ„ μƒμ„±ν•˜λ„λ‘ μš”κ΅¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. Swiftμ—μ„œλŠ”, ν•˜λ‚˜μ˜ νŒŒμΌμ— κ΅¬μ‘°μ²΄λ‚˜ 클래슀λ₯Ό μ„ μ–Έν•˜κ³ , κ·Έ κ΅¬μ‘°μ²΄λ‚˜ ν΄λž˜μŠ€μ— λŒ€ν•œ μ™ΈλΆ€ μΈν„°νŽ˜μ΄μŠ€λŠ” λ‹€λ₯Έ μ½”λ“œμ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μžλ™μœΌλ‘œ λ§Œλ“€μ–΄μ§‘λ‹ˆλ‹€.

주의
클래슀의 μΈμŠ€ν„΄μŠ€λŠ” μ „ν†΅μ μœΌλ‘œ 객체(object) 라고 μ•Œλ €μ Έ μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ, Swift ꡬ쑰체와 ν΄λž˜μŠ€λ“€μ€ λ‹€λ₯Έ 언어듀보닀 κΈ°λŠ₯적으둜 ꡉμž₯히 λΉ„μŠ·ν•©λ‹ˆλ‹€. 그리고 이 μ±•ν„°μ˜ λŒ€λΆ€λΆ„μ€ ν΄λž˜μŠ€μ™€ ꡬ쑰체 νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€μ— λͺ¨λ‘ 적용 κ°€λŠ₯ν•œ κΈ°λŠ₯듀에 μ„€λͺ…ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 λ•Œλ¬Έμ—, 더 일반적인 μš©μ–΄μΈ μΈμŠ€ν„΄μŠ€(instance) κ°€ μ‚¬μš©λ©λ‹ˆλ‹€.

ꡬ쑰체와 클래슀 비ꡐ

Swift의 ꡬ쑰체와 ν΄λž˜μŠ€λŠ” λ§Žμ€ 곡톡점을 가지고 μžˆμŠ΅λ‹ˆλ‹€. λ‘˜ λ‹€ λ‹€μŒκ³Ό 같은 것듀을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

  • 값을 μ €μž₯ν•˜λŠ” ν”„λ‘œνΌν‹° μ •μ˜ν•˜κΈ°
  • κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” λ©”μ„œλ“œ μ •μ˜ν•˜κΈ°
  • μ„œλΈŒμŠ€ν¬λ¦½νŠΈ 문법을 μ‚¬μš©ν•΄ κ·Έ 값에 μ ‘κ·Όν•˜λ„λ‘ ν•˜λŠ” μ„œλΈŒμŠ€ν¬λ¦½νŠΈ μ •μ˜ν•˜κΈ°
  • 초기 μƒνƒœλ₯Ό μ„€μ •ν•˜λŠ” μ΄λ‹ˆμ…œλΌμ΄μ €(μƒμ„±μž) μ •μ˜ν•˜κΈ°
  • κΈ°λ³Έ κ΅¬ν˜„ μ΄μƒμœΌλ‘œ κΈ°λŠ₯을 ν™•μž₯ν•˜κΈ° (extended)
  • νŠΉμ • μ’…λ₯˜μ˜ ν‘œμ€€ κΈ°λŠ₯을 μ œκ³΅ν•˜κΈ° μœ„ν•œ ν”„λ‘œν† μ½œ μ€€μˆ˜ν•˜κΈ°

더 λ§Žμ€ 정보λ₯Ό μœ„ν•΄μ„œλŠ”, ν”„λ‘œνΌν‹°, λ©”μ„œλ“œ, μ„œλΈŒμŠ€ν¬λ¦½νŠΈ, μ΄ˆκΈ°ν™”, μ΅μŠ€ν…μ…˜, ν”„λ‘œν† μ½œ 을 λ³΄μ‹­μ‹œμ˜€.

ν΄λž˜μŠ€λŠ” ꡬ쑰체가 κ°–κ³ μžˆμ§€ μ•Šμ€ 좔가적인 λŠ₯λ ₯듀을 κ°–μŠ΅λ‹ˆλ‹€:

  • 상속을 톡해 ν•˜λ‚˜μ˜ ν΄λž˜μŠ€κ°€ λ‹€λ₯Έ 클래슀의 νŠΉμ§•μ„ 상속받을 수 μžˆμŠ΅λ‹ˆλ‹€.
  • νƒ€μž… μΊμŠ€νŒ…μ„ 톡해 λŸ°νƒ€μž„μ— 클래슀 μΈμŠ€ν„΄μŠ€μ˜ νƒ€μž…μ„ ν™•μΈν•˜κ³  해석할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ””μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό 톡해 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μžμ‹ μ—κ²Œ ν• λ‹Ήλœ μ–΄λ–€ λ¦¬μ†ŒμŠ€λ₯Ό ν•΄μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ°Έμ‘° μΉ΄μš΄νŒ…μ€ 클래슀 μΈμŠ€ν„΄μŠ€μ— λŒ€ν•΄ ν•˜λ‚˜ μ΄μƒμ˜ μ°Έμ‘°λ₯Ό ν—ˆμš©ν•©λ‹ˆλ‹€.

더 λ§Žμ€ 정보λ₯Ό μœ„ν•΄μ„œλŠ”, 상속, νƒ€μž… μΊμŠ€νŒ…, λ””μ΄λ‹ˆμ…œλΌμ΄μ œμ΄μ…˜, μžλ™ μ°Έμ‘° μΉ΄μš΄νŒ…(ARC) λ₯Ό λ³΄μ‹­μ‹œμ˜€.

ν΄λž˜μŠ€κ°€ μ œκ³΅ν•˜λŠ” 좔가적인 κΈ°λŠ₯듀은 μ¦κ°€ν•œ λ³΅μž‘λ„λΌλŠ” λŒ€κ°€λ₯Ό κ°–μŠ΅λ‹ˆλ‹€. 일반적인 κ°€μ΄λ“œλΌμΈμœΌλ‘œμ„œ, 더 μΆ”λ‘ ν•˜κΈ° μ‰¬μš΄ ꡬ쑰체λ₯Ό μ„ ν˜Έν•˜κ³ , ν΄λž˜μŠ€κ°€ 더 μ μ ˆν•˜κ±°λ‚˜ ν•„μš”ν•  λ•Œμ—λ§Œ 클래슀λ₯Ό μ‚¬μš©ν•˜μ‹­μ‹œμ˜€. μ‹€μ œλ‘œ, 이것은 당신이 μ •μ˜ν•˜λŠ” λŒ€λΆ€λΆ„μ˜ μ»€μŠ€ν…€ 데이터 νƒ€μž…μ΄ ꡬ쑰체와 μ—΄κ±°ν˜•μΌ κ²ƒμž„μ„ μ˜λ―Έν•©λ‹ˆλ‹€. 더 μžμ„Έν•œ 비ꡐλ₯Ό μœ„ν•΄μ„œλŠ”, ꡬ쑰체와 클래슀 μ‚¬μ΄μ—μ„œ μ„ νƒν•˜κΈ° λ₯Ό λ³΄μ‹­μ‹œμ˜€.

주의
ν΄λž˜μŠ€μ™€ actorsλŠ” λ§Žμ€ 같은 νŠΉμ§•κ³Ό 행동을 κ³΅μœ ν•©λ‹ˆλ‹€. actor에 λŒ€ν•œ 더 λ§Žμ€ 정보λ₯Ό μœ„ν•΄μ„œλŠ”, λ™μ‹œμ„± λ¬Έμ„œλ₯Ό λ³΄μ‹­μ‹œμ˜€.

μ •μ˜ ꡬ문

ꡬ쑰체와 ν΄λž˜μŠ€λŠ” λΉ„μŠ·ν•œ μ •μ˜ ꡬ문을 가지고 μžˆμŠ΅λ‹ˆλ‹€. κ΅¬μ‘°μ²΄λŠ” struct λΌλŠ” ν‚€μ›Œλ“œλ‘œ, ν΄λž˜μŠ€λŠ” class λΌλŠ” ν‚€μ›Œλ“œλ‘œ μ„€λͺ…ν•©λ‹ˆλ‹€. λ‘˜ λ‹€ μžμ‹ μ— λŒ€ν•œ λͺ¨λ“  μ •μ˜λ₯Ό ν•œ 쌍의 κ΄„ν˜Έ μ•ˆμ— μ μŠ΅λ‹ˆλ‹€.

struct SomeStructure {
    // structure definition goes here
}

class SomeClass {
    // class definition goes here
}

주의
μƒˆλ‘œμš΄ κ΅¬μ‘°μ²΄λ‚˜ 클래슀λ₯Ό μ •μ˜ν•˜λŠ” 것은 곧 μƒˆλ‘œμš΄ Swift νƒ€μž…μ„ μ •μ˜ν•˜λŠ” 것과 κ°™μŠ΅λ‹ˆλ‹€. ν‘œμ€€ Swift νƒ€μž…λ“€κ³Ό 같이(String, Int, Bool처럼), 당신이 λ§Œλ“  νƒ€μž…μ—λ„ UpperCamelCase 이름을 μ μš©ν•˜μ‹­μ‹œμ˜€(μœ„μ˜ SomeStructure와 SomeClass처럼). ν”„λ‘œνΌν‹°λ‚˜ λ©”μ„œλ“œμ—λŠ” lowerCamelCase 이름(frameRate와 incrementCount같은)을 μ μš©ν•΄ νƒ€μž… 이름과 κ΅¬λ³„λ˜κ²Œ ν•˜μ‹­μ‹œμ˜€.

여기에 ꡬ쑰체 μ •μ˜μ™€ 클래슀 μ •μ˜μ— λŒ€ν•œ μ˜ˆμ‹œκ°€ μžˆμŠ΅λ‹ˆλ‹€:

struct Resolution {
    var width = 0
    var height = 0
}

class VideoMode {
    var resolution = Resolution()
    var interlaced = false
    var frameRate = 0.0
    var name: String?
}

μœ„μ˜ μ˜ˆμ‹œλŠ” Resolution μ΄λΌλŠ” μƒˆλ‘œμš΄ ꡬ쑰체λ₯Ό μ •μ˜ν•΄ ν”½μ…€ 기반의 ν™”λ©΄ 해상도λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 이 κ΅¬μ‘°μ²΄λŠ” 두 개의 μ €μž₯ ν”„λ‘œνΌν‹°μΈ width 와 height λ₯Ό κ°€μ§‘λ‹ˆλ‹€. μ €μž₯ ν”„λ‘œνΌν‹°λŠ” κ΅¬μ‘°μ²΄λ‚˜ 클래슀의 μΌλΆ€λ‘œμ„œ λ¬Άμ—¬μ„œ μ €μž₯된 μƒμˆ˜λ‚˜ λ³€μˆ˜λ₯Ό λ§ν•©λ‹ˆλ‹€. 이 두 ν”„λ‘œνΌν‹°λ“€μ€ Int νƒ€μž…μ„ λ‚˜νƒ€λ‚΄λ©° μ΄ˆκΈ°κ°’μ€ 0으둜 μ„€μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

μœ„μ˜ μ˜ˆμ‹œλŠ” λ˜ν•œ VideoMode λΌλŠ” μƒˆλ‘œμš΄ 클래슀λ₯Ό μ •μ˜ν•΄ λΉ„λ””μ˜€ 화면에 λŒ€ν•œ νŠΉμ • λΉ„λ””μ˜€ λͺ¨λ“œλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 이 ν΄λž˜μŠ€λŠ” λ„€ 개의 μ €μž₯ ν”„λ‘œνΌν‹° λ³€μˆ˜λ₯Ό κ°€μ§‘λ‹ˆλ‹€. 첫 번째인 resolution 은 μƒˆλ‘œμš΄ Resolution ꡬ쑰체 μΈμŠ€ν„΄μŠ€λ‘œ μ΄ˆκΈ°ν™”λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 이 ν”„λ‘œνΌν‹° νƒ€μž…μ€ Resolution 으둜 μΆ”λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λ¨Έμ§€ μ„Έ ν”„λ‘œνΌν‹°λ“€μ— λŒ€ν•΄μ„œλŠ”, interlaced 섀정값은 false둜(β€λΉ„μΈν„°λ ˆμ΄μŠ€λ“œ λΉ„λ””μ˜€β€λ₯Ό 의미), frameRate λŠ” 0.0으둜, 그리고 μ˜΅μ…”λ„ String값인 name을 가지고 μƒˆ VideoMode μΈμŠ€ν„΄μŠ€κ°€ μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€. name ν”„λ‘œνΌν‹°λŠ” μ˜΅μ…”λ„ νƒ€μž…μ΄κΈ° λ•Œλ¬Έμ—, μžλ™μœΌλ‘œ nil (λ˜λŠ” β€œname κ°’ μ—†μŒβ€)μ΄λΌλŠ” 기본값을 κ°€μ§‘λ‹ˆλ‹€.

ꡬ쑰체와 클래슀 μΈμŠ€ν„΄μŠ€

Resolution ꡬ쑰체 μ •μ˜μ™€ VideoMode 클래슀 μ •μ˜λŠ” 단지 두 객체가 μ–΄λ–»κ²Œ λ³΄μΌμ§€λ§Œμ„ λ¬˜μ‚¬ν•©λ‹ˆλ‹€. κ·Έ μžμ²΄λ§ŒμœΌλ‘œλŠ” νŠΉμ • ν•΄μƒλ„λ‚˜ λΉ„λ””μ˜€λͺ¨λ“œλ₯Ό λ¬˜μ‚¬ν•˜μ§„ μ•ŠμŠ΅λ‹ˆλ‹€. 그러기 μœ„ν•΄μ„œλŠ”, 이 ꡬ쑰체 λ˜λŠ” 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€ ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€.

μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” ꡬ문은 ꡬ쑰체와 클래슀 λͺ¨λ‘ 맀우 λΉ„μŠ·ν•©λ‹ˆλ‹€:

let someResolution = Resolution()
let someVideoMode = VideoMode()

ꡬ쑰체와 ν΄λž˜μŠ€λŠ” λͺ¨λ‘ μƒˆ μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ μ΄ˆκΈ°ν™” ꡬ문을 μ‚¬μš©ν•©λ‹ˆλ‹€. κ°€μž₯ κ°„λ‹¨ν•œ ν˜•νƒœμ˜ μ΄ˆκΈ°ν™” ꡬ문은 Resolution() λ˜λŠ” VideoMode() 와 같이 클래슀 λ˜λŠ” ꡬ쑰체의 νƒ€μž„ 이름을 적고 빈 μ†Œκ΄„ν˜Έλ₯Ό μ λŠ” κ²ƒμž…λ‹ˆλ‹€. 이것은 클래슀 λ˜λŠ” ꡬ쑰체의 μƒˆ μΈμŠ€ν„΄μŠ€λ₯Ό ν”„λ‘œνΌν‹° κΈ°λ³Έκ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€. ν΄λž˜μŠ€μ™€ ꡬ쑰체 μ΄ˆκΈ°ν™”λŠ” Initialization 에 μžμ„Ένžˆ μ„€λͺ…λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜κΈ°

μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•  λ•ŒλŠ” 점 ꡬ문(dot syntax) 을 μ‚¬μš©ν•©λ‹ˆλ‹€. 점 κ΅¬λ¬Έμ—μ„œλŠ”, μΈμŠ€ν„΄μŠ€ 이름 뒀에 ν”„λ‘œνΌν‹° 이름을 적고, κ·Έ 사이λ₯Ό 곡백 없이 λ§ˆμΉ¨ν‘œ(.)둜 μ—°κ²°ν•˜λ©΄ λ©λ‹ˆλ‹€:

print("The width of someResolution is \(someResolution.width)")
// Prints "The width of someResolution is 0"

이 μ˜ˆμ‹œμ—μ„œ, someResolution.width λŠ” someResolution 의 width ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•˜λ©°, κ·Έκ²ƒμ˜ κΈ°λ³Έ μ΄ˆκΈ°κ°’μΈ 0 을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

같은 λ°©μ‹μœΌλ‘œ ν•˜μœ„ ν”„λ‘œνΌν‹°κΉŒμ§€ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ VideoMode의 resolution ν”„λ‘œνΌν‹°μ˜ width ν”„λ‘œνΌν‹°μ™€ 같이:

print("The width of someVideoMode is \(someVideoMode.resolution.width)")
// Prints "The width of someVideoMode is 0"

λ˜ν•œ ν”„λ‘œνΌν‹° λ³€μˆ˜μ— λŒ€ν•΄ μƒˆλ‘œμš΄ 값을 ν• λ‹Ήν•  λ•Œλ„ 점 ꡬ문을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

someVideoMode.resolution.width = 1280
print("The width of someVideoMode is now \(someVideoMode.resolution.width)")
// Prints "The width of someVideoMode is now 1280"

ꡬ쑰체 νƒ€μž…μ„ μœ„ν•œ λ©€λ²„μ™€μ΄μ¦ˆ μ΄λ‹ˆμ…œλΌμ΄μ €(Memberwise Initializers)

λͺ¨λ“  ꡬ쑰체듀은 μžλ™μœΌλ‘œ μƒμ„±λ˜λŠ” λ©€λ²„μ™€μ΄μ¦ˆ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό κ°–μŠ΅λ‹ˆλ‹€. 이것은 μƒˆ ꡬ쑰체 μΈμŠ€ν„΄μŠ€μ˜ 멀버 ν”„λ‘œνΌν‹°λ“€μ„ μ΄ˆκΈ°ν™”ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μƒˆ μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œνΌν‹°μ— λŒ€ν•œ μ΄ˆκΈ°κ°’μ€ λ©€λ²„μ™€μ΄μ¦ˆ μ΄λ‹ˆμ…œλΌμ΄μ €μ— 이름을 톡해 전달될 수 μžˆμŠ΅λ‹ˆλ‹€:

let vga = Resolution(width: 640, height: 480)

ꡬ쑰체와 달리, 클래슀 μΈμŠ€ν„΄μŠ€λŠ” κΈ°λ³Έ λ©€λ²„μ™€μ΄μ¦ˆ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό 갖지 μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λ‹ˆμ…œλΌμ΄μ €μ— λŒ€ν•œ 더 μžμ„Έν•œ μ •λ³΄λŠ” Initialization 에 μžˆμŠ΅λ‹ˆλ‹€.

ꡬ쑰체와 μ—΄κ±°ν˜•μ€ κ°’ νƒ€μž…

κ°’ νƒ€μž… 은 그것이 μƒμˆ˜λ‚˜ λ³€μˆ˜μ— ν• λ‹Ήλ˜κ±°λ‚˜, ν•¨μˆ˜μ— 전달될 λ•Œμ— κ·Έ 값이 λ³΅μ‚¬λ˜λŠ” νƒ€μž…μž…λ‹ˆλ‹€.

당신은 사싀 μ§€λ‚œ 챕터듀 λ‚΄λ‚΄ κ°’ νƒ€μž…μ„ ν™•μž₯적으둜 μ‚¬μš©ν•΄ μ™”μŠ΅λ‹ˆλ‹€. 사싀, Swift의 λͺ¨λ“  κΈ°λ³Έ νƒ€μž…λ“€ - μ •μˆ˜ν˜•, λΆ€λ™μ†Œμˆ˜μ  숫자, λΆˆλ¦¬μ–Έ, λ¬Έμžμ—΄, λ°°μ—΄κ³Ό λ”•μ…”λ„ˆλ¦¬ - 듀은 κ°’ νƒ€μž…μ΄λ©°, ν™”λ©΄ λ’€μ—μ„œ ꡬ쑰체둜 κ΅¬ν˜„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

Swiftμ—μ„œ λͺ¨λ“  ꡬ쑰체와 μ—΄κ±°ν˜•μ€ κ°’ νƒ€μž…μž…λ‹ˆλ‹€. 이것은 당신이 λ§Œλ“œλŠ” μ–΄λ–€ ꡬ쑰체와 μ—΄κ±°ν˜•μ˜ μΈμŠ€ν„΄μŠ€λ“  - 그리고 그것듀이 ν”„λ‘œνΌν‹°λ‘œμ„œ κ°–λŠ” μ–΄λ–€ κ°’ νƒ€μž…μ΄λ“  - λ‹Ήμ‹ μ˜ μ½”λ“œμ—μ„œ 전달될 λ•Œ 항상 λ³΅μ‚¬λœλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

주의
λ°°μ—΄, λ”•μ…”λ„ˆλ¦¬, λ¬Έμžμ—΄κ³Ό 같이 ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬μ— μ˜ν•΄ μ •μ˜λœ μ»¬λ ‰μ…˜λ“€μ€ λ³΅μ‚¬μ˜ μ„±λŠ₯ λΉ„μš©μ„ 쀄이기 μœ„ν•œ μ΅œμ ν™” 기법을 μ‚¬μš©ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ»¬λ ‰μ…˜λ“€μ€ 볡사본을 μ¦‰μ‹œ λ§Œλ“œλŠ” λŒ€μ‹ , μ›λž˜ μΈμŠ€ν„΄μŠ€μ™€ λͺ¨λ“  볡사본듀 간에 μš”μ†Œκ°€ μ €μž₯된 λ©”λͺ¨λ¦¬λ₯Ό κ³΅μœ ν•©λ‹ˆλ‹€. λ§Œμ•½ 볡사본듀 쀑 ν•˜λ‚˜κ°€ μˆ˜μ •λœλ‹€λ©΄, μˆ˜μ •λ˜κΈ° 직전에 μš”μ†Œλ“€μ΄ λ³΅μ‚¬λ©λ‹ˆλ‹€. λ‹Ήμ‹ μ˜ μ½”λ“œμ—μ„œλŠ” 마치 볡사가 μ¦‰μ‹œ μ΄λ£¨μ–΄μ§€λŠ” κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€.

이전 μ˜ˆμ‹œμ˜ Resolution ꡬ쑰체λ₯Ό μ‚¬μš©ν•˜λŠ” μ•„λž˜ 예제λ₯Ό λ΄…λ‹ˆλ‹€:

let hd = Resolution(width: 1920, height: 1080)
var cinema = hd

이 μ˜ˆμ‹œλŠ” hd λΌλŠ” μƒμˆ˜λ₯Ό μ„ μ–Έν•˜κ³  κ·Έ 값을 full HD λΉ„λ””μ˜€μ˜ λ„ˆλΉ„μ™€ λ†’μ΄λ‘œ μ΄ˆκΈ°ν™”ν•œ Resolution μΈμŠ€ν„΄μŠ€λ‘œ μ„€μ •ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. (1920ν”½μ…€μ˜ λ„ˆλΉ„μ™€ 1080ν”½μ…€μ˜ 높이λ₯Ό κ°–λŠ”)

κ·Έ λ‹€μŒ cinemaλΌλŠ” λ³€μˆ˜λ₯Ό μ„ μ–Έν•΄ ν˜„μž¬ hd 의 κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. Resolution 이 ꡬ쑰체이기 λ•Œλ¬Έμ—, μ‘΄μž¬ν•˜λŠ” μΈμŠ€ν„΄μŠ€μ˜ 볡사본 이 λ§Œλ“€μ–΄μ§€λ©°, κ·Έ μƒˆλ‘œμš΄ 볡사본이 cinema에 ν• λ‹Ήλ©λ‹ˆλ‹€. hd 와 cinema κ°€ 같은 λ„ˆλΉ„μ™€ 높이λ₯Ό 가지고 μžˆλ”λΌλ„, 사싀 κ·Έ λ‘˜μ€ μ™„μ „νžˆ λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€μž…λ‹ˆλ‹€.

λ‹€μŒμœΌλ‘œ, cinema 의 width ν”„λ‘œνΌν‹°κ°€ 디지털 μ˜ν™”κ΄€ ν”„λ‘œμ μ…˜μ— μ‚¬μš©λ˜λŠ” 2K ν‘œμ€€μœΌλ‘œ λ„ˆλΉ„κ°€ 살짝 λ„“κ²Œ μˆ˜μ •λ©λ‹ˆλ‹€ (2048ν”½μ…€μ˜ λ„ˆλΉ„μ™€ 1080ν”½μ…€μ˜ 높이λ₯Ό κ°–λŠ”):

cinema.width = 2048

cinema 의 width ν”„λ‘œνΌν‹°λ₯Ό ν™•μΈν•˜λ©΄ μ¦‰μ‹œ 2048둜 λ³€ν•œ 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€:

print("cinema is now \(cinema.width) pixels wide")
// Prints "cinema is now 2048 pixels wide"

ν•˜μ§€λ§Œ, μ›λž˜μ˜ hd μΈμŠ€ν„΄μŠ€μ˜ width ν”„λ‘œνΌν‹°λŠ” μ—¬μ „νžˆ μ˜ˆμ „ 값인 1920을 κ°–μŠ΅λ‹ˆλ‹€:

print("hd is still \(hd.width) pixels wide")
// Prints "hd is still 1920 pixels wide"

cinema 에 hd의 ν˜„μž¬ 값이 μ£Όμ–΄μ§ˆ λ•Œ, hd에 μ €μž₯된 값듀은 μƒˆλ‘œμš΄ cinema μΈμŠ€ν„΄μŠ€λ‘œ λ³΅μ‚¬λ˜μ–΄ μ €μž₯λ©λ‹ˆλ‹€. κ·Έ κ²°κ³Ό 같은 숫자 값을 가진 μ „ν˜€ λ‹€λ₯Έ λΆ„λ¦¬λœ μΈμŠ€ν„΄μŠ€κ°€ λ§Œλ“€μ–΄μ§‘λ‹ˆλ‹€. ν•˜μ§€λ§Œ, 이듀이 λΆ„λ¦¬λœ μΈμŠ€ν„΄μŠ€λ“€μ΄κΈ° λ•Œλ¬Έμ—, cinema 의 λ„ˆλΉ„λ₯Ό 2048둜 μˆ˜μ •ν•˜λŠ” 것은 hd의 λ„ˆλΉ„μ— 영ν–₯을 주지 μ•ŠμŠ΅λ‹ˆλ‹€. 즉 μ•„λž˜ κ·Έλ¦Όκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

https://docs.swift.org/swift-book/_images/sharedStateStruct_2x.png

같은 λ™μž‘μ΄ μ—΄κ±°ν˜•μ— λŒ€ν•΄μ„œλ„ μ μš©λ©λ‹ˆλ‹€:

enum CompassPoint {
    case north, south, east, west
    mutating func turnNorth() {
        self = .north
    }
}
var currentDirection = CompassPoint.west
let rememberedDirection = currentDirection
currentDirection.turnNorth()

print("The current direction is \(currentDirection)")
print("The remembered direction is \(rememberedDirection)")
// Prints "The current direction is north"
// Prints "The remembered direction is west"

rememberedDirection이 currentDirection 의 값을 할당받을 λ•Œ, 그것은 사싀 κ·Έ κ°’μ˜ λ³΅μ‚¬λ³ΈμœΌλ‘œ μ„€μ •λ©λ‹ˆλ‹€. currentDirection 의 값을 λ°”κΎΈλŠ” 것은 κ·Έ 이후 rememberedDirection에 μ €μž₯된 μ›λž˜ κ°’μ˜ 볡사본에 μ•„λ¬΄λŸ° 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

ν΄λž˜μŠ€λŠ” μ°Έμ‘° νƒ€μž…

κ°’ νƒ€μž…κ³Ό λ‹€λ₯΄κ²Œ, μ°Έμ‘° νƒ€μž… 은 그것이 λ³€μˆ˜λ‚˜ μƒμˆ˜μ— ν• λ‹Ήλ˜κ±°λ‚˜ ν•¨μˆ˜μ— 전달될 λ•Œ λ³΅μ‚¬λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ³΅μ‚¬λ˜λŠ” λŒ€μ‹ , 같은 μ‘΄μž¬ν•˜λŠ” μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ μ°Έμ‘°κ°€ μ‚¬μš©λ©λ‹ˆλ‹€.

여기에 μœ„μ—μ„œ μ •μ˜ν•œ VideoMode 클래슀λ₯Ό μ‚¬μš©ν•œ μ˜ˆμ‹œκ°€ μžˆμŠ΅λ‹ˆλ‹€:

let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0

이 μ˜ˆμ‹œλŠ” tenEightyλΌλŠ” μƒˆ μƒμˆ˜λ₯Ό μ •μ˜ν•˜κ³  κ·Έ 값을 VideoMode 클래슀의 μƒˆ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜λ„λ‘ μ„€μ •ν•©λ‹ˆλ‹€. λΉ„λ””μ˜€ λͺ¨λ“œμ˜ ν•΄μƒλ„λŠ” 1920 * 1080 μ΄λΌλŠ” 이전에 μ„€μ •ν•œ HD ν•΄μƒλ„μ˜ 볡사본이 ν• λ‹Ήλ©λ‹ˆλ‹€. interlaced값은 true, name은 β€œ1080i”, frameRateλŠ” μ΄ˆλ‹Ή 25.0으둜 μ„€μ •λ©λ‹ˆλ‹€.

κ·Έ λ‹€μŒ, tenEighty λŠ” μƒˆλ‘œμš΄ μƒμˆ˜μΈ alsoTenEighty 에 ν• λ‹Ήλ©λ‹ˆλ‹€. 그리고 alsoTenEighty의 frameRate κ°€ λ³€κ²½λ©λ‹ˆλ‹€:

let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0

ν΄λž˜μŠ€λŠ” μ°Έμ‘° νƒ€μž…μ΄κΈ° λ•Œλ¬Έμ—, tenEighty 와 alsoTenEighty λŠ” 사싀 같은 VideoMode μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ‹€μ§ˆμ μœΌλ‘œ, 그것듀은 κ·Έμ € ν•˜λ‚˜μ˜ 같은 μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ μ„œλ‘œ λ‹€λ₯Έ 두 이름듀일 λΏμž…λ‹ˆλ‹€. μ•„λž˜ κ·Έλ¦Όμ—μ„œ λ³΄μ—¬μ£ΌλŠ” 것과 κ°™μŠ΅λ‹ˆλ‹€:

https://docs.swift.org/swift-book/_images/sharedStateClass_2x.png

tenEighty의 frameRate ν”„λ‘œνΌν‹°λ₯Ό ν™•μΈν•˜μ—¬ μ›λž˜μ˜ VideoMode μΈμŠ€ν„΄μŠ€λ‘œλΆ€ν„° μƒˆλ‘œμš΄ frameRate 인 30.0을 λ°˜ν™˜ν•˜λŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€:

print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
// Prints "The frameRate property of tenEighty is now 30.0"

이 μ˜ˆμ‹œλŠ” λ˜ν•œ μ°Έμ‘° νƒ€μž…μ΄ μΆ”λ‘ ν•˜κΈ° 어렀움을 λ³΄μ—¬μ€λ‹ˆλ‹€. λ§Œμ•½ tenEighty 와 alsoTenEightyκ°€ λ‹Ήμ‹ μ˜ ν”„λ‘œκ·Έλž¨μ˜ μ½”λ“œμ—μ„œ 멀리 λ–¨μ–΄μ Έ 있으면, VideoModeκ°€ λ³€ν•˜λŠ” 것을 λͺ¨λ‘ νŒŒμ•…ν•˜κΈ°λŠ” μ–΄λ €μšΈ κ²ƒμž…λ‹ˆλ‹€. 당신이 tenEightyλ₯Ό μ‚¬μš©ν•  λ•Œ λ§ˆλ‹€, alsoTenEighty λ₯Ό μ‚¬μš©ν•˜λŠ” μ½”λ“œμ— λŒ€ν•΄μ„œλ„ 생각해야 ν•˜λ©°, κ·Έ λ°˜λŒ€λ„ λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€. λŒ€μ‘°μ μœΌλ‘œ, κ°’ νƒ€μž…λ“€μ€ μΆ”λ‘ ν•˜κΈ° 더 μ‰¬μš°λ©°, μ΄λŠ” μ†ŒμŠ€μ½”λ“œ μƒμ—μ„œ 같은 값에 λŒ€ν•΄ μƒν˜Έμž‘μš©ν•˜λŠ” μ½”λ“œλ“€μ΄ λͺ¨λ‘ κ°€κΉŒμ΄ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

tenEighty와 alsoTenEighty κ°€ λͺ¨λ‘ λ³€μˆ˜κ°€ μ•„λ‹Œ μƒμˆ˜ 둜 μ„ μ–Έλ˜μ—ˆμŒμ— μ£Όμ˜ν•˜μ‹­μ‹œμ˜€, ν•˜μ§€λ§Œ 당신은 μ—¬μ „νžˆ tenEighty.frameRate 와 alsoTenEighty.frameRate λ₯Ό λ³€κ²½ν•  수 있으며 κ·Έ μ΄μœ λŠ” tenEighty와 alsoTenEighty μƒμˆ˜ μžμ‹ μ€ 사싀 λ³€ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. tenEighty 와 alsoTenEighty λŠ” 슀슀둜 VideoMode μΈμŠ€ν„΄μŠ€λ₯Ό β€œμ €μž₯β€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ - λŒ€μ‹ , κ·Έ λ‘˜μ€ λͺ¨λ‘ κΈ°μ €μ˜ VideoMode μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘° ν•©λ‹ˆλ‹€. λ³€ν•˜λŠ” 것은 VideoMode의 μƒμˆ˜μ— λŒ€ν•œ 참쑰값이 μ•„λ‹Œ, VideoMode의 frameRate ν”„λ‘œνΌν‹°μž…λ‹ˆλ‹€.

동일성 μ—°μ‚°μž (Identity Operators)

ν΄λž˜μŠ€λŠ” μ°Έμ‘° νƒ€μž…μ΄κΈ° λ•Œλ¬Έμ—, μ—¬λŸ¬ μƒμˆ˜λ‚˜ λ³€μˆ˜κ°€ ν•˜λ‚˜μ˜ 같은 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. (ꡬ쑰체와 μ—΄κ±°ν˜•μ— λŒ€ν•΄μ„œλŠ” 이것이 사싀이 μ•„λ‹™λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ 그것듀은 μ–Έμ œλ‚˜ μƒμˆ˜λ‚˜ λ³€μˆ˜μ— ν• λ‹Ήλ˜κ±°λ‚˜ ν•¨μˆ˜λ‘œ 전달될 λ•Œμ— 값이 λ³΅μ‚¬λ˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€)

λ•Œλ•Œλ‘œ 두 μƒμˆ˜λ‚˜ λ³€μˆ˜κ°€ μ •ν™•νžˆ 같은 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜λŠ”μ§€ μ•Œμ•„λ‚΄λŠ” 것이 μœ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ SwiftλŠ” 두 가지 동일성 μ—°μ‚°μžλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€:

  • …와 λ™μΌν•˜λ‹€ (===)
  • …와 λ™μΌν•˜μ§€ μ•Šλ‹€ (!==)

이 μ—°μ‚°μžλ“€μ€ 두 μƒμˆ˜λ‚˜ λ³€μˆ˜κ°€ ν•˜λ‚˜μ˜ 같은 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜κ³  μžˆλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•©λ‹ˆλ‹€:

if tenEighty === alsoTenEighty {
    print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
}
// Prints "tenEighty and alsoTenEighty refer to the same VideoMode instance."

λ™μΌν•˜λ‹€ (μ„Έ 개의 λ“±ν˜Έ ν‘œμ‹œ, === 둜 λ‚˜νƒ€λƒ„) κ°€ λ™λ“±ν•˜λ‹€ (두 개의 λ“±ν˜Έ ν‘œμ‹œ, == 둜 λ‚˜νƒ€λƒ„) 와 같은 것을 μ˜λ―Έν•˜λŠ” 것이 μ•„λ‹ˆλΌλŠ” 것에 μ£Όμ˜ν•˜μ‹­μ‹œμ˜€. λ™μΌν•˜λ‹€ λŠ” 것은 클래슀 νƒ€μž…μ˜ 두 μƒμˆ˜λ‚˜ λ³€μˆ˜κ°€ μ •ν™•νžˆ 같은 클래슀 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜κ³  μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€. λ™λ“±ν•˜λ‹€ λŠ” 것은 두 μΈμŠ€ν„΄μŠ€κ°€ 값이 κ°™κ±°λ‚˜, νƒ€μž…μ„ λ§Œλ“  μ‚¬λžŒμ΄ μ •μ˜ν•œ 바에 μ˜ν•΄ 값이 λ™λ“±ν•˜λ‹€κ³  간주됨을 μ˜λ―Έν•©λ‹ˆλ‹€.

λ‹Ήμ‹ λ§Œμ˜ ꡬ쑰체와 클래슀λ₯Ό μ •μ˜ν–ˆμ„ λ•Œ, 무엇이 두 μΈμŠ€ν„΄μŠ€μ˜ κ°™μŒμ„ κ²°μ •ν•˜λŠ”μ§€ μ •ν•˜λŠ” 것은 λ‹Ήμ‹ μ˜ μ±…μž„μž…λ‹ˆλ‹€. == 와 != μ—°μ‚°μžμ˜ κ΅¬ν˜„μ„ μ‚¬μš©μž μ •μ˜ν•˜λŠ” 과정은 Equivalence Operators 에 μ„€λͺ…λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

포인터

당신이 C, C++, λ˜λŠ” Objective-Cλ₯Ό κ²½ν—˜ν•œ 적이 μžˆλ‹€λ©΄, 이 언어듀이 λ©”λͺ¨λ¦¬μ˜ μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•˜κΈ° μœ„ν•΄ 포인터 λ₯Ό μ‚¬μš©ν•œλ‹€λŠ” 것을 μ•Œκ³  μžˆμ„ κ²ƒμž…λ‹ˆλ‹€. λͺ‡λͺ‡ μ°Έμ‘° νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜λŠ” Swift의 μƒμˆ˜λ‚˜ λ³€μˆ˜λŠ” C의 포인터와 λΉ„μŠ·ν•˜μ§€λ§Œ, 그것은 λ©”λͺ¨λ¦¬μ˜ μ£Όμ†Œμ— λŒ€ν•œ 직접적인 포인터가 μ•„λ‹ˆλ©°, μ°Έμ‘°λ₯Ό λ§Œλ“œλŠ” 것을 λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ μ•„μŠ€ν…Œλ¦¬μŠ€ν¬(λ³„ν‘œ, *)λ₯Ό 뢙일 ν•„μš”λ„ μ—†μŠ΅λ‹ˆλ‹€. λŒ€μ‹ , Swiftμ—μ„œ μ΄λŸ¬ν•œ 참쑰듀은 λ‹€λ₯Έ μƒμˆ˜λ‚˜ λ³€μˆ˜μ™€ λ˜‘κ°™μ΄ μ •μ˜λ©λ‹ˆλ‹€. 당신이 포인터λ₯Ό 톡해 직접 μƒν˜Έμž‘μš©ν•΄μ•Ό ν•œλ‹€λ©΄, 그럴 λ•Œ μ‚¬μš©ν•  수 μžˆλŠ” 포인터와 버퍼 νƒ€μž…λ“€μ„ ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ œκ³΅ν•©λ‹ˆλ‹€ - Manual Memory Management λ₯Ό μ°Έκ³ ν•˜μ‹­μ‹œμ˜€.