πŸ‘©πŸ»‍πŸ’»/Swift

26. μ΅μŠ€ν…μ…˜ - iOS ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•œ μŠ€μœ„ν”„νŠΈ 기초

reujusong 2020. 6. 23. 14:50

- μ΅μŠ€ν…μ…˜

  • μ΅μŠ€ν…μ…˜(Extension) μ€ μŠ€μœ„ν”„νŠΈμ˜ κ°•λ ₯ν•œ κΈ°λŠ₯ 쀑 ν•˜λ‚˜μ΄λ‹€.
  • μ΅μŠ€ν…μ…˜μ€ κ΅¬μ‘°μ²΄, 클래슀, μ—΄κ±°ν˜•, ν”„λ‘œν† μ½œ νƒ€μž…μ— μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ ν•  수 μžˆλŠ” κΈ°λŠ₯이닀.
  • κΈ°λŠ₯을 μΆ”κ°€ν•˜λ €λŠ” νƒ€μž…μ˜ κ΅¬ν˜„λœ μ†ŒμŠ€ μ½”λ“œλ₯Ό μ•Œμ§€ λͺ»ν•˜κ±°λ‚˜ λ³Ό 수 μ—†λ‹€ 해도, νƒ€μž…λ§Œ μ•Œκ³  μžˆλ‹€λ©΄ κ·Έ νƒ€μž…μ˜ κΈ°λŠ₯을 ν™•μž₯ν•  μˆ˜λ„ μžˆλ‹€.

 

<<μŠ€μœ„ν”„νŠΈμ˜ μ΅μŠ€ν…μ…˜μ΄ νƒ€μž…μ— μΆ”κ°€ν•  수 μžˆλŠ” κΈ°λŠ₯>>

  • μ—°μ‚° νƒ€μž… ν”„λ‘œνΌν‹° / μ—°μ‚° μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°
  • νƒ€μž… λ©”μ„œλ“œ / μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ
  • μ΄λ‹ˆμ…œλΌμ΄μ €
  • μ„œλΈŒμŠ€ν¬λ¦½νŠΈ
  • 쀑첩 νƒ€μž…
  • νŠΉμ • ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•  수 μžˆλ„λ‘ κΈ°λŠ₯ μΆ”κ°€

** μ΅μŠ€ν…μ…˜μ€ νƒ€μž…μ— μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  μˆ˜λŠ” μžˆμ§€λ§Œ, 기쑴에 μ‘΄μž¬ν•˜λŠ” κΈ°λŠ₯을 μž¬μ •μ˜ν•  μˆ˜λŠ” μ—†λ‹€.

 

 

<<클래슀의 상속과 μ΅μŠ€ν…μ…˜ 비ꡐ>>

 

이 λ‘˜μ€ λΉ„μŠ·ν•΄λ³΄μ΄μ§€λ§Œ μ‹€μ œ 성격은 많이 λ‹€λ₯΄λ‹€.

클래슀의 상속은 클래슀 νƒ€μž…μ—μ„œλ§Œ κ°€λŠ₯ν•˜μ§€λ§Œ μ΅μŠ€ν…μ…˜μ€ ꡬ쑰체, 클래슀, ν”„λ‘œν† μ½œ 등에 적용이 κ°€λŠ₯ν•˜λ‹€. 또 클래슀의 상속은 νŠΉμ • νƒ€μž…μ„ λ¬Όλ €λ°›μ•„ ν•˜λ‚˜μ˜ μƒˆλ‘œμš΄ νƒ€μž…μ„ μ •μ˜ν•˜κ³  μΆ”κ°€ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λŠ” 수직 ν™•μž₯μ΄μ§€λ§Œ, μ΅μŠ€ν…μ…˜μ€ 기쑴의 νƒ€μž…μ— κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” μˆ˜ν‰ ν™•μž₯이닀. 또, 상속을 λ°›μœΌλ©΄ κΈ°μ‘΄ κΈ°λŠ₯을 μž¬μ •μ˜ν•  수 μžˆμ§€λ§Œ, μ΅μŠ€ν…μ…˜μ€ μž¬μ •μ˜ν•  수 μ—†λ‹€λŠ” 것도 큰 차이 쀑 ν•˜λ‚˜μ΄λ‹€. 상황과 μš©λ„μ— 맞게 상속과 μ΅μŠ€ν…μ…˜μ„ μ„ νƒν•˜μ—¬ μ‚¬μš©ν•˜λ©΄ λœλ‹€.

  상속 μ΅μŠ€ν…μ…˜
