개발/Android

Android 개발자λ₯Ό μœ„ν•œ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° Part 1

도리 🐟 2021. 4. 8. 23:33

μž‘μ„±μΌ: 2019.12.05


원문 Functional Programming for Android Developers — Part 1을 λ²ˆμ—­ν•œ κΈ€μž…λ‹ˆλ‹€.

이 μ‹œλ¦¬μ¦ˆμ—μ„œλŠ”, Functional Programming (FP)의 κΈ°μ΄ˆμ™€ μžλ°”(good old Java)와 μ½”ν‹€λ¦°(new awesome Kotlin)μ—μ„œ μ–΄λ–»κ²Œ μ“°λŠ”μ§€λ₯Ό 배우렀고 ν•©λ‹ˆλ‹€. μ΅œλŒ€ν•œ 이둠적인 μ „λ¬Έ μš©μ–΄λŠ” ν”Όν•΄μ„œ μ‹€μš©μ μΈ κ°œλ…μ„ λ‹€λ£¨κ² μŠ΅λ‹ˆλ‹€.

 

FPλŠ” 맀우 큰 μ£Όμ œλΌμ„œ Android μ½”λ“œμ—μ„œ μœ μš©ν•˜κ²Œ μ“Έ 수 μžˆλŠ” κ°œλ…κ³Ό 방법 μ •λ„λ§Œ 닀루렀고 ν•©λ‹ˆλ‹€. Androidμ—μ„œ μ‚¬μš©ν•  수 μ—†λŠ” κ°œλ…λ„ 쑰금 λ‚˜μ˜€κΈ΄ ν•˜κ² μ§€λ§Œ μ΅œλŒ€ν•œ κ΄€λ ¨μžˆλŠ” λ‚΄μš©λ§Œ 닀루도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

μ€€λΉ„λ˜μ…¨λ‚˜μš”? Let’s go!

Functional Programmingμ΄λž€ 무엇이고, μ™œ μ‚¬μš©ν•΄μ•Ό ν•˜λ‚˜μš”?

쒋은 μ§ˆλ¬Έμž…λ‹ˆλ‹€. Functional Programmingμ΄λΌλŠ” μš©μ–΄λŠ” 넓은 λ²”μœ„μ˜ ν”„λ‘œκ·Έλž˜λ° κ°œλ…μ„ λ‹΄κ³  μžˆμŠ΅λ‹ˆλ‹€. κ·Έ 핡심은 ν”„λ‘œκ·Έλž¨μ„ μˆ˜ν•™μ  ν•¨μˆ˜μ˜ κ³„μ‚°μœΌλ‘œ 닀루고 mutable μƒνƒœμ™€ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλ₯Ό λ°©μ§€ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€(μ•žμœΌλ‘œ μΆ©λΆ„νžˆ λ‹€λ£¨κ²Œ 될 λ‚΄μš©μž…λ‹ˆλ‹€).

