CS/Design Pattern

[ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„] OOP์™€ FP

๊ฐœ๋ฐœ๊ฐœ๊ตด๐Ÿธ 2022. 7. 3. 21:55

OOP๋ž€?

OOP๋Š” Object Oriented Programming์˜ ์•ฝ์ž๋กœ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.

class์™€ object์— ๊ธฐ๋ฐ˜ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„(๋””์ž์ธ ํŒจํ„ด)์œผ๋กœ, ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ผ๋ฆฌ ๋ฌถ์–ด์„œ class๋ฅผ ํ˜•์„ฑํ•˜๊ณ  ๊ทธ ์•ˆ์—์„œ object instance๋ฅผ ๋งŒ๋“ค์–ด ํ”„๋กœ๊ทธ๋žจ์„ ๋””์ž์ธ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ ์ž๋ฐ”๊ฐ€ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

  • ๊ฐ์ฒด๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ํ‘œํ˜„
  • ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰ํ•˜์—ฌ ๊ฐ์ฒด ๋‚ด๋ถ€์— ์„ ์–ธ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹

OOP์˜ ์žฅ์ 

  • ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ๋ฅ ์„ ๋†’์ด๊ณ  ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›€
  • ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด์กด์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ(์บก์Šํ™”)

OOP์˜ ํŠน์ง• 4๊ฐ€์ง€

์บก์Šํ™”(Encapsulation)

์บก์Šํ™”๋Š” ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๋กœ์ง์€ ๊ฐ์ถ”๊ณ  ์™ธ๋ถ€์—๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ์•ˆ์ •์ ์ธ ๋ถ€๋ถ„๋งŒ ๊ณต๊ฐœํ•จ์œผ๋กœ์จ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด์กดํ•˜๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ์™ธ๋ถ€์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๊ตฌํ˜„์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ถ€ ๋กœ์ง์— ๋Œ€ํ•œ ์œ ์—ฐํ•จ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐ์ฒด์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๊ณ  ์ผ๋ถ€๋ฅผ ์™ธ๋ถ€์— ๊ฐ์ถ”์–ด ์€๋‹‰
  • Implementation : ์ˆจ๊ธธ ๋ถ€๋ถ„
  • Interface : ๊ณต๊ฐœํ•  ๋ถ€๋ถ„
  • ์บก์Šํ™”๋Š” ๊ฐ์ฒด์˜ ๋™์ž‘ ๊ตฌํ˜„์— ์ค‘์ ์„ ๋‘ 

 

์ถ”์ƒํ™”(Abstraction)

์ถ”์ƒํ™”๋Š” ๊ณตํ†ต์ ์„ ์ฐพ์•„ Class๋กœ ํ•œ๋ฒˆ์— ๋ฌถ๊ณ  ๋ณต์žกํ•œ ๋””ํ…Œ์ผ์„ ์ˆจ๊ธฐ๊ณ  ํ•ต์‹ฌ๋งŒ ์ถ”์ถœํ•ด๋‚˜๊ฐ€๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. 

๊ตฌํ˜„ ์„ธ๋ถ€์‚ฌํ•ญ ๋Œ€์‹  ํฐ ๋ฒ”์œ„์˜ ๊ณตํ†ต๋œ ๊ธฐ๋Šฅ ์ธก๋ฉด์—์„œ ํด๋ž˜์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์œผ๋กœ๋ถ€ํ„ฐ ํ•ต์‹ฌ์ ์ธ ๊ฐœ๋… ๋˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ„์ถ”๋ ค๋‚ด๋Š” ๊ฒƒ
  • ์ถ”์ƒํ™”๋Š” ๊ฐ์ฒด์˜ ๋™์ž‘, ๊ธฐ๋Šฅ ์ž์ฒด์—๋งŒ ์ค‘์ ์„ ๋‘ 
  • ์บก์Šํ™”์™€ ์ถ”์ƒํ™”๋Š” ์ƒํ˜ธ ๋ณด์™„์ 

์ƒ์†์„ฑ(Inheritence)

์ƒ์†์€ ํ”„๋กœํ† ํƒ€์ž…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ถ€ํ„ฐ ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ƒ์†์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ชจ๋“ ๊ฒƒ์„ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ๋ชจ๋‘ ์–ด์–ด๋ฐ›์•„ ๋ถ€๋ชจํด๋ž˜์Šค์˜ ํŠน์ง•์„ ์ž์‹ํด๋ž˜์Šค์—๊ฒŒ ๋ชจ๋‘ ๋ฌผ๋ ค์ฃผ๋Š” ํ–‰์œ„์ž…๋‹ˆ๋‹ค.

  • ์ƒ์œ„ ํด๋ž˜์Šค์˜ ํŠน์„ฑ์„ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ด์–ด๋ฐ›์•„์„œ ์žฌ์‚ฌ์šฉ, ์ถ”๊ฐ€, ํ™•์žฅ
  • ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ ์ธก๋ฉด, ๊ณ„์ธต์ ์ธ ๊ด€๊ณ„ ์ƒ์„ฑ, ์œ ์ง€ ๋ณด์ˆ˜์„ฑ ์ธก๋ฉด์—์„œ ์ค‘์š”

 