ν™•μž₯ 수직 ν™•μž₯ μˆ˜ν‰ ν™•μž₯
μ‚¬μš© 클래슀 νƒ€μž… 클래슀, ꡬ쑰체, ν”„λ‘œν† μ½œ, μ œλ„€λ¦­ λ“± λͺ¨λ“  νƒ€μž…
μž¬μ •μ˜ κ°€λŠ₯ λΆˆκ°€λŠ₯

 

 

<< μ΅μŠ€ν…μ…˜ ν™œμš©>>

 

μ΅μŠ€ν…μ…˜μ„ μ‚¬μš©ν•˜λŠ” λŒ€μ‹  μ›λž˜ νƒ€μž…μ„ μ •μ˜ν•œ μ†ŒμŠ€μ— κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” 방법도 μžˆκ² μ§€λ§Œ, μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬λ‚˜ ν”„λ ˆμž„μ›Œν¬λ₯Ό κ°€μ Έλ‹€ 썼닀면 원본 μ†ŒμŠ€λ₯Ό μˆ˜μ •ν•˜μ§€ λͺ»ν•œλ‹€. 이처럼 μ™ΈλΆ€μ—μ„œ κ°€μ Έμ˜¨ νƒ€μž…μ— λ‚΄κ°€ μ›ν•˜λŠ” κΈ°λŠ₯을 μΆ”κ°€ν•˜κ³ μž ν•  λ•Œ μ΅μŠ€ν…μ…˜μ„ μ‚¬μš©ν•œλ‹€. λ”°λ‘œ 상속을 받지 μ•Šμ•„λ„ 되며, ꡬ쑰체와 μ—΄κ±°ν˜•μ—λ„ κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆμœΌλ―€λ‘œ μ΅μŠ€ν…μ…˜μ€ 맀우 νŽΈλ¦¬ν•œ κΈ°λŠ₯이닀.

μ΅μŠ€ν…μ…˜μ€ λͺ¨λ“  νƒ€μž…μ— μ μš©ν•  수 μžˆλ‹€. λͺ¨λ“  νƒ€μž…μ΄λΌ 함은 ꡬ쑰체, μ—΄κ±°ν˜•, 클래슀, ν”„λ‘œν† μ½œ, μ œλ„€λ¦­ νƒ€μž… 등을 λœ»ν•œλ‹€. 즉, μ΅μŠ€ν…μ…˜μ„ 톡해 λͺ¨λ“  νƒ€μž…μ— μ—°μ‚° ν”„λ‘œνΌν‹°, λ©”μ„œλ“œ, μ΄λ‹ˆμ…œλΌμ΄μ €, μ„œλΈŒμŠ€ν¬λ¦½νŠΈ, 쀑첩 데이터 νƒ€μž… 등을 μΆ”κ°€ν•  수 μžˆλ‹€. λ”λΆˆμ–΄ μ΅μŠ€ν…μ…˜μ€ ν”„λ‘œν† μ½œκ³Ό ν•¨κ»˜ μ‚¬μš©ν•˜λ©΄ ꡉμž₯히 κ°•λ ₯ν•œ κΈ°λŠ₯을 μ„ μ‚¬ν•œλ‹€. 이 λΆ€λΆ„κ³Ό κ΄€λ ¨ν•΄ ν”„λ‘œν† μ½œ 쀑심 ν”„λ‘œκ·Έλž˜λ°(Protocol Oriented Programming)에 λŒ€ν•΄ 더 μ•Œμ•„λ³΄λŠ” 것을 μΆ”μ²œν•œλ‹€.

 

 

 - μ •μ˜

  • extension ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ˜ν•œλ‹€.

 

