Skip to content

Latest commit

Β 

History

History
155 lines (102 loc) Β· 8.1 KB

class_struct.md

File metadata and controls

155 lines (102 loc) Β· 8.1 KB

Class & Struct

  • λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ° 언어와 달리 SwiftλŠ” μ‚¬μš©μž μ •μ˜ ꡬ쑰체와 ν΄λž˜μŠ€μ— λŒ€ν•΄ λ³„λ„μ˜ μΈν„°νŽ˜μ΄μŠ€μ™€ κ΅¬ν˜„ νŒŒμΌμ„ λ§Œλ“€ ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. Swiftμ—μ„œ 단일 파일둜 ꡬ쑰체 λ˜λŠ” 클래슀λ₯Ό μ •μ˜ν•˜λ©΄ ν•΄λ‹Ή 클래슀 λ˜λŠ” ꡬ쑰체에 λŒ€ν•œ μ™ΈλΆ€ μΈν„°νŽ˜μ΄μŠ€κ°€ μžλ™μœΌλ‘œ λ‹€λ₯Έ μ½”λ“œμ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ꡬ쑰체와 ν΄λž˜μŠ€λŠ” λ‹€μŒκ³Ό 같은 곡톡점을 κ°€μ§‘λ‹ˆλ‹€.

  • 값을 μ €μž₯ν•˜λŠ” ν”„λ‘œνΌν‹° μ •μ˜
  • κΈ°λŠ₯ μ œκ³΅μ„ μœ„ν•œ λ©”μ„œλ“œ μ •μ˜
  • μ„œλΈŒ 슀크립트 ꡬ문을 μ‚¬μš©ν•˜μ—¬ 값에 접근을 μ œκ³΅ν•˜λŠ” μ„œλΈŒ 슀크립트 μ •μ˜
  • μ΄ˆκΈ°ν™” μƒνƒœλ₯Ό μ„€μ •ν•˜κΈ° μœ„ν•œ μ΄ˆκΈ°ν™” μ •μ˜
  • κΈ°λ³Έ κ΅¬ν˜„μ„ λ„˜μ–΄ κΈ°λŠ₯적 ν™•μž₯을 μœ„ν•œ ν™•μž₯
  • νŠΉμ • μ’…λ₯˜μ˜ ν‘œμ€€ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” ν”„λ‘œν† μ½œ μ€€μˆ˜

κ΅¬μ‘°μ²΄λŠ” struct ν‚€μ›Œλ“œλ‘œ ν΄λž˜μŠ€λŠ” class ν‚€μ›Œλ“œλ‘œ μ‹œμž‘ν•΄ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ΅¬μ‘°μ²΄λ‚˜ 클래슀의 λ³€μˆ˜λ₯Ό 속성(property)이라고 ν•˜κ³  ν•¨μˆ˜λ₯Ό λ©”μ„œλ“œ(method)라고 ν•©λ‹ˆλ‹€.

class Dog {
    var name = "κ°•μ•„μ§€"
    var weight = 0
    
    func sit() {
        print("μ•‰μ•˜μŠ΅λ‹ˆλ‹€.")
    }
    
    func layDown() {
        print("λˆ„μ› μŠ΅λ‹ˆλ‹€.")
    }
}

struct Bird {
    var name = "μƒˆ"
    var weight = 0.0
    
    func fly() {
        print("λ‚ μ•„κ°‘λ‹ˆλ‹€.")
    }
}

ν΄λž˜μŠ€μ™€ ꡬ쑰체 λ‘˜λ‹€ λ©”λͺ¨λ¦¬μ— 찍어낸 것을 μΈμŠ€ν„΄μŠ€(instance)라고 ν•˜κ³  μΈμŠ€ν„΄μŠ€λŠ” μ‹€μ œλ‘œ λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ˜μ–΄ ꡬ체적 싀체λ₯Ό κ°–μΆ˜ κ²ƒμž…λ‹ˆλ‹€. ꡬ쑰체와 클래슀 λͺ¨λ‘ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό μœ„ν•΄ μ΄ˆκΈ°ν™” ꡬ문을 μ‚¬μš©ν•©λ‹ˆλ‹€. κ°€μž₯ κ°„λ‹¨ν•œ ν˜•νƒœλŠ” κ΅¬μ‘°μ²΄λ‚˜ 클래슀 이름 뒀에 빈 μ†Œκ΄„ν˜Έλ₯Ό λΆ™μ—¬ μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λ ‡κ²Œ 되면 λͺ¨λ“  ν”„λ‘œνΌν‹°κ°€ κΈ°λ³Έκ°’μœΌλ‘œ μ΄ˆκΈ°ν™”λ˜λŠ” 클래슀 λ˜λŠ” ꡬ쑰체의 μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜κΈ° μœ„ν•΄ 점 ꡬ문(.)을 μ‚¬μš©ν•©λ‹ˆλ‹€.

