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

🎱 κ°œμš”

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

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

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

πŸ“Œ 거의 λͺ¨λ“  것을 순수 ν•¨μˆ˜λ‘œ λ‚˜λˆ„μ–΄ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” κΈ°λ²•μœΌλ‘œ, μž‘μ€ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜μ—¬ 가독성을 높이고 μœ μ§€λ³΄μˆ˜λ₯Ό μš©μ΄ν•˜κ²Œ ν•΄μ€Œ
  • λŒ€μž…λ¬Έμ„ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” ν”„λ‘œκ·Έλž˜λ°μ΄λ©°, μž‘μ€ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ ν•¨μˆ˜λ₯Ό μž‘μ„±
  • λŒ€μž…λ¬Έμ΄ μ—†κΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬μ— ν•œ 번 ν• λ‹Ήλœ 값은 μƒˆλ‘œμš΄ κ°’μœΌλ‘œ λ³€ν•  수 μ—†μŒ
// 1 ~ 10κΉŒμ§€μ˜ 값이 i에 ν• λ‹Ήλœλ‹€
for(int i = 1 ; i < 10; i++){
    System.out.println(i);
}
// processλΌλŠ” μž„μ˜μ˜ ν•¨μˆ˜
process(10, print(num));

⇒ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ 무엇(What)에 포컀슀λ₯Ό λ‘λŠ” ν”„λ‘œκ·Έλž˜λ°μ΄κΈ° λ•Œλ¬Έμ— 좜λ ₯을 ν•˜λŠ” ν•¨μˆ˜ printλ₯Ό νŒŒλΌλ―Έν„°λ‘œ λ„˜κΈΈ 수 있음

🎱 νŠΉμ§•

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

 

1️⃣ λΆ€μˆ˜νš¨κ³Ό(Side Effect)

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

2️⃣ μˆœμˆ˜ν•¨μˆ˜(Pure Function)

μœ„μ˜ λΆ€μˆ˜νš¨κ³Όλ“€μ„ μ œκ±°ν•œ ν•¨μˆ˜λ“€μ„ μˆœμˆ˜ν•¨μˆ˜(Pure Function)이라고 λΆ€λ₯΄λ©°, ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜λŠ” μ΄λŸ¬ν•œ 순수 ν•¨μˆ˜λ“€μž„

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

순수 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κ²Œ 되면 λ‹€μŒκ³Ό 같은 효과λ₯Ό 받을 수 있음

  • ν•¨μˆ˜ μžμ²΄κ°€ 독립적이며 Side-Effectκ°€ μ—†κΈ° λ•Œλ¬Έμ— Thread에 μ•ˆμ „μ„±μ„ 보μž₯받을 수 있음
  • Thread에 μ•ˆμ •μ„±μ„ 보μž₯λ°›μ•„ 병렬 처리λ₯Ό 동기화없이 진행할 수 있음

3️⃣ 1급객체 (First-Class Object) / 1κΈ‰μ‹œλ―Ό (First-Class Citizen)

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

→ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œ ν•¨μˆ˜λŠ” 1κΈ‰κ°μ²΄λ‘œ μ·¨κΈ‰λ°›κΈ° λ•Œλ¬Έμ— μœ„μ˜ μ˜ˆμ œμ—μ„œ λ³Έ κ²ƒμ²˜λŸΌ ν•¨μˆ˜λ₯Ό νŒŒλΌλ―Έν„°λ‘œ λ„˜κΈ°λŠ” λ“±μ˜ μž‘μ—…μ΄ κ°€λŠ₯ν•œ 것

 

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

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

→ 참쑰에 투λͺ…ν•˜λ‹€λŠ” 것은 ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜μ—¬λ„ μ–΄λ– ν•œ μƒνƒœμ˜ 변화없이 항상 λ™μΌν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•΄μ„œ 항상 λ™μΌν•˜κ²Œ(투λͺ…ν•˜κ²Œ) μ‹€ν–‰ κ²°κ³Όλ₯Ό μ°Έμ‘°(예츑)ν•  수 μžˆλ‹€λŠ” 것을 의미

Ex.) μ–΄λ–€ ν•¨μˆ˜ F에 μ–΄λ–€ 인자인 xλ₯Ό λ„£κ³  Fλ₯Ό μ‹€ν–‰ν•˜κ²Œ 되면 FλŠ” μž…λ ₯된 μΈμžμ—λ§Œ μ˜μ‘΄ν•˜κΈ° λ•Œλ¬Έμ— 항상 F(x)λΌλŠ” λ™μΌν•œ κ²°κ³Όλ₯Ό μ–»μŒ