FPκ°€ ν•΅μ‹¬μ μœΌλ‘œ κ°•μ‘°ν•˜λŠ” λ‚΄μš©μ€:

  • 선언적 μ½”λ“œ : ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” what에 λŒ€ν•΄ 신경써야 ν•˜κ³ , μ»΄νŒŒμΌλŸ¬μ™€ λŸ°νƒ€μž„μ΄ how에 λŒ€ν•΄ 신경쓰도둝 ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • λͺ…ν™•μ„± : μ½”λ“œλŠ” μ΅œλŒ€ν•œ μ΄ν•΄ν•˜κΈ° μ‰¬μ›Œμ•Ό ν•©λ‹ˆλ‹€. 특히, μ˜ˆμƒμΉ˜ λͺ»ν•œ 이슈λ₯Ό λ°©μ§€ν•˜λ €λ©΄ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλŠ” λΆ„λ¦¬λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. 데이터 ν”Œλ‘œμš°μ™€ μ—λŸ¬ 핸듀링은 λͺ…μ‹œμ μ΄μ–΄μ•Ό ν•˜κ³  GOTO와 Exception같은 κ΅¬μ‘°λŠ” 앱이 μ˜λ„ν•˜μ§€ μ•Šμ€ μƒνƒœκ°€ 될 수 있기 λ•Œλ¬Έμ— 지양해야 ν•©λ‹ˆλ‹€.
  • λ™μ‹œμ„± : ν•¨μˆ˜μ  μˆœμˆ˜μ„±(functional purity)μ΄λΌλŠ” κ°œλ…λ•Œλ¬Έμ— κ°€μž₯ ν•¨μˆ˜μ μΈ(functional) μ½”λ“œλŠ” 기본적으둜 λ™μ‹œμ„±μ„ κ°–μŠ΅λ‹ˆλ‹€. 이런 νŠΉμ„±μ΄ FP의 인기λ₯Ό 높이고 μžˆμŠ΅λ‹ˆλ‹€. CPU μ½”μ–΄κ°€ μ‚¬μš©λ˜λŠ” κ²ƒλ§ŒνΌ 맀년 λΉ¨λΌμ§€μ§€λŠ” μ•Šκ³ , λ©€ν‹° μ½”μ–΄ μ•„ν‚€ν…μ²˜μ˜ μž₯점을 κ°–κΈ° μœ„ν•΄ ν”„λ‘œκ·Έλž¨μ„ 더 concurrentν•˜κ²Œ λ§Œλ“€μ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
  • Higher Order Functions : ν•¨μˆ˜λŠ” λ‹€λ₯Έ μ–Έμ–΄μ˜ primitive처럼 첫번째 클래슀 λ©€λ²„μž…λ‹ˆλ‹€. Stringμ΄λ‚˜ int처럼 ν•¨μˆ˜λ₯Ό 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λΆˆλ³€μ„±(Immutability) : λ³€μˆ˜λŠ” ν•œ 번 μ΄ˆκΈ°ν™”λœ ν›„ μˆ˜μ •λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•œ λ³€μˆ˜κ°€ μƒμ„±λ˜λ©΄, μ˜μ›νžˆ λ°”λ€Œμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 변경을 μ›ν•œλ‹€λ©΄, μƒˆλ‘œ 생성해야 ν•©λ‹ˆλ‹€. 이것이 λͺ…μ‹œμ„±κ³Ό μ‚¬μ΄λ“œ μ΄νŽ™νŠΈ λ°©μ§€μ˜ 또 λ‹€λ₯Έ μΈ‘λ©΄μž…λ‹ˆλ‹€. μ–΄λ–€ 값이 λ³€ν™”ν•  수 μ—†λ‹€λŠ” νŠΉμ„±μ„ μ•Œλ©΄, κ·Έ 값을 μ‚¬μš©ν•  λ•Œ κ±±μ •ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€.

선언적, λͺ…μ‹œμ μ΄κ³  concurrentν•œ μ½”λ“œλŠ” μ½”λ“œ νŒŒμ•… 및 예기치 λͺ»ν•œ 상황을 ν”Όν•˜κΈ° μœ„ν•œ 섀계가 더 쉽지 μ•Šμ„κΉŒμš”?

 

첫번째 νŒŒνŠΈμ—μ„œλŠ” FPμ—μ„œ κ°€μž₯ 기본적인 κ°œλ…λΆ€ν„° μ‹œμž‘ν•©λ‹ˆλ‹€: Purity, Side effects, Ordering.

Pure functions

ν•¨μˆ˜μ˜ κ²°κ³Όκ°€ μž…λ ₯μ—λ§Œ μ˜μ‘΄ν•˜κ³  μ‚¬μ΄λ“œ μ΄νŽ™νŠΈκ°€ 없을 λ•Œ(μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλŠ” λ°”λ‘œ λ‹€μŒμ— λ‹€λ£Ήλ‹ˆλ‹€) κ·Έ ν•¨μˆ˜λŠ” 순수(pure)ν•˜λ‹€κ³  ν•©λ‹ˆλ‹€. μ˜ˆμ‹œλ₯Ό λ³ΌκΉŒμš”?

