Home > CS > 2024 > πŸ’Ύ [CS] ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Function Programming, FP)μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?

πŸ’Ύ [CS] ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Function Programming, FP)μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?
CS

πŸ’Ύ [CS] ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Function Programming, FP)μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?

  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Function Programming, FP)은 ν•¨μˆ˜λ₯Ό κΈ°λ³Έ ꡬ성 μš”μ†Œλ‘œ μ‚¬μš©ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μž…λ‹ˆλ‹€.
  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Function Programming, FP)μ—μ„œλŠ” 순수 ν•¨μˆ˜μ™€ λ°μ΄ν„°μ˜ λΆˆλ³€μ„±μ„ κ°•μ‘°ν•˜λ©°, λΆ€μž‘μš©(Side Effect)을 ν”Όν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 μ½”λ“œμ˜ 가독성, μœ μ§€λ³΄μˆ˜μ„±, μž¬μ‚¬μš©μ„±μ„ 높이고, 병렬 μ²˜λ¦¬μ™€ 같은 μƒν™©μ—μ„œλ„ μ•ˆμ •μ μ΄κ³  예츑 κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

1️⃣ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Function Programming, FP)의 핡심 κ°œλ….

1️⃣ 순수 ν•¨μˆ˜(Pure Function)

  • 순수 ν•¨μˆ˜(Pure Function)λŠ” μž…λ ₯값이 κ°™μœΌλ©΄ 항상 같은 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.
    • ν•¨μˆ˜μ˜ 좜λ ₯이 μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜μ§€ μ•Šκ³ , ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜μ§€λ„ μ•ŠμŠ΅λ‹ˆλ‹€.
  • 순수 ν•¨μˆ˜(Pure Function)λŠ” λΆ€μž‘μš©(Side Effect)이 μ—†κΈ° λ•Œλ¬Έμ—, ν…ŒμŠ€νŠΈν•˜κΈ° 쉽고, ν•¨μˆ˜μ˜ λ™μž‘μ„ μ˜ˆμΈ‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ‘‰ μ˜ˆμ‹œ.

// 순수 ν•¨μˆ˜ μ˜ˆμ‹œ
public int add(int a, int b) {
    return a + b; // μž…λ ₯값이 κ°™μœΌλ©΄ 항상 같은 κ²°κ³Όλ₯Ό λ°˜ν™˜
}

2️⃣ λΆˆλ³€μ„±(Immutability)

  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” λ°μ΄ν„°μ˜ λΆˆλ³€μ„±μ„ μ€‘μš”ν•˜κ²Œ μƒκ°ν•©λ‹ˆλ‹€.
    • 즉, 데이터가 μƒμ„±λœ ν›„μ—λŠ” λ³€κ²½λ˜μ§€ μ•Šμ•„μ•Ό ν•˜λ©°, ν•„μš”ν•˜λ©΄ μƒˆλ‘œμš΄ 데이터λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  • λΆˆλ³€μ„±μ€ μ½”λ“œμ˜ μ•ˆμ •μ„±μ„ 높이고, λ™μ‹œμ„± 문제λ₯Ό ν”Όν•  수 있게 ν•΄μ€λ‹ˆλ‹€.

πŸ‘‰ μ˜ˆμ‹œ.

// Javaμ—μ„œμ˜ λΆˆλ³€ 객체
final String name = "Kobe"; // name은 λ³€κ²½ν•  수 μ—†λŠ” κ°’

πŸ“ λ™μ‹œμ„± 문제(Concurrency Issue)

