Skip to content

Latest commit

Β 

History

History
183 lines (107 loc) Β· 5.58 KB

File metadata and controls

183 lines (107 loc) Β· 5.58 KB

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°

순수 ν•¨μˆ˜λ₯Ό μ‘°ν•©ν•˜κ³  곡유 μƒνƒœ, λ³€κ²½ κ°€λŠ₯ν•œ 데이터 및 λΆ€μž‘μš©μ„ ν”Όν•΄ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό λ§Œλ“œλŠ” ν”„λ‘œμ„ΈμŠ€



'μ„ μ–Έν˜•' ν”„λ‘œκ·Έλž˜λ°μœΌλ‘œ, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μƒνƒœλŠ” 순수 ν•¨μˆ˜λ₯Ό 톡해 μ „λ‹¬λœλ‹€.

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μƒνƒœκ°€ 일반적으둜 곡유되고 객체의 λ©”μ„œλ“œμ™€ ν•¨κ»˜ λ°°μΉ˜λ˜λŠ” OOPμ™€λŠ” λŒ€μ‘°λ˜λŠ” ν”„λ‘œκ·Έλž˜λ° 방식


  • λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ°(μ ˆμ°¨μ§€ν–₯, 객체지ν–₯)

    μƒνƒœμ™€ μƒνƒœλ₯Ό λ³€κ²½μ‹œν‚€λŠ” κ΄€μ μ—μ„œ 연산을 μ„€λͺ…ν•˜λŠ” 방식

    μ•Œκ³ λ¦¬μ¦˜μ„ λͺ…μ‹œν•˜κ³ , λͺ©ν‘œλŠ” λͺ…μ‹œν•˜μ§€ μ•ŠμŒ

  • μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ°

    Howλ³΄λ‹€λŠ” What을 μ„€λͺ…ν•˜λŠ” 방식 (μ–΄λ–»κ²Œλ³΄λ‹¨ 무엇을)

    μ•Œκ³ λ¦¬μ¦˜μ„ λͺ…μ‹œν•˜μ§€ μ•Šκ³  λͺ©ν‘œλ§Œ λͺ…μ‹œν•¨


λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ°μ€ μ–΄λ–»κ²Œ 할지 ν‘œν˜„ν•˜κ³ , μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ°μ€ 무엇을 ν•  건지 ν‘œν˜„ν•œλ‹€.

ν•¨μˆ˜ν˜• μ½”λ“œλŠ” λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ°μ΄λ‚˜ OOP μ½”λ“œλ³΄λ‹€ 더 κ°„κ²°ν•˜κ³  μ˜ˆμΈ‘κ°€λŠ₯ν•˜μ—¬ ν…ŒμŠ€νŠΈν•˜λŠ” 것이 쉽닀.

(ν•˜μ§€λ§Œ μ΅μˆ™μΉ˜ μ•ŠμœΌλ©΄ 더 λ³΅μž‘ν•΄λ³΄μ΄κ³  μ΄ν•΄ν•˜κΈ° 어렀움)


ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‚˜ 방식을 λ°°μš°λŠ” 것이 μ•„λ‹Œ, ν•¨μˆ˜λ‘œ ν”„λ‘œκ·Έλž˜λ°ν•˜λŠ” 사고λ₯Ό λ°°μš°λŠ” 것이닀.