이 κ°„λ‹¨ν•œ ν•¨μˆ˜λŠ” 두 수λ₯Ό λ”ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. 숫자 ν•˜λ‚˜λŠ” νŒŒμΌμ—μ„œ 읽고, λ‹€λ₯Έ μˆ«μžλŠ” νŒŒλΌλ―Έν„°λ‘œ μ „λ‹¬λ©λ‹ˆλ‹€.

 

Java

int add(int x) {
    int y = readNumFromFile();
    return x + y;
}

Kotlin

fun add(x: Int): Int {
    val y: Int = readNumFromFile()
    return x + y
}

이 ν•¨μˆ˜μ˜ κ²°κ³ΌλŠ” μž…λ ₯μ—λ§Œ μ˜μ‘΄ν•˜κ³  μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. readNumFromFile()의 결과에도 μ˜μ‘΄ν•˜κ³  μžˆμ–΄μ„œ, xκ°€ 같아도 λ‹€λ₯Έ κ²°κ³Όκ°€ λ‚˜μ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€. 이런 ν•¨μˆ˜κ°€ λΉ„μˆœμˆ˜(impure)ν•¨μˆ˜μž…λ‹ˆλ‹€.

 

그럼 이 ν•¨μˆ˜λ₯Ό 순수 ν•¨μˆ˜λ‘œ μˆ˜μ •ν•΄λ΄…μ‹œλ‹€.

Java

int add(int x, int y) {
    return x + y;
}

Kotlin

fun add(x: Int, y: Int): Int {
    return x + y
}

이제 ν•¨μˆ˜μ˜ κ²°κ³ΌλŠ” μž…λ ₯μ—λ§Œ μ˜μ‘΄μ μž…λ‹ˆλ‹€. 주어진 x와 y에 λŒ€ν•΄ ν•¨μˆ˜λŠ” 항상 같은 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•  κ²ƒμž…λ‹ˆλ‹€. 이제 이 ν•¨μˆ˜λŠ” μˆœμˆ˜ν•¨μˆ˜λΌκ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μˆ˜ν•™μ—μ„œμ˜ ν•¨μˆ˜ λ˜ν•œ 같은 λ°©μ‹μž…λ‹ˆλ‹€. μˆ˜ν•™μ  ν•¨μˆ˜μ˜ κ²°κ³ΌλŠ” μž…λ ₯μ—λ§Œ μ˜μ‘΄μ μž…λ‹ˆλ‹€γ…‘κ·Έλž˜μ„œ FPλŠ” 일반적으둜 μš°λ¦¬κ°€ μ‚¬μš©ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° μŠ€νƒ€μΌλ³΄λ‹€λŠ” μˆ˜ν•™μ— 더 κ°€κΉμŠ΅λ‹ˆλ‹€.

 

P.S. 빈 μž…λ ₯값도 μž…λ ₯μž…λ‹ˆλ‹€. ν•¨μˆ˜μ— μž…λ ₯값이 μ—†μœΌλ©΄μ„œ 항상 같은 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€λ©΄, 그것 λ˜ν•œ 순수 ν•¨μˆ˜μž…λ‹ˆλ‹€.

 

P.P.S. 주어진 μž…λ ₯에 λŒ€ν•΄ 항상 같은 κ²°κ³Όλ₯Ό λ‚΄λŠ” νŠΉμ„±μ€ μ°Έμ‘° 투λͺ…μ„±(referential transparency)이라고 ν•˜λ©°, μ•„λ§ˆ 순수 ν•¨μˆ˜μ— λŒ€ν•œ μ„€λͺ…을 λ³Ό λ•Œ λ³Έ 적이 μžˆλŠ” μš©μ–΄μΌ κ²λ‹ˆλ‹€.

 

Side effects

같은 λ§μ…ˆ ν•¨μˆ˜λ‘œ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈ κ°œλ…μ— λŒ€ν•΄ μ‚΄νŽ΄λ΄…μ‹œλ‹€. κ²°κ³Όλ₯Ό νŒŒμΌμ— μ“°λŠ” κ²ƒμœΌλ‘œ λ°”κΏ”λ³΄κ² μŠ΅λ‹ˆλ‹€.