var bori = Dog()
var aBird = Bird()

bori.weight	= 0.3
bori.weight			// 0.3
aBird.fly()			// λ‚ μ•„κ°‘λ‹ˆλ‹€.

ꡬ쑰체와 클래슀의 차이점

ꡬ쑰체와 클래슀의 차이점을 κ³΅λΆ€ν•˜λ©΄μ„œ κ·Έλƒ₯ κ·Έλ ‡κ΅¬λ‚˜ ν•˜λ©΄μ„œ λ„˜μ–΄κ°”λ˜ 뢀뢄듀을 λ©”λͺ¨λ¦¬ ꡬ쑰와 μ—°κ΄€μ§€μ–΄ μ™œ 차이가 μƒκΈ°λŠ” μ§€λ₯Ό ν™•μ‹€ν•˜κ²Œ μ•Œκ²Œλ˜μ—ˆκ³  이λ₯Ό κ³΅λΆ€ν•˜κ³  μ •λ¦¬ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰ν•˜κ²Œ 되면 OSλŠ” λ©”λͺ¨λ¦¬μ— 곡간을 ν• λ‹Ήν•΄μ£ΌλŠ”λ° ν• λ‹Ήν•΄μ£ΌλŠ” λ©”λͺ¨λ¦¬ 곡간은 Code, Data, Heap, Stack 4κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.

Code μ˜μ—­μ€ μš°λ¦¬κ°€ μž‘μ„±ν•œ μ†ŒμŠ€μ½”λ“œκ°€ 기계어 ν˜•νƒœλ‘œ λ“€μ–΄ κ°€λŠ” λΆ€λΆ„μœΌλ‘œ CPUκ°€ 순차적으둜 ν•œμ€„μ”© μ‹€ν–‰ν•©λ‹ˆλ‹€. ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 μ½”λ“œκ°€ λ°”λ€Œλ©΄ μ•ˆλ˜λ‹ˆ Read-Only둜 μ €μž₯λ©λ‹ˆλ‹€.

Data μ˜μ—­μ€ μ „μ—­λ³€μˆ˜λ‚˜ νƒ€μž…μ†μ„±μ΄ ν• λ‹Ήλ˜λŠ” μ˜μ—­μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ˜ μ‹œμž‘κ³Ό λ™μ‹œμ— ν• λ‹Ήλ˜κ³ , ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜μ–΄μ•Ό λ©”λͺ¨λ¦¬κ°€ μ†Œλ©Έλ˜λŠ” μ˜μ—­μž…λ‹ˆλ‹€.

Heap μ˜μ—­μ€ μ‚¬μš©μžμ— μ˜ν•΄ λ©”λͺ¨λ¦¬ 곡간이 λ™μ μœΌλ‘œ ν• λ‹Ήλ˜κ³  ν•΄μ œλ˜λ©° 클래슀의 κ°μ²΄λ‚˜ ν΄λ‘œμ € 같은 μ°Έμ‘°νƒ€μž…μ˜ 값이 ν• λ‹Ήλ©λ‹ˆλ‹€. μ‚¬μš©ν•˜κ³  λ‚œ ν›„μ—λŠ” λ©”λͺ¨λ¦¬ ν•΄μ œλ₯Ό ν•΄μ€˜μ•Ό ν•˜μ§€λ§Œ μŠ€μœ„ν”„νŠΈλŠ” ARCλ₯Ό 톡해 νž™μ— ν• λ‹Ήλœ λ©”λͺ¨λ¦¬κ°€ 더 이상 μ“Έλͺ¨ μ—†μ–΄μ§€λ©΄(μ°Έμ‘°λ˜μ§€ μ•ŠμœΌλ©΄) μžλ™μœΌλ‘œ ν•΄μ œν•΄μ€€λ‹€κ³  ν•©λ‹ˆλ‹€. ARC도 λ‚˜μ€‘μ— κΌ­ κ³΅λΆ€ν•΄μ„œ μ •λ¦¬ν•΄λ΄μ•Όκ² μ–΄μš”

Stack μ˜μ—­μ€ ν•¨μˆ˜μ˜ μ‹€ν–‰μ‹œ ν•„μš” 데이터가 μƒμ„±λ˜κ³  μ‚¬μš© μ™„λ£Œ ν›„μ—λŠ” μ €μž₯된 λ©”λͺ¨λ¦¬κ°€ ν•΄μ œλ©λ‹ˆλ‹€.

Stack vs Heap