μ—¬λŸ¬ μž‘μ—…μ΄ λ™μ‹œμ— 싀행될 λ•Œ λ°œμƒν•  수 μžˆλŠ” 였λ₯˜λ‚˜ 비정상적인 λ™μž‘μ„ λ§ν•©λ‹ˆλ‹€.
ν”„λ‘œκ·Έλž¨μ—μ„œ μ—¬λŸ¬ μŠ€λ ˆλ“œλ‚˜ ν”„λ‘œμ„ΈμŠ€κ°€ λ™μ‹œμ— λ™μΌν•œ λ°μ΄ν„°λ‚˜ μžμ›μ— μ ‘κ·Όν•˜κ³  μˆ˜μ •ν•˜λ €κ³  ν•  λ•Œ λ™μ‹œμ„± 문제(Concurrency Issue)κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
특히 λ°μ΄ν„°μ˜ 일관성과 μ•ˆμ •μ„±μ„ μœ μ§€ν•˜λŠ” 것이 μ–΄λ €μ›Œμ§€λ©°, μ΄λŠ” ν”„λ‘œκ·Έλž¨μ˜ 버그, 좩돌, μ˜ˆμΈ‘ν•˜μ§€ λͺ»ν•œ λ™μž‘μ„ μ΄ˆλž˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“ μŠ€λ ˆλ“œ(Thread)

ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ‹€ν–‰λ˜λŠ” κ°€μž₯ μž‘μ€ λ‹¨μœ„μ˜ μž‘μ—… 흐름을 μ˜λ―Έν•©λ‹ˆλ‹€.
ν”„λ‘œμ„ΈμŠ€κ°€ λ©”λͺ¨λ¦¬, 파일 ν•Έλ“€, λ„€νŠΈμ›Œν¬ μ—°κ²°κ³Ό 같은 λ¦¬μ†ŒμŠ€λ₯Ό ν¬ν•¨ν•˜λŠ” 독립적인 μ‹€ν–‰ λ‹¨μœ„λΌλ©΄, μŠ€λ ˆλ“œ(Thread)λŠ” ν”„λ‘œμ„ΈμŠ€ λ‚΄λΆ€μ—μ„œ μ‹€μ œλ‘œ μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” μ‹€ν–‰ νλ¦„μž…λ‹ˆλ‹€.
ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€λŠ” μ—¬λŸ¬ 개의 μŠ€λ ˆλ“œ(Thread)λ₯Ό 포함할 수 있으며, 각 μŠ€λ ˆλ“œ(Thread)λŠ” λ…λ¦½μ μœΌλ‘œ 싀행될 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“ ν”„λ‘œμ„ΈμŠ€(Process)

μ»΄ν“¨ν„°μ—μ„œ μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ§ν•©λ‹ˆλ‹€.
κ°„λ‹¨νžˆ 말해, ν”„λ‘œκ·Έλž¨μ΄ λ©”λͺ¨λ¦¬μ—μ„œ 싀행될 λ•Œ ν”„λ‘œμ„ΈμŠ€(Process)κ°€ λ©λ‹ˆλ‹€.
μ»΄ν“¨ν„°μ—μ„œ μ‹€ν–‰λ˜λŠ” λͺ¨λ“  μ‘μš© ν”„λ‘œκ·Έλž¨(예: μ›Ή λΈŒλΌμš°μ €, ν…μŠ€νŠΈ νŽΈμ§‘κΈ°, λ°±κ·ΈλΌμš΄λ“œ μ„œλΉ„μŠ€ λ“±)은 각각 ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€(Process)μž…λ‹ˆλ‹€.

3️⃣ κ³ μ°¨ ν•¨μˆ˜(Higher-Order Function)

  • κ³ μ°¨ ν•¨μˆ˜(Higher-Order Function)λŠ” λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό 인자둜 λ°›κ±°λ‚˜, 결과둜 ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 ν•¨μˆ˜λ₯Ό μ‘°ν•©ν•˜κ±°λ‚˜, λ™μ μœΌλ‘œ ν•¨μˆ˜λ₯Ό 생성할 수 있으며, μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ‘‰ μ˜ˆμ‹œ.

public static void main(String[] args) {
    Function<Integer, Integer> square = X -> X * X;
    System.out.println(applyFunction(square, 5)); // 25 좜λ ₯
}

public static int applyFunction(Function<Integer, Integer> func, int value) {
    return func.apply(value);
}