Java

int add(int x, int y) {
    int result = x + y;
    writeResultToFile(result);
    return result;
}

Kotlin

fun add(x: Int, y: Int): Int {
    val result = x + y
    writeResultToFile(result)
    return result
}

이 ν•¨μˆ˜λŠ” 이제 계산 κ²°κ³Όλ₯Ό νŒŒμΌμ— μ“°κ³  μžˆμŠ΅λ‹ˆλ‹€. 즉, ν•¨μˆ˜ λ°–μ˜ μƒνƒœλ₯Ό λ°”κΎΈκΈ° μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” 이제 μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλ₯Ό 가지고, 더 이상 순수 ν•¨μˆ˜λ„ μ•„λ‹™λ‹ˆλ‹€.

 

λ²”μœ„ λ°–μ˜ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” λͺ¨λ“  μ½”λ“œ—β€Šλ³€μˆ˜ μˆ˜μ •, 파일 μ“°κΈ°, DB μ €μž₯, 무언가 μ‚­μ œ λ“±β€Š—λŠ” λͺ¨λ‘ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλ₯Ό κ°–λŠ”λ‹€κ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

FPμ—μ„œλŠ” μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλ₯Ό κ°–λŠ” ν•¨μˆ˜λŠ” 더 이상 순수 ν•¨μˆ˜κ°€ μ•„λ‹ˆκ³ , μ΄μ „ μ»¨ν…μŠ€νŠΈμ— 의쑴적이기 λ•Œλ¬Έμ— 지양 λŒ€μƒμž…λ‹ˆλ‹€. μ½”λ“œμ˜ μ»¨ν…μŠ€νŠΈλŠ” 슀슀둜 갖지 μ•Šμ•„μ„œ μΆ”λ‘ ν•˜κΈ°κ°€ 더 μ–΄λ ΅μŠ΅λ‹ˆλ‹€.

 

μΊμ‹œλ₯Ό λ°”λΌλ³΄λŠ” μ½”λ“œμ˜ 일뢀λ₯Ό μž‘μ„±ν•œλ‹€κ³  κ°€μ •ν•΄λ³΄μ„Έμš”. κ·Έ μ½”λ“œλŠ” λˆ„κ΅°κ°€ μΊμ‹œμ— μΌλŠ”μ§€, 무엇을 μΌλŠ”μ§€, μ–Έμ œ μΌλŠ”μ§€, κ·Έ 데이터가 μœ νš¨ν•œμ§€ 등에 μ˜μ‘΄ν•˜κ²Œ λ©λ‹ˆλ‹€. μΊμ‹œμ˜ λͺ¨λ“  μƒνƒœλ₯Ό μ΄ν•΄ν•˜μ§€ μ•Šκ³ μ„œλŠ” ν”„λ‘œκ·Έλž¨μ΄ 무엇을 ν•˜κ³  μžˆλŠ”μ§€ 이해할 수 μ—†μŠ΅λ‹ˆλ‹€. λ§Œμ•½ 이걸 더 ν™•μž₯ν•΄μ„œ λ‹€λ₯Έ κ²½μš°λ“€β€Š—β€Šλ„€νŠΈμ›Œν¬, DB, 파일, μ‚¬μš©μž μž…λ ₯ 등ㅑ에 의쑴적인 앱을 λ§Œλ“ λ‹€λ©΄, μ •ν™•νžˆ μ–΄λ–»κ²Œ λ™μž‘ν•˜κ³  μžˆλŠ”μ§€ μ•ŒκΈ° νž˜λ“€κ³  λͺ¨λ“  뢀뢄을 ν•œ λ²ˆμ— μ΄ν•΄ν•˜κΈ°λ„ νž˜λ“€μ–΄ μ§‘λ‹ˆλ‹€.

 