๋‹คํ˜•์„ฑ(Polymorphism)

๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋ฉ”์†Œ๋“œ๋ผ๋„ ๊ฐ ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์ƒํ™ฉ์— ๋งž๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฆ‰, ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜๋ช…, ํ•จ์ˆ˜๋ช… ๋“ฑ์ด ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์˜๋ฏธ๋กœ ํ•ด์„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ค๋ฒ„๋กœ๋”ฉ๊ณผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๋‹คํ˜•์„ฑ์—์„œ ์ค‘์š”ํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

 

  • ์˜ค๋ฒ„๋ผ์ด๋”ฉ
    • ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์™€ ๊ฐ™์€ ์ด๋ฆ„, ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์žฌ์ •์˜ ํ•จ
    • Runtime์— ์ด๋ฃจ์–ด์ง€๋Š” ๋™์  ๋‹คํ˜•์„ฑ
  • ์˜ค๋ฒ„๋กœ๋”ฉ
    • ๊ฐ™์€ ์ด๋ฆ„์˜ ํ•จ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ์ •์˜ํ•˜๊ณ , ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํƒ€์ž…๊ณผ ๊ฐœ์ˆ˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•˜์—ฌ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ํ˜ธ์ถœ๋จ
    • Compile time์— ์ด๋ฃจ์–ด์ง€๋Š” ์ •์  ๋‹คํ˜•์„ฑ

 

FP๋ž€?

FP๋Š” Functional Programming์˜ ์•ฝ์ž๋กœ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.

Side effect(๋ถ€์ž‘์šฉ)์ด ์—†๋Š” Pure function(์ˆœ์ˆ˜ ํ•จ์ˆ˜)๋ฅผ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ ํ”„๋กœ๊ทธ๋žจ์„ ๋””์ž์ธํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๊ฐœ์˜ ์ž‘์€ function์„ ์—ฎ์–ด ํ•˜๋‚˜์˜ ํฐ function์„ ๊ตฌํ˜„ํ•˜๊ณ  ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ ์ตœ๊ทผ ํ”„๋ก ํŠธ ๊ฐœ๋ฐœ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ€ํ‹ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์ธ Javascript์–ธ์–ด์˜ ๊ฒฝ์šฐ OOP๋กœ ์‹œ์ž‘๋˜์—ˆ์ง€๋งŒ, ๋ฆฌ์•กํŠธ์˜ hooks๊ฐ€ ๋„์ž…๋˜๊ณ  ๋‚œํ›„ FP๋กœ ์ฃผ๋กœ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

FP์˜ ์žฅ์ 

  • ๋†’์€ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณต
  • ํ•จ์ˆ˜ ๋‹จ์œ„์˜ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๊ฐ€
  • ๋””๋ฒ„๊น…์ด ์‰ฌ์›€
  • ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ–ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์„ ์˜ˆ์ธกํ•˜๊ธฐ ์‰ฌ์›€

FP์˜ ํŠน์ง•

1๊ธ‰ ๊ฐ์ฒด(Fist Object, 1๊ธ‰ ์‹œ๋ฏผ)

์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์— ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์—ฐ์‚ฐ์„ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฅดํ‚ต๋‹ˆ๋‹ค.

  • ๋ณ€์ˆ˜๋‚˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์•ˆ์— ๋‹ด์„ ์ˆ˜ ์žˆ์Œ
  • ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ ํ•  ์ˆ˜ ์žˆ์Œ
  • ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ํ• ๋‹น์— ์‚ฌ์šฉ๋œ ์ด๋ฆ„๊ณผ ๊ด€๊ณ„์—†์ด ๊ณ ์œ ํ•œ ๊ตฌ๋ณ„์ด ๊ฐ€๋Šฅํ•จ
  • ๋™์ ์œผ๋กœ ํ”„๋กœํ„ฐ๋”” ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•จ

๊ณ ์ฐจ ํ•จ์ˆ˜(Higher Order Function)

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์—ฌ๋Ÿฌ ์ž‘์€ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋“ค์„ ์—ฐ์‡„์  ํ˜น์€ ๋ณ‘๋ ฌ์ ์œผ๋กœ ํ˜ธ์ถœํ•ด ๋” ํฐ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•จ์ˆ˜๋ฅผ ์—ฎ๊ธฐ ์œ„ํ•ด HOC(๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ)๋ฅผ ํ™œ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ
  • ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