4️⃣ 일급 μ‹œλ―Ό(First-Class Citizen)

  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” ν•¨μˆ˜κ°€ 일급 μ‹œλ―Ό(First-Class Citizen)으둜 μ·¨κΈ‰λ©λ‹ˆλ‹€.
    • μ΄λŠ” ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•˜κ±°λ‚˜, ν•¨μˆ˜μ˜ 인자둜 μ „λ‹¬ν•˜κ±°λ‚˜, ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • ν•¨μˆ˜κ°€ λ‹€λ₯Έ 데이터 νƒ€μž…(숫자, λ¬Έμžμ—΄ λ“±)처럼 μ·¨κΈ‰λ˜κΈ° λ•Œλ¬Έμ— λ™μ μœΌλ‘œ ν•¨μˆ˜μ˜ 행동을 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“ 일급 μ‹œλ―Ό(First-Class Citizen, λ˜λŠ” First-Class Object)

ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ λ³€μˆ˜λ‚˜ ν•¨μˆ˜κ°€ λ‹€λ₯Έ 데이터 νƒ€μž…κ³Ό λ™μΌν•˜κ²Œ μ·¨κΈ‰λ˜κ³ , 자유둭게 μ‚¬μš©ν•  수 μžˆλŠ” 객체λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
일급 μ‹œλ―Ό(First-Class Citizen λ˜λŠ” First-Class Object)으둜 κ°„μ£Όλ˜λŠ” κ°œμ²΄λŠ” λ³€μˆ˜μ— ν• λ‹Ήλ˜κ±°λ‚˜, ν•¨μˆ˜μ˜ 인자(Arguments)둜 μ „λ‹¬λ˜κ±°λ‚˜, ν•¨μˆ˜μ˜ λ°˜ν™˜ κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλŠ” λ“± λ‹€μ–‘ν•œ λ°©μ‹μœΌλ‘œ ν™œμš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

이 κ°œλ…μ€ 주둜 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Function Programming, FP)μ—μ„œ μ‚¬μš©λ˜λ©°, 특히 ν•¨μˆ˜λ₯Ό 일급 μ‹œλ―Ό(First-Class Citizen λ˜λŠ” First-Class Object)으둜 μ·¨κΈ‰ν•  수 μžˆλŠ”μ§€ μ—¬λΆ€κ°€ κ·Έ μ–Έμ–΄μ˜ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Function Programming, FP) 지원 μˆ˜μ€€μ„ κ²°μ •ν•˜λŠ” μ€‘μš”ν•œ μš”μ†Œκ°€ λ©λ‹ˆλ‹€.

5️⃣ λΆ€μž‘μš©(Side Effects) μ—†λŠ” μ½”λ“œ.

  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Function Programming, FP)μ—μ„œλŠ” ν•¨μˆ˜κ°€ λΆ€μž‘μš©(Side Effect)을 μΌμœΌν‚€μ§€ μ•Šλ„λ‘ μž‘μ„±ν•©λ‹ˆλ‹€.
    • λΆ€μž‘μš©(Side Effects)μ΄λž€ ν•¨μˆ˜κ°€ μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜κ±°λ‚˜, μž…μΆœλ ₯ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€.
  • λΆ€μž‘μš©(Side Effects)이 μ—†κΈ° λ•Œλ¬Έμ—, μ½”λ“œμ˜ 예츑 κ°€λŠ₯μ„±κ³Ό μž¬μ‚¬μš©μ„±μ΄ λ†’μ•„μ§‘λ‹ˆλ‹€.

6️⃣ ν•¨μˆ˜ ν•©μ„±(Function Composition)

  • ν•¨μˆ˜ ν•©μ„±(Function Composition)은 μ—¬λŸ¬ ν•¨μˆ˜λ₯Ό κ²°ν•©ν•˜μ—¬ μƒˆλ‘œμš΄ ν•¨μˆ˜λ₯Ό λ§Œλ“œλŠ” 것을 λ§ν•©λ‹ˆλ‹€.
    • μž‘μ€ ν•¨μˆ˜λ“€μ„ μ‘°ν•©ν•˜μ—¬ λ³΅μž‘ν•œ 연산을 μ²˜λ¦¬ν•  수 있게 ν•©λ‹ˆλ‹€.
  • μ΄λŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ μž‘μ€ ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄, 더 큰 κΈ°λŠ₯을 κ΅¬ν˜„ν•  λ•Œ μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Function Programming, FP)의 νŠΉμ§•.