extension ν™•μž₯ν•  νƒ€μž… 이름 {
    /* νƒ€μž…μ— 좔가될 μƒˆλ‘œμš΄ κΈ°λŠ₯ κ΅¬ν˜„ */
}

 

  • μ΅μŠ€ν…μ…˜μ€ 기쑴에 μ‘΄μž¬ν•˜λŠ” νƒ€μž…μ΄ μΆ”κ°€μ μœΌλ‘œ λ‹€λ₯Έ ν”„λ‘œν† μ½œμ„ 채택할 수 μžˆλ„λ‘ ν™•μž₯ν•  μˆ˜λ„ μžˆλ‹€. 이런 κ²½μš°μ—λŠ” ν΄λž˜μŠ€λ‚˜ κ΅¬μ‘°μ²΄μ—μ„œ μ‚¬μš©ν•˜λ˜ 것과 λ˜‘κ°™μ€ λ°©λ²•μœΌλ‘œ ν”„λ‘œν† μ½œ 이름을 λ‚˜μ—΄ν•΄μ€€λ‹€.
extension ν™•μž₯ν•  νƒ€μž… 이름: ν”„λ‘œν† μ½œ1, ν”„λ‘œν† μ½œ2, ν”„λ‘œν† μ½œ3... {
    /* ν”„λ‘œν† μ½œ μš”κ΅¬μ‚¬ν•­ κ΅¬ν˜„ */
}

 

μŠ€μœ„ν”„νŠΈ 라이브러리λ₯Ό μ‚΄νŽ΄λ³΄λ©΄ μ‹€μ œλ‘œ μ΅μŠ€ν…μ…˜μ΄ ꡉμž₯히 많이 μ‚¬μš©λ˜κ³  μžˆμŒμ„ μ•Œ 수 μžˆλ‹€.

Double νƒ€μž…μ—λŠ” μˆ˜λ§Žμ€ ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œ, μ΄λ‹ˆμ…œλΌμ΄μ €κ°€ μ •μ˜λ˜μ–΄ 있으며 μˆ˜λ§Žμ€ ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜κ³  μžˆμ„ 것이라고 μ˜ˆμƒλ˜μ§€λ§Œ, μ‹€μ œλ‘œ Double νƒ€μž…μ˜ μ •μ˜λ₯Ό μ‚΄νŽ΄λ³΄λ©΄ κ·Έ λͺ¨λ“ κ²ƒμ΄ λ‹€ μ •μ˜λ˜μ–΄ μžˆμ§€λŠ” μ•Šλ‹€. 그러면 Double νƒ€μž…이 μ±„νƒν•˜κ³  μ€€μˆ˜ν•΄μ•Ό ν•˜λŠ” μˆ˜λ§Žμ€ ν”„λ‘œν† μ½œμ€ μ–΄λ””λ‘œ κ°”μ„κΉŒ? μ–΄λ””μ—μ„œ μ±„νƒν•˜κ³  μ–΄λ””μ—μ„œ μ€€μˆ˜ν•˜λ„λ‘ μ •μ˜λ˜μ–΄ μžˆμ„κΉŒ? λ‹Ήμ—°νžˆ 닡은 μ΅μŠ€ν…μ…˜μ΄λ‹€. 이처럼 μŠ€μœ„ν”„νŠΈ ν‘œμ€€ 라이브러리 νƒ€μž…μ˜ κΈ°λŠ₯은 λŒ€λΆ€λΆ„ μ΅μŠ€ν…μ…˜μœΌλ‘œ κ΅¬ν˜„λ˜μ–΄ μžˆλ‹€. Double μ™Έμ—λ„ λ‹€λ₯Έ νƒ€μž…λ“€μ˜ μ •μ˜μ™€ μ΅μŠ€ν…μ…˜μ„ 찾아보면 더 λ§Žμ€ 예λ₯Ό 보싀 수 μžˆλ‹€.

 

- κ΅¬ν˜„

 

