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

2022. 7. 10. 12:43Β·πŸ“ Language/✏ Language

ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„(Programming Paradigm)

 

ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„(Programming Paradigm)

 

  • λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ°: 무엇(What)을 ν•  것인지 λ‚˜νƒ€λ‚΄κΈ°λ³΄λ‹€ μ–΄λ–»κ²Œ(How) ν•  건지λ₯Ό μ„€λͺ…ν•˜λŠ” 방식
    • 절차 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°(C): μˆ˜ν–‰λ˜μ–΄μ•Ό ν•  순차적인 처리 과정을 ν¬ν•¨ν•˜λŠ” 방식
    • 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°(C++, Java, C#): κ°μ²΄λ“€μ˜ μ§‘ν•©μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ˜ μƒν˜Έμž‘μš©μ„ ν‘œν˜„
  •  μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ°: μ–΄λ–»κ²Œ ν•  건지(How)λ₯Ό λ‚˜νƒ€λ‚΄κΈ°λ³΄λ‹€ 무엇(What)을 ν•  건지λ₯Ό μ„€λͺ…ν•˜λŠ” 방식
    • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(ν΄λ‘œμ €, ν•˜μŠ€μΌˆ, λ¦¬μŠ€ν”„): 순수 ν•¨μˆ˜λ₯Ό μ‘°ν•©ν•˜κ³  μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό λ§Œλ“œλŠ” 방식

 

객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 치λͺ…적인 단점은 객체가 μƒνƒœλ₯Ό κ°–λŠ”λ‹€λŠ” 것이닀.
λ³€μˆ˜κ°€ μ‘΄μž¬ν•˜κ³  이 λ³€μˆ˜λ₯Ό 톡해 객체가 μ˜ˆμΈ‘ν•  수 μ—†λŠ” μƒνƒœλ₯Ό κ°–κ²Œ λ˜μ–΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 내뢀에 버그λ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

 


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

λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ°μ„ 기반으둜 κ°œλ°œν–ˆλ˜ κ°œλ°œμžλ“€μ€ μ†Œν”„νŠΈμ›¨μ–΄μ˜ 크기가 컀짐에 따라, λ³΅μž‘ν•˜κ²Œ μ—‰μΌœμžˆλŠ” μŠ€νŒŒκ²Œν‹° μ½”λ“œλ₯Ό μœ μ§€ λ³΄μˆ˜ν•˜λŠ” 것이 맀우 νž˜λ“€λ‹€λŠ” 것을 κΉ¨λ‹«κ²Œ λ˜μ—ˆλ‹€. 그리고 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ΄λΌλŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ— 관심을 κ°–κ²Œ λ˜μ—ˆλ‹€.

 

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ 거의 λͺ¨λ“  것을 순수 ν•¨μˆ˜λ‘œ λ‚˜λˆ„μ–΄ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” κΈ°λ²•μœΌλ‘œ μž‘μ€ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜μ—¬ 가독성을 높이고 μœ μ§€λ³΄μˆ˜λ₯Ό μš©μ΄ν•˜κ²Œ ν•΄ μ€€λ‹€.

 

1. ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ— λŒ€ν•œ 이해

유λͺ…ν•œ μ±…인 ν΄λ¦° μ½”λ“œ(Clean Code)의 μ €μž Robert C.Martin은 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ λŒ€μž…문이 μ—†λŠ” ν”„λ‘œκ·Έλž˜λ°μ΄λΌκ³  μ •μ˜ν•˜μ˜€λ‹€.

 

Functional Programming is programming without assignment satements
- Rober C.Martin -

 

κ·Έλ™μ•ˆ λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ°μœΌλ‘œ κ°œλ°œμ„ ν•΄μ™”λ˜ μ‚¬λžŒλ“€μ—κ²Œ λŒ€μž…문이 μ—†λŠ” ν”„λ‘œκ·Έλž˜λ°μ€ μƒλ‹Ήνžˆ μƒμ†Œν•  μˆ˜λ°–에 μ—†λ‹€. μ™œλƒν•˜λ©΄ λ‹€μŒκ³Ό κ°™μ΄ κ°„λ‹¨ν•œ μ½”λ“œμ—μ„œλ„ λ³€μˆ˜κ°€ ν• λ‹Ήλ˜κ³ , κ°’이 λŒ€μž…λ˜κΈ° λ•Œλ¬Έμ΄λ‹€.

for(int i = 1 ; i < 10; i++){
    System.out.println(i);
}

 

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” μœ„μ™€ 같은 μ½”λ“œλ₯Ό λ‹€μŒκ³Ό 같이 ν•΄κ²°ν•  수 μžˆλ‹€.

  • process ν•¨μˆ˜λŠ” μ²« λ²ˆμ§Έ μΈμžλ‘œ λͺ‡κΉŒμ§€ iteration을 λŒ κ²ƒμΈκ°€λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ°›κ³  μžˆκ³ , λ‘ λ²ˆμ§Έ μΈμžλ‘œ μ „달받은 κ°’을 μΆœλ ₯ν•˜λΌλŠ” ν•¨μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ°›κ³  μžˆλ‹€.
process(10, print(num));

 

무엇을(What)에 포컀슀λ₯Ό λ‘λŠ” ν”„λ‘œκ·Έλž˜λ°μ΄κΈ° λ•Œλ¬Έμ— '좜λ ₯을 ν•˜λŠ” ν•¨μˆ˜'λ₯Ό νŒŒλΌλ―Έν„°λ‘œ λ„˜κΈΈ 수 있으며, μ΄λŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ κΈ°λ³Έ 원리 쀑 ν•¨μˆ˜λ₯Ό 1κΈ‰ μ‹œλ―Ό(First-Class Citizen) λ˜λŠ” 1κΈ‰ 객체(First-Class Object)둜 κ΄€λ¦¬ν•˜λŠ” νŠΉμ§• λ•Œλ¬Έμ΄λ‹€.

 

2. νŠΉμ§•

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ νŠΉμ§•μ„ ν•œ μ€„λ‘œ μš”μ•½ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

 

λΆ€μˆ˜ νš¨κ³Όκ°€ μ—†λŠ” 순수 ν•¨μˆ˜λ₯Ό 1κΈ‰ 객체둜 κ°„μ£Όν•˜μ—¬ νŒŒλΌλ―Έν„°λ‚˜ λ°˜ν™˜ κ°’μœΌλ‘œ μ‚¬μš©ν•  수 있으며 μ°Έμ‘° 투λͺ…성을 지킬 수 μžˆλ‹€.

 

1) λΆ€μˆ˜ 효과(Side Effect)