1️⃣ μ½”λ“œμ˜ 가독성과 μœ μ§€λ³΄μˆ˜μ„±.

  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Function Programming, FP)μ—μ„œλŠ” 짧고 κ°„κ²°ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 있으며, μ½”λ“œκ°€ λͺ…ν™•ν•˜κ³  읽기 μ‰¬μ›Œμ§‘λ‹ˆλ‹€.
    • 각 ν•¨μˆ˜κ°€ λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ—, λͺ¨λ“ˆν™”(Modularization)와 ν…ŒμŠ€νŠΈκ°€ μš©μ΄ν•©λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ λͺ¨λ“ˆν™”(Modularization)λž€ λ¬΄μ—‡μΌκΉŒμš”?

2️⃣ 병렬 μ²˜λ¦¬μ™€ λ™μ‹œμ„±.

  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Function Programmin, FP)의 λΆˆλ³€μ„± 덕뢄에, μ—¬λŸ¬ μŠ€λ ˆλ“œ(Thread)μ—μ„œ λ™μ‹œ μ‹€ν–‰ν•˜λ”λΌλ„ λ°μ΄ν„°μ˜ 일관성이 μœ μ§€λ©λ‹ˆλ‹€.
  • λ”°λΌμ„œ 병렬 처리λ₯Ό ν•  λ•Œ 데이터 κ²½ν•©(Race Condition) λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠμœΌλ©°, μ•ˆμ „ν•˜κ²Œ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“ 데이터 κ²½ν•© λ˜λŠ” 레이슀 μ»¨λ””μ…˜(Race Condition).

두 개 μ΄μƒμ˜ μŠ€λ ˆλ“œ(Thread) λ˜λŠ” ν”„λ‘œμ„ΈμŠ€(Process)κ°€ λ™μ‹œμ— 곡유 μžμ›μ— μ ‘κ·Όν•˜κ³ , κ·Έ κ²°κ³Όκ°€ μ‹€ν–‰ μˆœμ„œμ— 따라 λ‹¬λΌμ§€λŠ” 상황을 λ§ν•©λ‹ˆλ‹€.
즉, λ™μ‹œμ„± ν”„λ‘œκ·Έλž˜λ°(Concurrent Programming)μ—μ„œ μŠ€λ ˆλ“œλ“€μ΄ 경쟁적으둜 μžμ›μ— μ ‘κ·Όν•  λ•Œ λ°œμƒν•˜λŠ” 문제둜, ν”„λ‘œκ·Έλž¨μ˜ μ˜λ„μΉ˜ μ•Šμ€ κ²°κ³Όλ₯Ό μ΄ˆλž˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

레이슀 μ»¨λ””μ…˜(Race Condition)은 특히 곡유 μžμ›(λ³€μˆ˜, 데이터 ꡬ쑰, 파일 λ“±)에 λŒ€ν•΄ 읽기와 μ“°κΈ° μž‘μ—…μ΄ λ™μ‹œμ— μ΄λ£¨μ–΄μ§€λŠ” κ²½μš°μ— λ°œμƒν•˜λ©°, 동기화가 μ œλŒ€λ‘œ 이루어지지 μ•ŠμœΌλ©΄ λ°μ΄ν„°μ˜ 일관성이 κΉ¨μ§€κ²Œ λ©λ‹ˆλ‹€.

3️⃣ ν…ŒμŠ€νŠΈ μš©μ΄μ„±.

  • 순수 ν•¨μˆ˜(Pure Function)λŠ” μž…λ ₯κ°’κ³Ό 좜λ ₯κ°’μ˜ 관계가 λͺ…ν™•ν•˜κΈ° λ•Œλ¬Έμ— ν…ŒμŠ€νŠΈν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€.
    • λ˜ν•œ, λΆ€μž‘μš©μ΄ μ—†κΈ° λ•Œλ¬Έμ— λ…λ¦½μ μœΌλ‘œ ν…ŒμŠ€νŠΈν•  수 μžˆμ–΄ λ‹¨μœ„ ν…ŒμŠ€νŠΈ(Unit Testing)에 μ ν•©ν•©λ‹ˆλ‹€.