기쑴의 사고방식을 μ „ν™˜ν•˜μ—¬ ν”„λ‘œκ·Έλž˜λ°μ„ 더 μœ μ—°ν•˜κ²Œ λ¬Έμ œν•΄κ²° ν•˜λ„λ‘ μ ‘κ·Όν•˜λŠ” 것


ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ 의미λ₯Ό νŒŒμ•…ν•˜κΈ° μ „ κΌ­ μ•Œμ•„μ•Ό ν•  것듀

  • 순수 ν•¨μˆ˜ (Pure functions)

    μž…μΆœλ ₯이 μˆœμˆ˜ν•΄μ•Όν•¨ : λ°˜λ“œμ‹œ ν•˜λ‚˜ μ΄μƒμ˜ 인자λ₯Ό λ°›κ³ , 받은 인자λ₯Ό μ²˜λ¦¬ν•΄ λ°˜λ“œμ‹œ 결과물을 λŒλ €μ€˜μ•Ό 함. 인자 μ™Έ λ‹€λ₯Έ λ³€μˆ˜ μ‚¬μš© κΈˆμ§€

  • ν•©μ„± ν•¨μˆ˜ (Function composition)

  • κ³΅μœ μƒνƒœ ν”Όν•˜κΈ° (Avoid shared state)

  • μƒνƒœλ³€ν™” ν”Όν•˜κΈ° (Avoid mutating state)

  • λΆ€μž‘μš© ν”Όν•˜κΈ° (Avoid side effects)

    ν”„λ‘œκ·Έλž˜λ¨Έκ°€ λ°”κΎΈκ³ μž ν•˜λŠ” λ³€μˆ˜ μ™Έμ—λŠ” λ³€κ²½λ˜λ©΄ μ•ˆλ¨. 원본 λ°μ΄ν„°λŠ” μ ˆλŒ€ λΆˆλ³€!


λŒ€ν‘œμ μΈ μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° ν•¨μˆ˜ : map, filter, reduce


ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° μ˜ˆμ‹œ
var arr = [1, 2, 3, 4, 5];
var map = arr.map(function(x) {
  return x * 2;
}); // [2, 4, 6, 8, 10]

arr을 λ„£μ–΄μ„œ map을 μ–»μ—ˆμŒ. arr을 μ‚¬μš©ν–ˆμ§€λ§Œ 값은 λ³€ν•˜μ§€ μ•Šμ•˜κ³  mapμ΄λΌλŠ” κ²°κ³Όλ₯Ό λ‚΄κ³  μ–΄λ– ν•œ λΆ€μž‘μš©λ„ 낳지 μ•ŠμŒ

이런 것이 λ°”λ‘œ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ μˆœμˆ˜ν•¨μˆ˜λΌκ³  λ§ν•œλ‹€.


var arr = [1, 2, 3, 4, 5];
var condition = function(x) { return x % 2 === 0; }
var ex = function(array) {
  return array.filter(condition);
};
ex(arr); // [2, 4]

μ΄λŠ” μˆœμˆ˜ν•¨μˆ˜κ°€ μ•„λ‹ˆλ‹€. μ΄μœ λŠ” ex λ©”μ†Œλ“œμ—μ„œ μΈμžκ°€ μ•„λ‹Œ condition을 μ‚¬μš©ν–ˆκΈ° λ•Œλ¬Έ.

μˆœμˆ˜ν•¨μˆ˜λ‘œ 고치면 μ•„λž˜μ™€ κ°™λ‹€.

var ex = function(array, cond) {
  return array.filter(cond);
};
ex(arr, condition);

μˆœμˆ˜ν•¨μˆ˜λ‘œ λ§Œλ“€λ©΄, μ—λŸ¬λ₯Ό μΆ”μ ν•˜λŠ” 것이 μ‰¬μ›Œμ§„λ‹€. μΈμžμ— λ¬Έμ œκ°€ μžˆκ±°λ‚˜ ν•¨μˆ˜ 내뢀에 λ¬Έμ œκ°€ μžˆκ±°λ‚˜ λ‘˜ 쀑 ν•˜λ‚˜μΌ 수 밖에 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.



Javaμ—μ„œμ˜ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°


Java 8이 λ¦΄λ¦¬μ¦ˆλ˜λ©΄μ„œ, Javaμ—μ„œλ„ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ΄ κ°€λŠ₯ν•΄μ‘Œλ‹€.

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° : λΆ€μˆ˜νš¨κ³Όλ₯Ό μ—†μ• κ³  순수 ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ λͺ¨λ“ˆν™” μˆ˜μ€€μ„ λ†’μ΄λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„