λ‹€μŒκ³Ό 같은 λ³€ν™” λ˜λŠ” λ³€ν™”κ°€ λ°œμƒν•˜λŠ” μž‘μ—…μ„ μ˜λ―Έν•œλ‹€.

  • λ³€μˆ˜μ˜ 값이 변경됨
  • 자료 ꡬ쑰λ₯Ό μ œμžλ¦¬μ—μ„œ μˆ˜μ •ν•¨
  • 객체의 ν•„λ“œ 값을 섀정함
  • μ˜ˆμ™Έλ‚˜ 였λ₯˜κ°€ λ°œμƒν•˜λ©° 싀행이 쀑단됨
  • μ½˜μ†” λ˜λŠ” 파일 I/Oκ°€ λ°œμƒν•¨

 

2) 순수 ν•¨μˆ˜(Pure Function)

λΆ€μˆ˜ 효과(Side Effect)듀을 μ œκ±°ν•œ ν•¨μˆ˜λ“€μ„ 순수 ν•¨μˆ˜(Pure Function)이라고 λΆ€λ₯΄λ©° ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜λŠ” μ΄λŸ¬ν•œ 순수 ν•¨μˆ˜λ“€μ΄λ‹€.

  • Memory or I/O의 κ΄€μ μ—μ„œ Side Effectκ°€ μ—†λŠ” ν•¨μˆ˜
  • ν•¨μˆ˜μ˜ 싀행이 외뢀에 영ν–₯을 λΌμΉ˜μ§€ μ•ŠλŠ” ν•¨μˆ˜

 

순수 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ λ‹€μŒκ³Ό 같은 μž₯점듀이 μžˆλ‹€.

  • ν•¨μˆ˜ μžμ²΄κ°€ 독립적이며 Side Effectκ°€ μ—†κΈ° λ•Œλ¬Έμ— μŠ€λ ˆλ“œμ— μ•ˆμ „μ„±μ„ 보μž₯받을 수 μžˆλ‹€.
  • μŠ€λ ˆλ“œμ— μ•ˆμ •μ„±μ„ 보μž₯λ°›μ•„ 병렬 처리λ₯Ό 동기화 없이 μ§„ν–‰ν•  수 μžˆλ‹€.

 