πŸ“ λ‹¨μœ„ ν…ŒμŠ€νŠΈ(Unit Testing)

μ†Œν”„νŠΈμ›¨μ–΄μ˜ κ°œλ³„ ꡬ성 μš”μ†Œ(ν•¨μˆ˜, λ©”μ„œλ“œ, 클래슀 λ“±)κ°€ μ˜¬λ°”λ₯΄κ²Œ λ™μž‘ν•˜λŠ”μ§€ κ²€μ¦ν•˜λŠ” ν…ŒμŠ€νŠΈ λ°©λ²•μž…λ‹ˆλ‹€.
λ‹¨μœ„ ν…ŒμŠ€νŠΈ(Unit Testing)의 λͺ©μ μ€ ν”„λ‘œκ·Έλž¨μ˜ κ°€μž₯ μž‘μ€ λ‹¨μœ„(λ‹¨μœ„, μœ λ‹›)κ°€ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
이λ₯Ό 톡해 각 ꡬ성 μš”μ†Œκ°€ λ…λ¦½μ μœΌλ‘œ μ •ν™•ν•˜κ²Œ λ™μž‘ν•˜λŠ”μ§€λ₯Ό 보μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ μ˜ˆμ‹œ (Java)

  • Java 8λΆ€ν„°λŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Function Programmig, FP) μŠ€νƒ€μΌμ„ μ§€μ›ν•˜κΈ° μœ„ν•΄ λžŒλ‹€ ν‘œν˜„μ‹(Lambda Expression)κ³Ό 슀트림(Stream) APIλ₯Ό λ„μž…ν–ˆμŠ΅λ‹ˆλ‹€.

πŸ“ λžŒλ‹€ ν‘œν˜„μ‹(Lambda Expression)

읡λͺ… ν•¨μˆ˜(Anonymous Function)둜, 이름이 μ—†λŠ” κ°„λ‹¨ν•œ ν•¨μˆ˜λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
λžŒλ‹€ ν‘œν˜„μ‹(Lambda Expression)을 μ‚¬μš©ν•˜λ©΄ ν•¨μˆ˜λ₯Ό 보닀 κ°„κ²°ν•˜κ³  μ§κ΄€μ μœΌλ‘œ μ •μ˜ν•  수 있으며, μ½”λ“œμ˜ 가독성을 높이고 κ°„λ‹¨ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 데 μœ μš©ν•©λ‹ˆλ‹€.
λžŒλ‹€ ν‘œν˜„μ‹(Lambda Function)은 주둜 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Function Programming, FP) μŠ€νƒ€μΌμ„ μ§€μ›ν•˜κΈ° μœ„ν•΄ λ„μž…λ˜μ—ˆμœΌλ©°, Java 8λΆ€μ²˜ Javaμ—μ„œλ„ μ‚¬μš©ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ Java Streamμ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?

1️⃣ λžŒλ‹€ ν‘œν˜„μ‹(Lambda Expression)

  • λžŒλ‹€ ν‘œν˜„μ‹(Lambda Expression)을 μ‚¬μš©ν•˜λ©΄ κ°„κ²°ν•˜κ²Œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
// κΈ°μ‘΄ 방식
public int add(int a, int b) {
    return a + b;
}

// λžŒλ‹€ ν‘œν˜„μ‹
BinaryOperator<Integer> add = (a, b) -> a + b;
System.out.println(add.apply(3,4)); // 7 좜λ ₯

2️⃣ 슀트림(Stream) API

  • μŠ€νŠΈλ¦Όμ€ μ»¬λ ‰μ…˜μ˜ 데이터λ₯Ό 필터링, λ³€ν™˜, μ •λ ¬, 집계할 수 μžˆλŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° μŠ€νƒ€μΌμ˜ APIμž…λ‹ˆλ‹€.
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamExample {
    public static void main(String[] args) {
        List<Integer> nnumbers = Arrays.asList(1, 2, 3, 4, 5);
        
        // 짝수만 ν•„ν„°λ§ν•˜κ³ , 각 μˆ«μžμ— 2λ₯Ό κ³±ν•œ 리슀트 생성
        List<Integer> result = numbers.stream()
            .filter(n -> n % 2 == 0)
            .map(n -> n * 2)
            .collect(Collectors.toList());
            
            System.out.println(result); // [4, 8] 좜λ ₯
    }
}

