Published on

🍎 Swift - Struct vs Class

Authors
  • avatar
    Name
    이창쀀
    Twitter

ꡬ쑰체(struct)와 클래슀(class)

Swiftμ—λŠ” 두 가지 데이터 νƒ€μž…μ΄ μžˆμŠ΅λ‹ˆλ‹€. λ°”λ‘œ struct와 classμž…λ‹ˆλ‹€. μ–΄λŠ 정도 감으둜 μ‚¬μš©ν•˜κ³  μžˆμ—ˆμ§€λ§Œ μ •ν™•ν•˜κ²Œ μ•Œμ•„λ³΄κ³  μ‹Άμ–΄μ„œ 곡뢀λ₯Ό ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

κ°’ νƒ€μž… vs μ°Έμ‘° νƒ€μž…

μ •μ˜μ˜ 차이둜 μ„€λͺ…ν•˜μžλ©΄ classλŠ” μ°Έμ‘° νƒ€μž…, structλŠ” κ°’ νƒ€μž…μž…λ‹ˆλ‹€.

κ°’ νƒ€μž…μΈ struct에 μ†Œμ†λœ μΈμŠ€ν„΄μŠ€λ“€μ€ 값을 λ³΅μ‚¬ν•˜μ—¬ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ–΄ μ‚¬μš©ν•©λ‹ˆλ‹€. μ°Έμ‘° νƒ€μž…μΈ class에 μ†Œμ†λœ μΈμŠ€ν„΄μŠ€λ“€μ€ μ°Έμ‘° 값이 μ „λ‹¬λ©λ‹ˆλ‹€.

ν• λ‹Ή λ©”λͺ¨λ¦¬ μ˜μ—­

struct

κ°’ 볡사 방식을 μ‚¬μš©ν•˜λŠ” κ΅¬μ‘°μ²΄λŠ” λ©”λͺ¨λ¦¬μ˜ μŠ€νƒ μ˜μ—­μ— ν• λ‹Ήλ©λ‹ˆλ‹€. λ”°λΌμ„œ μŠ€νƒ μ˜μ—­μ˜ νŠΉμ§•λ“€μ„ κ°–μŠ΅λ‹ˆλ‹€.

  • Thread-Safeν•˜λ‹€. (μŠ€λ ˆλ“œκ°€ λ…λ¦½μ μœΌλ‘œ μ‚¬μš©)
  • ν•œ 번의 λͺ…λ ΉμœΌλ‘œ ν• λ‹Ή&ν•΄μ œ κ°€λŠ₯ (μŠ€νƒ 포인터 μ‚¬μš©)
  • 컴파일 μ‹œκ°„μ— 크기 λ°°μ •

class

μ°Έμ‘° 방식을 μ‚¬μš©ν•˜λŠ” ν΄λž˜μŠ€λŠ” λ©”λͺ¨λ¦¬μ˜ νž™ μ˜μ—­μ— ν• λ‹Ήλ©λ‹ˆλ‹€. λ”°λΌμ„œ νž™ μ˜μ—­μ˜ νŠΉμ§•λ“€μ„ κ°–μŠ΅λ‹ˆλ‹€.

  • λŸ°νƒ€μž„μ— 크기가 λ°°μ •λœλ‹€.
  • Thread-Safeν•˜μ§€ μ•Šλ‹€. (μŠ€λ ˆλ“œκ°€ κ³΅μœ ν•˜μ—¬ μ‚¬μš©)

ꢌμž₯ν•˜λŠ” νƒ€μž…μ€?

μ• ν”Œμ€ λ˜λ„λ‘μ΄λ©΄ structλ₯Ό μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ©”λͺ¨λ¦¬ 관리 μ‹œμ— λ³„λ„μ˜ μ—°μ‚° 과정이 ν•„μš”ν•˜μ§€ μ•Šκ³  속도도 λΉ λ₯΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ classλŠ” μ™œ μ‚¬μš©ν• κΉŒμš”?

상속