3) 1κΈ‰ 객체(First-Class Object)

  • λ³€μˆ˜λ‚˜ 데이터 ꡬ쑰 μ•ˆμ— 담을 수 μžˆλ‹€.
  • νŒŒλΌλ―Έν„°λ‘œ 전달할 수 μžˆλ‹€.
  • λ°˜ν™˜ κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.
  • 할당에 μ‚¬μš©λœ 이름과 λ¬΄κ΄€ν•˜κ²Œ κ³ μœ ν•œ ꡬ별이 κ°€λŠ₯ν•˜λ‹€.


ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œ ν•¨μˆ˜λŠ” 1κΈ‰ κ°μ²΄λ‘œ μ·¨κΈ‰λ°›κΈ° λ•Œλ¬Έμ— μœ„μ˜ μ˜ˆμ œμ—μ„œ λ³Έ κ²ƒμ²˜λŸΌ ν•¨μˆ˜λ₯Ό νŒŒλΌλ―Έν„°λ‘œ λ„˜κΈ°λŠ” λ“±μ˜ μž‘업이 κ°€λŠ₯ν•œ κ²ƒμ΄λ‹€. λ˜ν•œ μš°λ¦¬κ°€ μΌλ°˜μ μœΌλ‘œ μ•Œκ³  κ°œλ°œν–ˆλ˜ ν•¨μˆ˜λ“€μ€ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ •μ˜ν•˜λŠ” μˆœμˆ˜ ν•¨μˆ˜λ“€κ³ΌλŠ” λ‹€λ₯΄λ‹€λŠ” κ²ƒμ„ μΈμ§€ν•΄μ•Ό ν•œλ‹€.

 

4) μ°Έμ‘° 투λͺ…μ„±(Referential Transparency)

  • λ™μΌν•œ μΈμžμ— λŒ€ν•΄ 항상 λ™μΌν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€.
  • μ°Έμ‘° 투λͺ…성을 톡해 기쑴의 값은 λ³€κ²½λ˜μ§€ μ•Šκ³  μœ μ§€λœλ‹€.

 

λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ°κ³Ό ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜λŠ” λΆ€μˆ˜νš¨κ³Όμ˜ μœ /무에 따라 차이가 μžˆλ‹€. 그에 따라 ν•¨μˆ˜κ°€ 참쑰에 투λͺ…ν•œμ§€ μ•ˆ ν•œ μ§€ λ‚˜λˆ„μ–΄μ§€λŠ”λ°, 참쑰에 투λͺ…ν•˜λ‹€λŠ” 것은 말 κ·ΈλŒ€λ‘œ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜μ—¬λ„ μ–΄λ– ν•œ μƒνƒœμ˜ λ³€ν™” 없이 항상 λ™μΌν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜μ—¬ 항상 λ™μΌν•˜κ²Œ(투λͺ…ν•˜κ²Œ) μ‹€ν–‰ κ²°κ³Όλ₯Ό μ°Έμ‘°(예츑)ν•  수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. 즉, μ–΄λ–€ ν•¨μˆ˜ f에 μ–΄λ– ν•œ 인자 xλ₯Ό λ„£κ³  fλ₯Ό μ‹€ν–‰ν•˜κ²Œ 되면, fλŠ” μž…λ ₯된 μΈμžμ—λ§Œ μ˜μ‘΄ν•˜λ―€λ‘œ 항상 f(x)λΌλŠ” λ™μΌν•œ κ²°κ³Όλ₯Ό μ–»λŠ”λ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

 

λΆ€μž‘μš©μ„ μ œκ±°ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ˜ λ™μž‘μ„ μ΄ν•΄ν•˜κ³  μ˜ˆμΈ‘μ„ μš©μ΄ν•˜κ²Œ ν•˜λŠ” 것은 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μœΌλ‘œ κ°œλ°œν•˜λ €λŠ” 핡심 동기 쀑 ν•˜λ‚˜μ΄λ‹€. 그리고 μ΄λŸ¬ν•œ 뢀뢄인 병렬 처리 ν™˜κ²½μ—μ„œ κ°œλ°œν•  λ•Œ 경쟁 μƒνƒœμ— λŒ€ν•œ λΉ„μš©μ„ 쀄여쀀닀. μ™œλƒν•˜λ©΄ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” κ°’μ˜ λŒ€μž…μ΄ 없이 항상 λ™μΌν•œ 싀행에 λŒ€ν•΄ λ™μΌν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

 