4️⃣ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ μž₯점.

1️⃣ μ½”λ“œμ˜ κ°„κ²°μ„±.

  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” μ½”λ“œκ°€ 짧고 직관적이기 λ•Œλ¬Έμ—, 읽기 쉽고 μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•©λ‹ˆλ‹€.

2️⃣ μž¬μ‚¬μš©μ„±κ³Ό ν™•μž₯μ„±.

  • μž‘κ³  μž¬μ‚¬μš© κ°€λŠ₯ν•œ ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜μ—¬, λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ΄λ‚˜ ν”„λ‘œμ νŠΈμ—μ„œ μž¬μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ 병렬 처리의 μš©μ΄μ„±.

  • λΆˆλ³€μ„± 덕뢄에 병렬 처리 ν™˜κ²½μ—μ„œλ„ μ•ˆμ „ν•˜κ²Œ μ‹€ν–‰ν•  수 있으며, 효율적인 병렬 μ²˜λ¦¬κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

4️⃣ 디버깅과 ν…ŒμŠ€νŠΈμ˜ μš©μ΄μ„±

  • 순수 ν•¨μˆ˜λŠ” λ…λ¦½μ μœΌλ‘œ ν…ŒμŠ€νŠΈν•  수 μžˆμ–΄, 디버깅과 λ‹¨μœ„ ν…ŒμŠ€νŠΈκ°€ μ‰½μŠ΅λ‹ˆλ‹€.

5️⃣ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ 단점.

1️⃣ λŸ¬λ‹ 컀브.

  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ κ°œλ…μ— μ΅μˆ™ν•˜μ§€ μ•Šμ€ κ°œλ°œμžμ—κ²ŒλŠ” λŸ¬λ‹ μ»€λΈŒκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 특히 λžŒλ‹€ ν‘œν˜„μ‹(Lambda Expression)κ³Ό κ³ μ°¨ ν•¨μˆ˜(Higher-Order Function)에 μ΅μˆ™ν•΄μ§€λŠ” 데 μ‹œκ°„μ΄ ν•„μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ 퍼포먼슀 이슈.

  • λΆˆλ³€μ„± λ•Œλ¬Έμ— μƒˆλ‘œμš΄ 객체λ₯Ό 맀번 생성해야 ν•˜λŠ” 경우 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ 증가할 수 있으며, μ„±λŠ₯에 영ν–₯을 λ―ΈμΉ  수 μžˆμŠ΅λ‹ˆλ‹€.
    • λ”°λΌμ„œ 상황에 따라 μ„±λŠ₯ μ΅œμ ν™”λ₯Ό κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€.

6️⃣ μš”μ•½.

  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ 순수 ν•¨μˆ˜, λΆˆλ³€μ„±, λΆ€μž‘μš© μ—†λŠ” μ½”λ“œλ₯Ό κ°•μ‘°ν•˜μ—¬, 가독성과 μœ μ§€λ³΄μˆ˜μ„±, μž¬μ‚¬μš©μ„±μ΄ 높은 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μž…λ‹ˆλ‹€.
  • Java 8 μ΄ν›„μ˜ λžŒλ‹€ ν‘œν˜„μ‹(Lambda Expression)κ³Ό 슀트림(Stream) APIλŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Function Programming ,FP) μŠ€νƒ€μΌμ„ λ„μž…ν•˜μ—¬, κ°œλ°œμžκ°€ λ”μš± κ°„κ²°ν•˜κ³  효율적인 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.
  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ 병렬 μ²˜λ¦¬μ™€ λ™μ‹œμ„± λ¬Έμ œμ— 강점을 가지며, μž‘μ€ ν•¨μˆ˜λ“€μ„ μ‘°ν•©ν•˜μ—¬ λͺ¨λ“ˆν™”(Modularization)된 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμ–΄, μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±κ³Ό ν™•μž₯성을 λ†’μ΄λŠ” 데 μœ λ¦¬ν•©λ‹ˆλ‹€.