μŠ€νƒμ˜μ—­μ€ CPUκ°€ 효율적으둜 λ©”λͺ¨λ¦¬λ₯Ό κ΅¬μ„±ν•˜κΈ°μ— μ΅œμ ν™”κ°€ λ˜μ–΄μžˆμ–΄ 속도가 λΉ λ₯΄κ³  λ©”λͺ¨λ¦¬λ₯Ό 직접 ν•΄μ œν•˜μ§€ μ•Šμ•„λ„ λ˜λŠ” 반면 νž™ μ˜μ—­μ€ λ©”λͺ¨λ¦¬λ₯Ό κ°œλ°œμžκ°€ 직접 κ΄€λ¦¬ν•΄μ•Όν•˜λ―€λ‘œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜μ˜ μœ„ν—˜μ„±μ΄ 있고 ν• λ‹Ή/ν•΄μ œ μž‘μ—…μœΌλ‘œ 인해 속도가 μŠ€νƒμ— λΉ„ν•΄ λŠλ¦½λ‹ˆλ‹€. 또 μŠ€νƒμ˜μ—­μ€ λ©”λͺ¨λ¦¬ 크기에 λŒ€ν•œ μ œν•œμ΄ μžˆμ§€λ§Œ νž™ μ˜μ—­μ€ 컴퓨터에 λ‚¨μ•„μžˆλŠ” λ©”λͺ¨λ¦¬ λ‚΄μ—μ„œλŠ” λ©”λͺ¨λ¦¬ 크기에 λŒ€ν•œ μ œν•œμ΄ μ—†μŠ΅λ‹ˆλ‹€.


Swift의 Type은 크게 Value Type(κ°’ νƒ€μž…)κ³Ό Reference Type(μ°Έμ‘° νƒ€μž…)으둜 λ‚˜λ‰©λ‹ˆλ‹€. κ°’ νƒ€μž…μ€ λ³€μˆ˜ λ˜λŠ” μƒμˆ˜μ— 할당될 λ•Œλ‚˜ ν•¨μˆ˜λ‘œ 전달될 λ•Œ 볡사 λ˜λŠ” 값인 νƒ€μž…μ΄κ³  μ°Έμ‘° νƒ€μž…μ€ 볡사본 λŒ€μ‹ μ— μ‘΄μž¬ν•˜λŠ” 같은 μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ μ°Έμ‘°κ°€ μ‚¬μš©λ©λ‹ˆλ‹€.

κ΅¬μ‘°μ²΄λŠ” Value Type(κ°’ νƒ€μž…), ν΄λž˜μŠ€λŠ” Reference Type(μ°Έμ‘° νƒ€μž…)μž…λ‹ˆλ‹€. 이λ₯Ό λ©”λͺ¨λ¦¬ ꡬ쑰 κ΄€λ ¨ν•΄μ„œ μ–˜κΈ°λ₯Ό 해보면 κ°’ νƒ€μž…μΈ ꡬ쑰체의 μΈμŠ€ν„΄μŠ€(κ·Έ 쀑 ν”„λ‘œνΌν‹°. λ©”μ„œλ“œλŠ” 데이터 μ˜μ—­μ— μ €μž₯λœλ‹€.)λŠ” Stack μ˜μ—­μ— 데이터λ₯Ό λ³΅μ‚¬ν•΄μ„œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³ , μ°Έμ‘° νƒ€μž…μΈ 클래슀의 μΈμŠ€ν„΄μŠ€λŠ” Heap μ˜μ—­μ— λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³  ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜κ²Œ 되면 Heap의 μ£Όμ†Œλ₯Ό μ „λ‹¬ν•΄μ€λ‹ˆλ‹€. κ΅¬μ‘°μ²΄λ‚˜ 클래슀 μžμ²΄λŠ” 데이터 μ˜μ—­μ— μ €μž₯λΌμš”.

Value Type κ°’ -> Stack에 λ©”λͺ¨λ¦¬ ν• λ‹Ή Reference Type κ°’ -> Heap에 λ©”λͺ¨λ¦¬ ν• λ‹Ή

μΆ”κ°€) Value Type이 Heap에, Reference Type 이 Stack에 μ €μž₯λ˜λŠ” 상황도 μžˆλ‹€κ³  ν•©λ‹ˆλ‹€. μ°Έκ³ 

class Person {
    var name = "μ‚¬λžŒ"
}



struct Animal {
    var name = "동물"
}




var p = Person()    // x1234  <- Heap의 μ£Όμ†Œλ₯Ό 가리킴
p.name              // μ‚¬λžŒ

var a = Animal()
a.name              // 동물



var p2 = p       // (클래슀)     // x1234 <- λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°€ λ³΅μ‚¬λ˜μ„œ λ‹΄κΉ€


p.name = "혜리"

p.name          // 해리
p2.name         // 해리
    




var a2 = a       // (ꡬ쑰체)
a.name = "κ°•μ•„μ§€"