λΆ€μˆ˜νš¨κ³Ό : 주어진 κ°’ μ΄μ™Έμ˜ μ™ΈλΆ€ λ³€μˆ˜ 및 ν”„λ‘œκ·Έλž˜λ° 싀행에 영ν–₯을 λΌμΉ˜μ§€ μ•Šμ•„μ•Ό λœλ‹€λŠ” 의미

μ΅œλŒ€ν•œ μˆœμˆ˜ν•¨μˆ˜λ₯Ό 지ν–₯ν•˜κ³ , μˆ¨κ²¨μ§„ μž…μΆœλ ₯을 μ΅œλŒ€ν•œ μ œκ±°ν•˜μ—¬ μ½”λ“œλ₯Ό μˆœμˆ˜ν•œ μž…μΆœλ ₯ κ΄€κ³„λ‘œ μ‚¬μš©ν•˜λŠ” 것이 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ λͺ©μ μ΄λ‹€.

Java의 객체 지ν–₯은 λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ°μ΄κ³ , ν•¨μˆ˜ν˜•μ€ μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ°μ΄λ‹€.

λ‘˜μ˜ μ°¨μ΄λŠ” λ¬Έμ œν•΄κ²°μ˜ 관점

μ—¬νƒœκΉŒμ§€ μš°λ¦¬λŠ” Javaμ—μ„œ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ ν•  λ•Œ '데이터λ₯Ό μ–΄λ–»κ²Œ μ²˜λ¦¬ν•  지에 λŒ€ν•΄ λͺ…령을 톡해 ν•΄κ²°'ν–ˆλ‹€.

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ 선언적 ν•¨μˆ˜λ₯Ό 톡해 '무엇을 ν’€μ–΄λ‚˜κ°€μ•Όν• μ§€ κ²°μ •'ν•˜λŠ” 것이닀.

Javaμ—μ„œ ν™œμš©ν•  수 μžˆλŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°
  • λžŒλ‹€μ‹
  • stream api
  • ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€

Java 8μ—λŠ” Stream APIκ°€ μΆ”κ°€λ˜μ—ˆλ‹€.

import java.util.Arrays;
import java.util.List;

public class stream {

	public static void main(String[] args) {
		List<String> myList = Arrays.asList("a", "b", "c", "d", "e");
 
                // 기쑴방식
                for(int i=0; i<myList.size(); i++){
                    String s = myList.get(i);
                    if(s.startsWith("c")){
                        System.out.println(s.toUpperCase());
                    }
                }
 
                // stream APIλ₯Ό μ΄μš©ν•œ 방식
                myList.stream()
                      .filter(s -> s.startsWith("c"))
                      .map(String::toUpperCase)
                      .forEach(System.out::println);
 
	}

}

뭐가 λ‹€λ₯Έκ±΄μ§€ 크게 와닿지 μ•Šμ„ 수 μžˆμ§€λ§Œ, μ€‘μš”ν•œκ±΄ ν”„λ‘œκ·Έλž˜λ°μ˜ νŒ¨λŸ¬λ‹€μž„ λ³€ν™”λΌλŠ” 것이닀.

λ‹¨μˆœνžˆ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•΄μ„œ 데이터λ₯Ό λ‚΄κ°€ μ›ν•˜λŠ” λ°©ν–₯으둜 μ²˜λ¦¬ν•΄λ‚˜κ°€λŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 방식을 λ³Ό 수 μžˆλ‹€. ν•œλˆˆμ— 보더라도 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ λ‚΄κ°€ 무엇을 κ΅¬ν˜„ν–ˆλŠ”μ§€ λͺ…ν™•νžˆ μ•Œ 수 μžˆλ‹€. (무슨 ν•¨μˆ˜μΈμ§€ μ‚¬μ „ν•™μŠ΅μ΄ ν•„μš”ν•œ 점이 있음)