class λŠ” 상속이 κ°€λŠ₯ν•©λ‹ˆλ‹€. extension을 μ‚¬μš©ν•˜μ—¬ 기쑴의 classμ—μ„œ ν™•μž₯된 λ²„μ „μ˜ classλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 λ‚΄μš©μ€ 좔후에 λ”°λ‘œ 닀루고 링크λ₯Ό 남겨두도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€!

그럼 μ–Έμ œ 뭘 μ“ΈκΉŒμš”?

κ·Έλ ‡λ‹€λ©΄ μ–Έμ œ structλ₯Ό, μ–Έμ œ classλ₯Ό μ‚¬μš©ν•΄μ•Ό ν• κΉŒμš”?

μœ„μ—μ„œ ν•œ 번 μ–ΈκΈ‰ν–ˆλ˜λŒ€λ‘œ μ• ν”Œμ€ structλ₯Ό μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. Swift의 structλŠ” λ‹€λ₯Έ μ–Έμ–΄μ—μ„œλŠ” class만이 κ°–κ³  μžˆλŠ” νŽΈλ¦¬ν•œ κΈ°λŠ₯듀을 상당 수 μ§€μ›ν•©λ‹ˆλ‹€.

Swift의 structλŠ” μ €μž₯/μ—°μ‚° ν”„λ‘œνΌν‹°, λ©”μ„œλ“œ, 심지어 ν”„λ‘œν† μ½œκΉŒμ§€ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œ μ• ν”Œμ€ λŒ€λΆ€λΆ„μ˜ ν‘œμ€€ 라이브러리(숫자, λ¬Έμžμ—΄, λ°°μ—΄, λ”•μ…”λ„ˆλ¦¬ λ“±)에 structλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

  • obj-c 언어와 μƒν˜Έ μ΄μš©ν•  λ•ŒλŠ” classλ₯Ό 이용

obj-c의 APIλ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό μ²˜λ¦¬ν•  λ•ŒλŠ” classλ₯Ό μ‚¬μš©ν•΄μ•Όλ§Œ ν•©λ‹ˆλ‹€. λ”°λΌμ„œ 이런 κ²½μš°μ—λŠ” 클래슀λ₯Ό μ‚¬μš©ν•  수 밖에 μ—†μŠ΅λ‹ˆλ‹€.

  • κ³ μœ ν•œ 값에 λŒ€ν•œ μ œμ–΄κ°€ ν•„μš”ν•  λ•ŒλŠ” class 이용

classλŠ” μ°Έμ‘° νƒ€μž…μ΄κΈ° λ•Œλ¬Έμ— μ–΄λŠ ν•œ κ³³μ—μ„œ 값을 μˆ˜μ •ν•˜λ”λΌλ„ μ•±μ˜ λͺ¨λ“  κ³³μ—μ„œ 변경이 μΌμ–΄λ‚©λ‹ˆλ‹€. 이런 ν˜„μƒμ„ μ˜λ„μ μœΌλ‘œ μ›ν•œλ‹€λ©΄ classλ₯Ό μ‚¬μš©ν•˜λ©΄ μ’‹μŠ΅λ‹ˆλ‹€.

  • 상속과 곡유λ₯Ό λͺ¨λΈλ§ ν•  λ•ŒλŠ” structλ₯Ό 이용

class와 structλŠ” λͺ¨λ‘ 상속을 μ§€μ›ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ structλŠ” classλ‘œλΆ€ν„° μƒμ†λ˜μ§€λŠ” λͺ»ν•˜κ³ , protocolλ‘œλΆ€ν„°λ§Œ 차용될 수 μžˆμŠ΅λ‹ˆλ‹€.

protocol은 클래슀, ꡬ쑰체, μ—΄κ±°ν˜• 데이터듀이 상속할 수 μžˆμ§€λ§Œ classλŠ” 같은 classλ“€λΌλ¦¬λ§Œ 상속이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— 데이터λ₯Ό 섀계할 λ•Œ μš°μ„  protocol을 μ‚¬μš©ν•΄λ³΄λŠ” 것을 μΆ”μ²œν•©λ‹ˆλ‹€.

참고 자료

Choosing between Structures and Classes