3. Javaλ₯Ό μ΄μš©ν•œ μ˜ˆμ‹œ

  • λ‹¨μ–΄μ˜ ν¬κΈ°κ°€ 2 μ΄μƒμΈ κ²½μš°λ₯Ό ν•„ν„°λ§ν•œλ‹€.
  • λͺ¨λ“  단어λ₯Ό λŒ€λ¬Έμžλ‘œ λ³€ν™˜ν•œλ‹€.
  • λͺ¨λ“  단어λ₯Ό μ•žκΈ€μžλ§Œ μž˜λΌλ‚΄μ–΄ λ³€ν™˜ν•œλ‹€.
  • λͺ¨λ“  단어λ₯Ό 슀페이슀둜 κ΅¬λΆ„ν•œ ν•˜λ‚˜μ˜ λ¬Έμžμ—΄λ‘œ ν•©μΉœλ‹€.
public class WordProcessTest {

    private final List<String> words = Arrays.asList("TONY", "a", "hULK", "B", "america", "X", "nebula", "Korea");

    @Test
    void wordProcessTest() {
        String result = words.stream()
                .filter(w -> w.length() > 1)
                .map(String::toUpperCase)
                .map(w -> w.substring(0, 1))
                .collect(Collectors.joining(" "));

        assertThat(result).isEqualTo("T H A N K");
    }
}

 

기쑴의 for 문을 μ‚¬μš©ν•˜λ©΄ μ§€μ—­ λ³€μˆ˜κ°€ ν•„μš”ν–ˆμ„ κ²ƒμ΄μ§€λ§Œ ν•¨μˆ˜ν˜• 기반의 Stream APIμ—μ„œλŠ” ν•„μš”κ°€ μ—†λ‹€. 이λ₯Ό 톡해 μƒνƒœλ₯Ό λ°”κΎΈλŠ” μ§€μ—­ λ³€μˆ˜ 자체λ₯Ό μ—†μ•°μœΌλ‘œμ¨ λΆ€μˆ˜ 효과λ₯Ό μ œκ±°ν•˜μ—¬ μ˜λ„ν•˜μ§€ μ•Šμ€ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€. μš°λ¦¬κ°€ μ£Όλͺ©ν•΄μ•Ό ν•˜λŠ” 뢀뢄은 μœ„μ˜ wordProcess λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ filterλ‚˜ map, collect λ“±κ³Ό 같은 ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°λ‘œ ν•¨μˆ˜κ°€ μ „λ‹¬λœλ‹€λŠ” 점이닀.

 

 

https://mangkyu.tistory.com/111

 

[ν”„λ‘œκ·Έλž˜λ°] ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Functional Programming) μ΄λž€?

1. ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Functional Programming)에 λŒ€ν•œ 이해 [ ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„(Programming Paradigm) ] ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„(Programming Paradigm)은 ν”„λ‘œκ·Έλž˜λ¨Έμ—κ²Œ ν”„λ‘œκ·Έλž˜λ°μ˜ 관점을 κ°–κ²Œ ν•˜κ³  μ½”λ“œλ₯Ό..

mangkyu.tistory.com

μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
'πŸ“ Language/✏ Language' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • 컴파일 κ³Όμ •
  • λ©”λͺ¨λ¦¬ λˆ„μˆ˜(Memory Leak)의 κ°œλ…κ³Ό ν•΄κ²° 방법
  • 인터프리터(Interpreter)와 컴파일러(Compiler)
  • 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°(Object Oriented Programming)
Blxxming
Blxxming
CS 지식과 κ³΅λΆ€ν•˜λ‹€ 배운 것, κ²½ν—˜ν•œ 것 등을 κΈ°λ‘ν•˜λŠ” λΈ”λ‘œκ·Έμž…λ‹ˆλ‹€.
  • Blxxming
    πŸ’‘λ²ˆλœ©πŸ’‘
    Blxxming
  • 전체
    였늘
    μ–΄μ œ
  • 곡지사항

    • Tech Interview
    • πŸ“š Tech (246)
      • πŸ“ Computer Science (96)
        • ✏ OS (12)
        • ✏ Network & Web (10)
        • ✏ Database (11)
        • ✏ Data Structure (6)
        • ✏ Algorithm (40)
        • ✏ Design Pattern (9)
        • ✏ Cloud Computing (3)
        • ✏ (5)
      • πŸ“ Language (73)
        • ✏ Language (6)
        • ✏ C & C++ (11)
        • ✏ C# (19)
        • ✏ JAVA (37)
      • πŸ“ Game (43)
        • ✏ Computer Graphics (2)
        • ✏ Unity (14)
        • ✏ Unreal (26)
        • ✏ (1)
      • πŸ“ Book (34)
        • ✏ Effective (3)
        • ✏ Game Server (16)
        • ✏ Clean Code (14)
        • ✏ (1)
  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.0
Blxxming
ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Functional Programming)
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”