그럼 이 말이 λ„€νŠΈμ›Œν¬, λ°μ΄ν„°λ² μ΄μŠ€, μΊμ‹œκ°™μ€ κ±Έ 쓰지 λ§λΌλŠ” κ±ΈκΉŒμš”? λ‹Ήμ—°νžˆ μ•„λ‹™λ‹ˆλ‹€. 보톡 μ½”λ“œμ˜ 싀행이 끝났을 λ•Œ μ–΄λ–€ λ™μž‘μ΄ μ™„λ£Œλ˜λŠ” 것이 λͺ©μ μΌν…λ° Android μ•±μ˜ 경우, 보톡 UI μ—…λ°μ΄νŠΈλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

 

FP의 μ£Όμš” κ°œλ…μ€ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλ₯Ό μ™„μ „νžˆ μ—†μ• μžλŠ” 게 μ•„λ‹ˆλΌ, ν¬ν•¨ν•˜μ§€λ§Œ λΆ„λ¦¬μ‹œν‚€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλ₯Ό κ°–λŠ” ν•¨μˆ˜λ“€λ‘œ μ½”λ“œλ₯Ό λ”λŸ½νžˆκΈ° λ³΄λ‹€λŠ”, μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλ₯Ό μ‹œμŠ€ν…œμ˜ κ΅¬μ„μœΌλ‘œ λͺ°μ•„λ†”μ„œ μ΅œμ†Œν•œμ˜ 영ν–₯만 κ°–κ³ , νŒŒμ•…ν•˜κΈ° 더 μ‰¬μ›Œμ§€λ„λ‘ ν•˜λŠ” κ²λ‹ˆλ‹€. 이 뢀뢄에 λŒ€ν•΄μ„œλŠ” λ‹€μŒ νŒŒνŠΈμ—μ„œ functional architectureλ₯Ό 더 μžμ„Ένžˆ μ•Œμ•„λ³Ό κ²ƒμž…λ‹ˆλ‹€.

Ordering

μ‚¬μ΄λ“œ μ΄νŽ™νŠΈκ°€ μ—†λŠ” 순수 ν•¨μˆ˜μ˜ λ¬ΆμŒμ„ 가지고 있으면, ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λŠ” μˆœμ„œλŠ” 상관 μ—†μ–΄μ§‘λ‹ˆλ‹€.

 

λ‚΄λΆ€μ μœΌλ‘œ 3개의 순수 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜ ν•˜λ‚˜λ₯Ό κ°€μ •ν•΄λ΄…μ‹œλ‹€:

Java

void doThings() {
    doThing1();
    doThing2();
    doThing3();
}

Kotlin

fun doThings() {
    doThing1()
    doThing2()
    doThing3()
}

이 ν•¨μˆ˜λ“€μ΄ (ν•œ ν•¨μˆ˜μ˜ κ²°κ³Όκ°€ λ‹€λ₯Έ ν•¨μˆ˜μ˜ μž…λ ₯이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ—) μ„œλ‘œ 독립적이고, (μˆœμˆ˜ν•¨μˆ˜μ΄κΈ° λ•Œλ¬Έμ—) μ‹œμŠ€ν…œμ˜ μ–΄λ–€ 것도 바꾸지 μ•ŠλŠ”λ‹€λŠ” 것이 λΆ„λͺ…νžˆ 보일 κ²ƒμž…λ‹ˆλ‹€. 이것은 이 ν•¨μˆ˜λ“€μ΄ μ‹€ν–‰λ˜λŠ” μˆœμ„œκ°€ μ™„μ „νžˆ λ°”λ€” 수 있게 ν•΄μ€λ‹ˆλ‹€.

 

독립적인 순수 ν•¨μˆ˜λ“€μ΄κΈ° λ•Œλ¬Έμ— μ‹€ν–‰ μˆœμ„œλŠ” λ‹€μ‹œ μ„žμ΄κ³  μ΅œμ ν™”λ  수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ doThing2()의 μž…λ ₯값이 doThing1()의 결과값이 되면, 이 두 ν•¨μˆ˜λŠ” μˆœμ„œλŒ€λ‘œ μ‹€ν–‰λ˜μ–΄μ•Ό ν•˜μ§€λ§Œ doThing3()λŠ” doThing1() μ‹€ν–‰ μ „μœΌλ‘œ μ—¬μ „νžˆ 재배치 κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