์‰ฝ๊ฒŒ ๋งํ•ด, ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฃจ๋Š” ํ•จ์ˆ˜๋กœ Javascript์—์„œ๋Š” map, filter, reduce์™€ ๊ฐ™์€ ๊ณ ์ฐจ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋นˆ๋ฒˆํ•œ for๊ณผ while์˜ ์‚ฌ์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// map
const arr = [1, 2, 3, 4, 5];
const result = arr.map((n) => n * 2);
console.log(result); // [ 2, 4, 6, 8, 10 ]

//filter - ์กฐ๊ฑด์— ๋งž๋Š” ๊ฐ’์„ returnํ•œ๋‹ค.
const arr = [1, 2, 3, 4, 5];
const result = arr.filter((n) => n > 2);
console.log(result); // [ 3, 4, 5 ]

//reduce - ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐฐ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ๊ฐ’์„ ๋” ํ•  ์ˆ˜ ์žˆ๋‹ค.
const arr = [1, 2, 3, 4, 5];
const result = arr.reduce((prev, curr) => (prev += curr), 0);
console.log(result); // 15

 

๋ถˆ๋ณ€์„ฑ(Immutablility)

๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ์›๋ณธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด ๊ทธ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ , ๋ณ€๊ฒฝํ•œ ๋ณต์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•ด ์ž‘์—…์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

์ˆœ์ˆ˜ ํ•จ์ˆ˜(Pure function)

  • ์ˆœ์ˆ˜ํ•จ์ˆ˜๋Š” ๊ฐ™์€ ์ž…๋ ฅ์— ๋Œ€ํ•ด ํ•ญ์ƒ ๊ฐ™์€ ๊ฐ’์„ ์ถœ๋ ฅํ•จ
  • ์ˆœ์ˆ˜ํ•จ์ˆ˜๋Š” ๋ถ€์ˆ˜ ํšจ๊ณผ(Side-effect)๊ฐ€ ์—†์Œ
  • ํ•จ์ˆ˜ ์™ธ๋ถ€์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Œ

 

https://limkydev.tistory.com/30

 

[Java] ๊ฐ์ฒด์ง€ํ–ฅํ”„๋กœ๊ทธ๋ž˜๋ฐ (OOP)๋ž€?

์ž๋ฐ”ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋ฉด ๊ฐ์ฒด์ง€ํ–ฅํ”„๋กœ๊ทธ๋ž˜๋ฐ OOP(Object Oriented Programming)์ด๋ผ ํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํŠน์„ฑ์€์œผ๋กœ ํฌ๊ฒŒ ์บก์Šํ™”, ์ถ”์ƒํ™”, ๋‹คํ˜•์„ฑ, ์ƒ์†์„ฑ,์ •๋„๋Š” ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ๊ณ ์žˆ์–ด์•ผํ•œ

limkydev.tistory.com

https://velog.io/@suyeonme/JavascriptOOP

 

[Javascript]OOP vs FP

OOP์™€ FP๋Š” ๋ฌด์—‡์ธ๊ฐ€?

velog.io

https://koras02.tistory.com/172

 

[Javascript] OOP vs FP๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

OOP Object Oriented Programming์˜ ์•ฝ์ž๋กœ class์™€ object์— ๊ธฐ๋ฐ˜ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŽ˜๋Ÿฌ๋‹ค์ž„(๋””์ž์ธ ํŒจํ„ด) ์ž…๋‹ˆ๋‹ค. OOP๋Š” ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ผ๋ฆฌ ๋ฌถ์–ด class๋ฅผ ํ˜•์„ฑํ•˜๊ณ  ๊ทธ ์•ˆ์—์„œ object instance๋ฅผ ๋งŒ๋“ฌ์œผ๋กœ์จ ํ”„..

koras02.tistory.com

https://www.learningman.co/oopfp/

 

์ฝ”๋“œ์งœ๋Š” ๋ฒ•-OOP์™€ FP

์ฝ”๋“œ๋ฅผ ์ž˜ ์งœ๊ธฐ ์œ„ํ•œ ์„ ๋ฐฐ๋“ค์˜ ์œ ์‚ฐ

www.learningman.co

https://velog.io/@somedaycode/%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80-What-is-FP

 

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€? (What is FP?)

ํ•จ์ˆ˜๊ฐ€ ํ•˜๋‚˜์˜ ์ผ๋งŒ ํ•˜๋„๋ก ์ž˜๊ฒŒ ๋‚˜๋ˆˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์†Œํ”„ํŠธ์›จ์–ด ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์˜ํ–ฅ์„ ์ตœ์†Œํ•œ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

velog.io