<<μ—°μ‚° ν”„λ‘œνΌν‹° μΆ”κ°€>>

  • μ•„λž˜ μ΅μŠ€ν…μ…˜μ€ Int νƒ€μž…에 두 개의 μ—°μ‚° ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•œ 것이닀.
  • Int νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€κ°€ ν™€μˆ˜μΈμ§€ μ§μˆ˜μΈμ§€ νŒλ³„ν•˜μ—¬ Boolνƒ€μž…μœΌλ‘œ μ•Œλ €μ£ΌλŠ” μ—°μ‚° ν”„λ‘œνΌν‹°μ΄λ‹€.
  • μ΅μŠ€ν…μ…˜μœΌλ‘œ Int νƒ€μž…에 μΆ”κ°€ν•΄μ€€ μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” Int νƒ€μž…μ˜ μ–΄λ–€ μΈμŠ€ν„΄μŠ€μ—λ„ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.
  • μΈμŠ€ν„΄μŠ€ μ—°μ‚° ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•  μˆ˜λ„ 있으며, static ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ νƒ€μž… μ—°μ‚° ν”„λ‘œνΌν‹°λ„ μΆ”κ°€ν•  수 μžˆλ‹€.

 

 

<<λ©”μ„œλ“œ μΆ”κ°€>>

  • λ©”μ„œλ“œ μ΅μŠ€ν…μ…˜μ„ 톡해 Int νƒ€μž…에 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμΈ multiply(by:) λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν–ˆλ‹€.
  • μ—¬λŸ¬ κΈ°λŠ₯을 μ—¬λŸ¬ μ΅μŠ€ν…μ…˜ λΈ”λ‘μœΌλ‘œ λ‚˜λˆ μ„œ κ΅¬ν˜„ν•΄λ„ μ „ν˜€ λ¬Έμ œκ°€ μ—†λ‹€.
  • κ΄€λ ¨λœ κΈ°λŠ₯λ³„λ‘œ ν•˜λ‚˜μ˜ μ΅μŠ€ν…μ…˜ 블둝에 λ¬Άμ–΄μ£ΌλŠ” 것도 μ’‹λ‹€.

 

<<μ΄λ‹ˆμ…œλΌμ΄μ € μΆ”κ°€>>

  • μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”(μ΄λ‹ˆμ…œλΌμ΄μ¦ˆ)ν•  λ•Œ μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™”μ— ν•„μš”ν•œ λ‹€μ–‘ν•œ 데이터λ₯Ό 전달받을 수 μžˆλ„λ‘ μ—¬λŸ¬ μ’…λ₯˜μ˜ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό λ§Œλ“€ 수 μžˆλ‹€. νƒ€μž…μ˜ μ •μ˜λΆ€μ— μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό μΆ”κ°€ν•˜μ§€ μ•Šλ”λΌλ„ μ΅μŠ€ν…μ…˜μ„ 톡해 μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€.
  • μ΅μŠ€ν…μ…˜μœΌλ‘œ 클래슀 νƒ€μž…μ— 편의 μ΄λ‹ˆμ…œλΌμ΄μ €λŠ” μΆ”κ°€ν•  수 μžˆμ§€λ§Œ, 지정 μ΄λ‹ˆμ…œλΌμ΄μ €λŠ” μΆ”κ°€ν•  수 μ—†λ‹€. 지정 μ΄λ‹ˆμ…œλΌμ΄μ €μ™€ λ””μ΄λ‹ˆμ…œλΌμ΄μ €λŠ” λ°˜λ“œμ‹œ 클래슀 νƒ€μž…μ˜ κ΅¬ν˜„λΆ€μ— μœ„μΉ˜ν•΄μ•Ό ν•œλ‹€(κ°’ νƒ€μž…μ€ 상관없닀).



** μ΅μŠ€ν…μ…˜ ν™œμš©ν•˜λ©΄ λ‹€μ–‘ν•˜κ³  κ°•λ ₯ν•œ κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆμ§€λ§Œ, ν•΄λ‹Ή νƒ€μž…μ— μ ν•©ν•œ μ΅μŠ€ν…μ…˜μ„ κ΅¬ν˜„ν•˜λ„λ‘ μ£Όμ˜ν•΄μ•Όν•œλ‹€.