이런 μˆœμ„œ νŠΉμ„±μ€ μ–΄λ–€ μž₯점을 μ€„κΉŒμš”? λ°”λ‘œ Concurrency! μˆœμ„œκ°€ μ„žμ΄λŠ” 것에 λŒ€ν•œ 걱정없이 이 ν•¨μˆ˜λ“€μ„ 3개의 별도 CPU μ½”μ–΄μ—μ„œ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€!

 

λŒ€λΆ€λΆ„ ν–₯μƒλœ 순수 ν•¨μˆ˜ν˜• μ–Έμ–΄(예, Haskell)의 μ»΄νŒŒμΌλŸ¬λŠ” 보톡 μ½”λ“œλ₯Ό λΆ„μ„ν•˜μ—¬ concurrent인지 μ•„λ‹Œμ§€ μ•Œλ €μ£Όκ³ , deadlocks, race conditions 같은 κ²½μš°μ—λŠ” λ°”λ‘œ μ•Œ 수 있게 μ€‘μ§€μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ 이런 μ»΄νŒŒμΌλŸ¬λ“€μ€ 이둠상 μ½”λ“œλ₯Ό μžλ™μœΌλ‘œ 병렬화할 수 μžˆμŠ΅λ‹ˆλ‹€(이건 사싀 μ œκ°€ μ•„λŠ” μ–΄λ–€ μ»΄νŒŒμΌλŸ¬μ—λ„ μ‘΄μž¬ν•˜μ§€ μ•Šμ§€λ§Œ 연ꡬ μ§„ν–‰μ€‘μž…λ‹ˆλ‹€).

 

μ—¬λŸ¬λΆ„μ˜ μ»΄νŒŒμΌλŸ¬κ°€ 이런 점을 κ²€μ‚¬ν•˜μ§€ μ•Šλ”λΌλ„, ν•¨μˆ˜ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό 보고 μ½”λ“œκ°€ concurrent인지 μ•„λ‹Œμ§€ νŒŒμ•…ν•  수 있고, μˆ¨κ²¨μ§„ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλ‘œ κ°€λ“ν•œ μ½”λ“œλ₯Ό λ³‘λ ¬ν™”ν•˜λ„λ‘ λ…Έλ ₯ν•˜λ©΄ μ€‘μ²©λœ μŠ€λ ˆλ”© 버그λ₯Ό 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

Summary

첫번째 νŒŒνŠΈκ°€ FP에 λŒ€ν•œ μ—¬λŸ¬λΆ„μ˜ ν₯λ―Έλ₯Ό 끌 수 μžˆμ—ˆμœΌλ©΄ μ’‹κ² μŠ΅λ‹ˆλ‹€. μˆœμˆ˜ν•¨μˆ˜μ΄λ©΄μ„œ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈκ°€ μ—†λŠ” ν•¨μˆ˜λŠ” μ½”λ“œλ₯Ό νŒŒμ•…ν•˜κΈ° 더 μ‰½κ²Œ λ§Œλ“€κ³ , concurrencyλ₯Ό λ‹¬μ„±ν•˜κΈ° μœ„ν•œ 첫 κ±ΈμŒμž…λ‹ˆλ‹€.

concurrency에 λŒ€ν•΄ 배우기 전에, immutability에 λŒ€ν•΄ μ•Œμ•„μ•Ό ν•©λ‹ˆλ‹€. Part 2μ—μ„œ μˆœμˆ˜ν•¨μˆ˜μ™€ immutabilityκ°€ μ–Όλ§ˆλ‚˜ κ°„λ‹¨ν•˜κ³  lockκ³Ό mutex μ €μž₯없이 concurrent μ½”λ“œλ₯Ό μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ μž‘μ„±ν•˜λŠ” 데 도움이 λ˜λŠ”μ§€ μ•Œμ•„λ³Ό κ²ƒμž…λ‹ˆλ‹€.