a.name          // κ°•μ•„μ§€
a2.name         // 동물

이런 차이가 μΈμŠ€ν„΄μŠ€ μ„ μ–Έμ‹œ μƒμˆ˜(let)λ‚˜ λ³€μˆ˜(var)둜 생성할 λ•Œμ—λ„ 영ν–₯을 λ―ΈμΉ©λ‹ˆλ‹€.

  • μΈμŠ€ν„΄μŠ€ μƒμˆ˜(let)으둜 μ„ μ–Έμ‹œ ꡬ쑰체 -> μ €μž₯ 속성이 μ „λΆ€ μƒμˆ˜λ‘œ 선언됨 클래슀 -> κ°€λ₯΄ν‚€λŠ” μΈμŠ€ν„΄μŠ€ κ³ μ •(μ €μž₯ 속성은 각 let/var 선언에 따름)
  • μΈμŠ€ν„΄μŠ€ λ³€μˆ˜(var)둜 μ„ μ–Έμ‹œμ—λŠ” ꡬ쑰체도 μ €μž₯ μ†μ„±μ˜ 각 let/var 선언에 λ”°λ₯Έλ‹€.

그리고 μƒμ†μ—μ„œλ„ 차이λ₯Ό λ³΄μž…λ‹ˆλ‹€. κ΅¬μ‘°μ²΄λŠ” 상속이 λΆˆκ°€λŠ₯ν•œ λ°˜λ©΄μ— ν΄λž˜μŠ€λŠ” 상속이 κ°€λŠ₯ν•©λ‹ˆλ‹€. 클래슀만이 상속 κ°€λŠ₯ν•©λ‹ˆλ‹€. 상속에 λŒ€ν•΄μ„œλŠ” λ‹€μŒμ— 또 μžμ„Ένžˆ λ‹€λ€„λ³Όκ²Œμš”.

μ–Έμ œ ꡬ쑰체λ₯Ό μ‚¬μš©ν•˜κ³  μ–Έμ œ 클래슀λ₯Ό μ‚¬μš©ν•˜λ‚˜!

  • μ—°κ΄€λœ 데이터듀을 λ‹¨μˆœνžˆ λ¬ΆλŠ” 것이 λͺ©μ μΌ λ•ŒλŠ” ꡬ쑰체가 λ‚«μŠ΅λ‹ˆλ‹€.

  • ꡬ쑰체에 μ €μž₯된 μ €μž₯ 속성듀이 κ°’ νƒ€μž…μ΄λ©° μ°Έμ‘°ν•˜λŠ” 것보닀 λ³΅μ‚¬ν•˜λŠ” 것이 ν•©λ‹Ήν•  λ•Œ ꡬ쑰체λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

  • ν•΄λ‹Ή λͺ¨λΈμ„ serializeν•΄μ„œ μ „μ†‘ν•˜κ±°λ‚˜ 파일둜 μ €μž₯ν•  κ²½μš°κ°€ λ°œμƒν•˜λ©΄ 클래슀λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

  • Objectice-C와 μƒν˜Έ μš΄μš©μ„±μ„ 원할 λ•ŒλŠ” 클래슀λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

    • Objective-Cμ—μ„œ μ§€μ›ν•˜λŠ” APIλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•  λ•ŒλŠ” Objective-C의 클래슀λ₯Ό 상속받아 μ‚¬μš©ν•΄μ•Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이런 κ²½μš°μ—λŠ” 클래슀λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • κ³ μœ ν•œ 값을 μ œμ–΄ν•΄μ•Ό ν•  λ•ŒλŠ” 클래슀λ₯Ό μ‚¬μš©ν•˜μ„Έμš”.

    • ν΄λž˜μŠ€λŠ” μ°Έμ‘° νƒ€μž…μ΄κΈ° λ•Œλ¬Έμ— μŠ€μœ„ν”„νŠΈμ—μ„œ κ³ μœ ν•œ κ°’μœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€. μ°Έμ‘° νƒ€μž…μ„ μ‚¬μš©ν•˜λ©΄ μ•±μ˜ μ—¬λŸ¬ κ³³μ—μ„œ μ‚¬μš©ν•˜λ”λΌλ„ ν•œ μ˜μ—­μ—μ„œ μ μš©ν•œ μˆ˜μ •μ΄ λ‹€λ₯Έ μ˜μ—­μ—μ„œλ„ μ μš©λ©λ‹ˆλ‹€. 주둜 파일 κ΄€λ¦¬λ‚˜ λ„€νŠΈμ›Œν¬ μ—°κ²°κ³Ό 같은 μž‘μ—…μ„ λ‹€λ£° λ•Œ 클래슀λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

[μ°Έκ³ ]