Skip to content

1. Clojure philosophy

Minsun Lee edited this page Jul 27, 2014 · 7 revisions

The Clojure way

(์—‰ํ„ฐ๋ฆฌ ์š”์•ฝ.. 2014.07.25, joony)

๋‚˜์ค‘์— ์Šคํ„ฐ๋””๊ฐ€ ๋๋‚ ๋•Œ ์žฌ๋ฒˆ์—ญํ•˜๋ฉด ์ข‹์„๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

ํด๋กœ์ €๋Š” ์™„๊ณ ํ•œ ์–ธ์–ด ๋ชจ๋“  ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ปค๋ฒ„ํ•˜๊ฑฐ๋‚˜, ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹˜ ๋Œ€์‹ , ํด๋กœ์ €์˜ ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์‹ค์„ธ๊ณ„์˜ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณต

ํด๋กœ์ €์—์„œ ์ œ์ผ์˜ ํ˜œํƒ์„ ์–ป์œผ๋ ค๋ฉด, ์–ธ์–ด๊ฐ€ ๊ฐ€์ง„ ๋น„์ „๊ณผ ๋™์ผํ•œ ๋น„์ „์„ ๊ฐ€์ง€๊ณ  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ ๊ธฐ๋Šฅ ๋ฟ ์•„๋‹ˆ๋ผ, ์™œ ๊ทธ๊ฒŒ ์ œ์ผ ์ข‹์€์ง€ ์ฑ… ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์—์„œ ์•Œ๊ฒŒ ๋ ๊ฒƒ. ๊ทธ์ „์—, ๋†’์€ ์ˆ˜์ค€์˜ ์ฒ ํ•™์  ํ† ๋Œ€์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค.

Figure 1.1 - ํด๋กœ์ €์˜ ๊ธฐ์ดˆ๊ฐ€ ๋˜๋Š” ์ปจ์…‰, ๊ทธ๊ฒƒ๋“ค์ด ์–ด๋–ป๊ฒŒ ๊ต์ฐจํ•˜๋Š”์ง€. ํด๋กœ์ €์˜ ๋ชฉ์ ์— ๋Œ€ํ•ด ์•ž์œผ๋กœ ๋‹ค๋ฃฐ ๊ฒƒ

Simplicity (๋‹จ์ˆœํ•จ)

  • ๋ณต์žกํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ๋ฒ•์„ ์“ฐ๊ธฐ๋Š” ์–ด๋ ต๋‹ค
  • ๊ฒฝํ—˜ ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ํ•„์š”์ด์ƒ์œผ๋กœ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.(Moseley 2006)
  • ํด๋กœ์ €๋Š” ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์š”๊ตฌ์‚ฌํ•ญ,
  • ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋™์‹œ ์Šค๋ ˆ๋“œ, ๋…๋ฆฝ์ ์ธ ๊ฐœ๋ฐœ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ์˜ ๋ถ€์ˆ˜์ ์ธ ๋ณต์žกํ•จ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ , ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์คŒ
  • ์ฒ˜์Œ ๋ณด๊ธฐ์—” ํ•„์ˆ˜์ ์œผ๋กœ ๋ณต์žกํ•ด ๋ณด์ด๋Š” ๊ฒƒ๋„ ๋‚ฎ์ถฐ์ค„, ํˆด๋„ ์ œ๊ณต
  • ํด๋กœ์ €๋Š” ๊ฐ•๋ ฅํ•˜๊ณ  ๋‹จ์ˆœํ•œ ์ถ”์ƒํ™”์™€ ๋ธ”๋ก์ƒ์„ฑ์ด๋ผ๋Š” ํ‚ค ์„ธํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•จ (!todo)
  • ๊ธฐ๋Šฅ๋“ค์˜ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์ด ํ•ญ์ƒ ์‰ฌ์›Œ๋ณด์ด๊ฑฐ๋‚˜ ์ต์ˆ™ํ•˜์ง€๋Š” ์•Š์„ ๊ฒƒ
  • ํ•˜์ง€๋งŒ ์ด์ฑ…์„ ์ฝ์œผ๋ฉด์„œ, ํด๋กœ์ €๊ฐ€ ๋ณต์žกํ•œ ๋ฌธ์ œ์„ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ์–ผ๋งˆ๋‚˜ ๋„์›€์„ ์ฃผ๋Š”์ง€ ์•Œ๊ฒŒ ๋  ๊ฒƒ
  • ๋ถ€์ˆ˜์ ์ธ ๋ณต์žกํ•จ์˜ ์˜ˆ๋Š”, ํด๋ž˜์Šค ์ •์˜, ์ƒ์†, ํƒ€์ž…์„ ์–ธ์˜ ๊ณ„์ธต์„ ํ†ตํ•ด ์‹คํ–‰๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ฝ”๋“œ ์กฐ๊ฐ์ด ํŒจํ‚ค์ง€๋˜๊ธฐ๋ฅผ ์š”๊ตฌํ•˜๋Š” ํ˜„๋Œ€ ๊ฐ์ฒด์ง€ํ–ฅ์–ธ์–ด๋“ค์˜ ์„ฑํ–ฅ
  • ํด๋กœ์ €๋Š” ์šฐ์ˆ˜ํ•œ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋“ค์„ ํ†ตํ•ด, ์ด ๋ชจ๋“  ๊ฒƒ ์‚ฌ์ด๋กœ ๊ธธ์„ ๋ƒ…๋‹ˆ๋‹ค.
  • (todo!)which takes a few arguments and produces a return value based solely on those arguments
  • ํด๋กœ์ €์˜ ๊ด‘๋Œ€ํ•จ์€ ํ•จ์ˆ˜๋กœ๋ถ€ํ„ฐ ๋‚ด์žฅ๋œ๋‹ค. ๋ชจ๋“  ์‘์šฉํ”„๋กœ๊ทธ๋žจ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€(?) ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ• ๋•Œ, ๋œ ์ƒ๊ฐํ•˜๊ฒŒ ๋„์™€์ค€๋‹ค.

Freedom to focus (์ž์œ ์— ์ค‘์ )

  • ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋•Œ๋กœ, ํ˜ผ๋ž€์— ๋Œ€ํ•œ ์ง€์†์ ์ธ ํˆฌ์Ÿ, ๊ทธ๋ฆฌ๊ณ  ์–ธ์–ด๋Š” ํ•ญ์ƒ ์šฐ๋ฆฌ์—๊ฒŒ ๊ตฌ๋ฌธ, ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„, ์ƒ์†ก๊ฒŒ์ธต์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ฒŒ ๋งŒ๋“ฆ -> (๋ฌธ์ œ๋ฅผ ์•…ํ™”์‹œํ‚ด)
  • ํด๋กœ์ €๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•˜๋ ค๋Š” ์œ ์ง€ํ•˜๋ ค๋Š” ์šฐ๋ฆฌ์˜ ๋ฐฉ์‹์— ๋Œ€ํ•ด ๊ด€์—ฌํ•˜์ง€ ์•Š์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ•œ๋‹ค. ์•„์ด๋””์–ด๋กœ ๋ถ€ํ„ฐ, ์ปดํŒŒ์ผํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ์‚ฌ์ดํด์„ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ํƒ€์ž…์„ ์–ธ์„ ํ•˜๋Š” ๊ฒƒ์„ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋งคํฌ๋กœ / ์–ธ์–ด ์Šค์Šค๋กœ๋ฅผ ์ •๋ฆฝํ• ์ˆ˜์žˆ๋Š”(?) ํˆด์„ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹จ์–ด,๋ฌธ๋ฒ•์ด ๊ฐ€๋Šฅํ•œ ์šฐ๋ฆฌ ๋ฌธ์ œ์— ๋งž๊ฒŒ.
  • ํด๋กœ์ ธ๋Š” ํ’๋ถ€ํ•จ
  • ์ดํ•ดํ•˜๋Š”๋ฐ์— (๋…ธ๋ ฅํ•˜๋Š”)ํฌ์ƒ ์—†์ด, ๊ณ ์ฐจ์›์˜ ๋ฌธ์ œ๋“ค์„ ๊ฐ„๋‹จํ•˜๊ฒŒ..
  • ์ด ์ž์œ ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ํ•˜๋‚˜์˜ ํ‚ค๋Š” ๋™์ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์•ฝ์†
  • ์‹ฌ์ง€์–ด ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ์—๋„ ํด๋กœ์ €์•ˆ์˜ ์ •์˜๋œ ๋ชจ๋“  ๊ฒƒ์€ ๋ชจ๋‘ ์žฌ์ •์˜ ๊ฐ€๋Šฅ.: ํ•จ์ˆ˜, multimethods, ํƒ€์ž…, ํƒ€์ž…๊ณ„์ธต, ์‹ฌ์ง€์–ด ์ž๋ฐ” ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„.
  • ์ƒ์‚ฐ๋œ ์‹œ์Šคํ…œ ์œ„์—์„œ ๊ทธ๋•Œ ๊ทธ๋•Œ, ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์„œ์šธ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ฉด์„œ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์— ๋†€๋ผ์šด ๊ฐ€๋Šฅ์„ฑ์˜ ์„ธ๊ณ„๊ฐ€ ํŽผ์ณ์ง
  • ์นœ์ˆ™ํ•˜์ง€ ์•Š์€ API์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ์‹คํ—˜๊ณผ ํƒ๊ตฌ๋ฅผ ํ—ˆ์šฉ
  • and it adds an element of fun that can sometimes be impeded by more static languages and long compilation cycles.
  • ํ•˜์ง€๋งŒ, ํด๋กœ์ €๋Š” ๊ทธ๋ƒฅ ์žฌ๋ฏธ๋งŒ ์ถ”๊ตฌํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.์žฌ๋ฏธ์žˆ๋Š”๊ฑด ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์ด์ œ๊นŒ์ง€ ์ƒ์ƒํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค ์ƒ์‚ฐ์ ์ด๊ฒŒ ํ•˜๋Š” ํž˜์„ ์คŒ์œผ๋กœ์จ ์ƒ๊ธฐ๋Š” ๋ถ€์‚ฐ๋ฌผ์ด๋‹ค.

Empowerment (๊ถŒํ•œ)

  • ์ผ๋ถ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ํ•™๊ณ„์˜ ํŠน์ • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋˜๋Š” ์ „์‚ฐ์˜ ํŠน์ • ์ด๋ก ์„ ํƒ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค.
  • ํด๋กœ์ €๋Š” ๊ทธ๋Ÿฐ ๋ถ€๋ฅ˜๋Š” ์•„๋‹ˆ๋‹ค.
  • Rich Hickey- ํด๋กœ์ €๋Š” ์žฌ๋ฏธ์žˆ๊ณ , ์œ ์šฉํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒํ•œ๋‹ค๊ณ  ๋งŽ์ด ๋งํ•ด์™”๋‹ค.
  • ์ด ๋ชฉํ‘œ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด, ํด๋กœ์ €๋Š” ์ž‘์—…์ด ์ด๋ฃจ์–ด์ง€๊ธฐ ์œ„ํ•œ ์‹ค์šฉ์  ํˆด์ด๋˜๋ ค ๋…ธ๋ ฅํ•œ๋‹ค.

If a decision about some design point in Clojure had to weigh the trade-offs between the practical solution and a clever, fancy, or theoretically pure solution, usually the practical solution won out.

  • ํ”„๋กœ๊ทธ๋ž˜๋จธ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์‚ฌ์ด์—์„œ ์ดํ•ด๊ฐ€๋Šฅํ•œ API๋ฅผ ์‚ฝ์ž…ํ•จ์œผ๋กœ์จ ์ž๋ฐ”๋กœ ๋ถ€ํ„ฐ ๋ณดํ˜ธ(๋ณด์žฅ)ํ•ด์ฃผ๋ ค ๋…ธ๋ ฅํ•จ.
  • ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ๋ถˆํŽธํ•˜๊ฒŒ ์„œ๋“œํŒŒํ‹ฐ ์ž๋ฐ”๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•จ
  • ๊ทธ๋ž˜์„œ ํด๋กœ์ €๋Š” ๋‹ค๋ฅธ ๊ธธ์„ ๊ฐ„๋‹ค. : direct, wrapper-free, ์ž๋ฐ”์˜ ํด๋ž˜์Šค์™€ ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•ด ๊ฐ™์€ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผ.
  • ํด๋กœ์ €์˜ ์ŠคํŠธ๋ง์€ ์ž๋ฐ”์˜ ์ŠคํŠธ๋ง์ด๊ณ  ,ํด๋กœ์ €์Šคํฌ๋ฆฝํŠธ์˜ ์ŠคํŠธ๋ง์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ŠคํŠธ๋ง์ด๋‹ค.
  • ํด๋กœ์ €์™€ ํด๋กœ์ € ์Šคํฌ๋ฆฝํŠธ์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ์›์‹œ์  ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์ด๋‹ค
  • ์ด๊ฒƒ์€ ๊ฐ„๋‹จํ•˜๊ณ  ์ง์ ‘์ ์ด๊ณ ,์‹ค์šฉ์ ์ด๋‹ค.
  • Java ๊ฐ€์ƒ๋จธ์‹ ์„ (JVM)์‚ฌ์šฉํ•˜๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ฒฐ์ •์€ ์‹ค์šฉ์„ฑ์˜ ๋ช…ํ™•ํ•œ ์˜ˆ์ด๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด JVM์€ ๋†€๋ž๊ฒŒ ์‹ค์šฉ์ ์ธ ํ”Œ๋žซํผ์ด๋‹ค
    • ์„ฑ์ˆ™ํ•˜๊ณ  ๋น ๋ฅด๊ณ  ๋„๋ฆฌ ๋ฐฐํฌ๋œ๋‹ค.
  • ๋‹ค์–‘ํ•œ ํ•˜๋“œ์›จ์–ด์™€ OS๋ฅผ ์ง€์›ํ•˜๊ณ , ๋ง‰๋Œ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ง„๋‹ค. ํด๋กœ์ €๋Š” ์ƒ์ž๋ฅผ ์—ด์ž๋งˆ์ž ๋ฐ”๋กœ ํ™œ์šฉ ๊ฐ€๋Šฅํ•œ ์žฅ์ ์„ ๋‹ค ๊ฐ–๋Š”๋“ฏ?
  • ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ํด๋กœ์ € ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ธŒ๋ผ์šฐ์ €, ์„œ๋ฒ„, ๋ชจ๋ฐ”์ผ ๋””๋ฐ”์ด์Šค, db ์ฒ˜๋ฆฌ ์Šคํฌ๋ฆฝํŠธ๊นŒ์ง€..์œ ๋น„์ฟผํ„ฐ์Šค์— ๊ฐ€๊นŒ์šด ์žฅ์ ์„ ๊ฐ™๋Š”๋‹ค.
  • ์ง์ ‘ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ, ํ”„๋ก์‹œ, gen-class, gen-interface, ๊ตฌ์ฒดํ™”,reify, definterface, deftype, and defrecord (see section 9.3)..์™€ ํ•จ๊ป˜, ํด๋กœ์ €๋Š” ๋ง‰๋Œ€ํ•œ ์ƒํ˜ธ ์šด์šฉ์˜ ์˜ต์…˜์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋นก์„ธ๊ฒŒ ์ผํ•œ๋‹ค. ๋„ˆ์˜ ์ž‘์—…์„ ๋๋‚ด๊ธฐ ํ•˜๋ ค ๋„์›€์„ ์ฃผ๊ธฐ์œ„ํ•ด.
  • ์‹ค์šฉ์ ์ธ ๊ฒƒ์€ ํด๋กœ์ €์—์„œ ์ค‘์š”ํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ๋งŽ์€ ์–ธ์–ด๋“ค๋„ ์‹ค์šฉ์ ์ด๋‹ค.
  • ๋’ค์ฃฝ๋ฐ•์ฃฝ์„ ํ”ผํ•˜๋Šฅ..

๋„๋ฉ”์ธ ํŠน์„ฑ์ ์ธ ์–ธ์–ด๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ•๋ ฅํ•œ ์–ธ์–ด.

Clarity (๋ช…๋ฃŒ์„ฑ)

When beetles battle beetles in a puddle paddle battle and the beetle battle puddle is a puddle in a bottle ... they call this a tweetle beetle bottle puddle paddle battle muddle. โ€”Dr. Seuss2

python์ฝ”๋“œ

# This is Python code
x = [5]
process(x)
x[0] = x[0] + 1

์ด์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ ํ›„ x์˜ ๊ฐ’์€? process๊ฐ€ x์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด, ์ด๊ฒƒ์€ 6์ด๋‹ค. ํ•˜์ง€๋งŒ ์–ด๋–ป๊ฒŒ ๊ทธ๋Ÿฐ๊ฐ€์ •์„ ํ• ๊นŒ? process๊ฐ€ ๋ฌด์—‡์„ํ• ์ง€ ์ •ํ™•ํžˆ ์•Œ์ง€ ์•Š๊ณ ์„œ๋Š”, ์ € ํ•จ์ˆ˜๊ฐ€ ๋ถˆ๋ ธ์„ ๋•Œ ํ™•์‹ ํ•  ์ˆ˜ ์—†๋‹ค.

์‹ฌ์ง€์–ด process๊ฐ€ x์˜ ๊ฐ’์„ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ™•์‹ ํ–ˆ๋‹คํ•˜๋”๋ผ๋„, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚œ๋‹ค. ์ผ๋ถ€ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ฒซ์งธ์ค„๊ณผ ์…‹์งธ์ค„ ์‚ฌ์ด์—์„œ x๊ฐ’์„ ๋ฐ”๊พผ๋‹ค๋ฉด? ์•„์ง ๋‚˜์˜์ง„ ์•Š์ง€๋งŒ, ์„ธ๋ฒˆ์งธ ๋ผ์ธ์ด ์‹คํ–‰๋˜๋Š” ์ค‘์— ๋ฌด์–ธ๊ฐ€๊ฐ€ x๊ฐ’์„ ์ •ํ•œ๋‹ค๋ฉด ํ”Œ๋žซํผ์ด atomicํ•˜๊ฒŒ ๋ณ€์ˆ˜์— ๊ฐ’์„ ์“ฐ๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์„ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ๋‚˜? ๋˜๋Š” ๋‹ค์ค‘ ์“ฐ๊ธฐ๋กœ ์„ž๋Š”๊ฒƒ์ด (?) ๊ฐ€๋Šฅํ•œ๊ฐ€ ์šฐ๋ฆฌ๋Š” ๋ช…ํ™•์„ฑ์„ ์–ป๊ธฐ์œ„ํ•œ ํฌ๋งํ•˜๋ฉฐ ์ƒ๊ฐ์„ ์ง€์†ํ• ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋ช…๋ฃŒํ•ด์งˆ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒฐ๋ก ์€ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

ํด๋กœ์ €๋Š” ์ˆ˜๋งŽ์€ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ๋ณต์žกํ•จ์„ ํ”ผํ•˜๋Š” ํˆด์„ ์ œ๊ณตํ•จ์œผ๋กœ์จ ์ฝ”๋“œ์˜ ๋ช…๋ฃŒ์„ฑ์„ ์œ„ํ•ด ๋…ธ๋ ฅํ•จ ๋ฐฉ๊ธˆ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ๋Š”, ๋ฐ”๊ฟ€์ˆ˜ ์—†๊ณ  ์ง€์†๊ฐ€๋Šฅํ•œ ์ฝœ๋ ‰์…˜์„ ์ œ๊ณตํ•ด์„œ ์‹ฑ๊ธ€&๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์ด์Šˆ๋ฅผ ์—†์•ฐ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด๊ฐ€ ์„œ๋กœ๋‹ค๋ฅธ ํ–‰์œ„๋“ค์„ ํ•˜๋‚˜์˜ ๊ตฌ์กฐ์ฒด์•ˆ์— ํ•ฉ์น ๋•Œ,์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ๋ณต์žกํ•œ ๊ฒƒ๋“ค๋„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ํด๋กœ์ €๋Š” concern ๋ถ„๋ฆฌ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ„๋ฅผ ๋Šฆ์ถ”์ง€ ์•Š๊ณ  ์ด์— ๋Œ€ํ•ญํ•œ๋‹ค.

When things start off separated, it clarifies your thinking and allows you to recombine them only when and to the extent that doing so is useful for a particular problem.

ํ‘œ 1.1์„ ๋ด…์‹œ๋‹ค!

AOP

(Aspect Oriented Programming: AOP) : ๊ด€์ ๋ถ„๋ฆฌ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ cross cutting concern / ํšก์  ์ฝ”๋”ฉ ๊ณตํ†ต๊ดด๋Š” ๊ฑด ํ•จ์ˆ˜๋กœ ๋บ„์ˆ˜ ์žˆ์ง€ ์ถ”์ƒํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋™์ž‘์„ ๋บŒ.

ํ•ฉ์ณ์ง„ | ๋ถ„๋ฆฌ๋œ ๋ณ€๊ฒฝ๊ฐ€๋Šฅํ•œ ํ•„๋“œ๋ฅผ ๊ฐ€์ง„ ์˜ค๋ธŒ์ ํŠธ | ๋™์ผํ•œ ๊ฐ’ ๋ฉ”์†Œ๋“œ๋ฅผ ์œ„ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ํ–‰ํ•˜๋Š” ํด๋ž˜์Šค

์ƒ์„ฑ, ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ๊ฑฐ์ด ์•„๋‹ˆ๋ผ ์ข€๋” ๋ถ„๋ฆฌ

Consistency(์ผ๊ด€์„ฑ)

ํด๋กœ์ €๋Š” ์ผ๊ด€์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ์œ„ํ•ด ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. - ์‹ ํƒ์Šค์™€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ

์‹ ํƒ์Šค์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ์ผ๊ด€์„ฑ : Clojure์˜ ๋‘ ๊ฐ€์ง€ ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ•์— ์ผ๊ด€์„ฑ์„ ์ œ๊ณตํ•˜๋„๋ก ์ž‘๋™ํ•œ๋‹ค. ๊ตฌ๋ฌธ์˜ ์ผ๊ด€์„ฑ ๊ด€๋ จ ๊ฐœ๋… ์‚ฌ์ด์˜ ํ˜•ํƒœ์˜ ์œ ์‚ฌ์„ฑ์— โ€‹โ€‹๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ค‘ ํ•˜๋‚˜๋Š” ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๊ฐ•๋ ฅํ•œ ์˜ˆ์ œ ๋ฐ doseq ๋งคํฌ๋กœ์˜ ๊ณต์œ  ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค. doseq ์‚ฌ์ด๋“œ ์ƒ์„ฑํ•˜๋Š” ๋ฐ˜๋ฉด, ๊ทธ๋“ค์€ ๊ฐ™์€ ์ผ์„์œ„ํ•œ ๋ฐ˜ํ™˜ ๊ฒŒ์œผ๋ฅธ ์„œ์—ด์„ํ•˜์ง€ ์•Š๋Š” ํšจ๊ณผ๋ฅผ -ํ•˜์ง€๋งŒ ๋ชจ๋‘ ์ค‘์ฒฉ ITERA - ๊ธฐ, destructuring ๊ฐ™์€ ๋ฏธ๋‹ˆ ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜๊ณ  : ์–ธ์ œ : ๊ฒฝ๋น„์›์žˆ๋‹ค. Clojure์˜ ์ฝ”๋“œ์˜ ๋‹ค์Œ ์˜ˆ๋ฅผ ๋น„๊ตํ•˜๋ฉด ์œ ์‚ฌ์ ์ด ๋ˆˆ์— ๋„๋Š”. ๊ฐ ์˜ˆ์ œ๋Š” ํ‚ค์›Œ๋“œ ๋˜๋Š” B ์ค‘ ํ•˜๋‚˜, 5๋ณด๋‹ค ์ž‘์€ ์–‘์˜ ํ™€์ˆ˜์˜ ์ •์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜•์„ฑ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค ์ฒซ ๋ฒˆ์งธ ์˜ˆ๋Š” ์ดํ•ด๋ฅผ ์œ„ํ•ด๋กœ ์•Œ๋ ค์ง„ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์Œ์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. : ย ย ย ย ย ย ย ย  (์šฉ [X์˜ [A : B], Y (๋ฒ”์œ„ 5) : (ํ™€์ˆ˜ Y)] ย ย ย ย ย ย ย ย ย ย  [X, Y]) ย ย ย ย ย ย ย ย  ;; => ([: 1] [: 3] [: B 1] [: B 3])

๋‘ ๋ฒˆ์งธ ์˜ˆ๋Š” ์Œ์„ ์ธ์‡„ ํ•  doseq๋ฅผ ์‚ฌ์šฉ (doseq [X์˜ [A : B], Y (๋ฒ”์œ„ 5) :์‹œ (ํ™€์ˆ˜ Y)] ย ย  (PRN์˜ x ๋ฐ y)) ; : 1 ; : 3 ; : B 1 ; : B 3 ;; => ์ „๋ฌด ์ด ์œ ์‚ฌ์„ฑ์˜ ๊ฐ’์€ ํ•˜๋‚˜์˜ ๊ธฐ๋ณธ์ ์ธ ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ํ•œ ํ˜•ํƒœ์˜ ํŠน์ • ์‚ฌ์šฉ์„ ๋ณ€ํ™˜ ํ•  ์ˆ˜์žˆ๋Š” ์šฉ์ด์„ฑ์„ ๋ฐฐ์šธ ํ•„์š”๊ฐ€์žˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ์ผ๊ด€์„ฑ์€ ๊ฐ€๋Šฅํ•œ ํ•œ ์„œ๋กœ ๋น„์Šทํ•œ๋ฟ๋งŒ๋งŒํผ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์œ ์šฉ ๊ฐ€๋Šฅํ•œ ๊ทธ๋“ค์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ง€์†์ ์œผ๋กœ Clojure์˜ ์ปฌ๋ ‰์…˜ ์œ ํ˜• ๋ชจ๋‘์˜ ์˜๋„์  ์ธ ๋””์ž์ธ์ด๋‹ค. ์ด๊ฒƒ์€ ๊ณ ์ „ ๋ฆฌ์Šคํ”„์˜ ํ™•์žฅ ์ฒ ํ•™ "์ฝ”๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค"์ž…๋‹ˆ๋‹ค. Clojure์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ๋‹จ์ง€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ์ดํ„ฐ์˜ ๋งŽ์€ ์–‘์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž์ฒด์˜ ํ‘œํ˜„ ์š”์†Œ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก. ๊ทธ๋“ค์€ destructuring ์–‘์‹์„ ์„ค๋ช…ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋‚ด์žฅ ํ•จ์ˆ˜๋ผ๋Š” ์˜ต์…˜์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์œ ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ถŒ์žฅ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๊ฒฝ์šฐ, Clojure์˜ ํ˜ธํ™˜์ง€๋„์™€ ๊ฐ™์€ ๊ฐœ์ฒด์˜ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ์ดํ„ฐ ์˜ค๋ธŒ์ ํŠธ : ์ด๊ฒƒ์˜ ์ด์ ์€ Clojure์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ์„ค๊ณ„๋œ ํ•จ์ˆ˜์˜ ๋™์ผํ•œ ์„ธํŠธ๊ฐ€ ๋ชจ๋“  ์ƒํ™ฉ์— ์ ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋‹น์‹ ์€์ด ์•‰์•„ ์žˆ์—ˆ๋˜ isfy ๊ทธ ํŠน์ • ์กฐ๊ฑด์„ ๊ทธ ์ค‘ ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ทธ๋“ค์„ ํ†ตํ•ด ๋„๋ณด๋กœ ๊ฒŒ์œผ๋ฅธ ์„œ์—ด, ํ•„ํ„ฐ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์„œ์—ด์„ ๊ตฌ์ถ•ํ•˜๊ธฐ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์–ด๋””์—์„œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋ชจ๋“  ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์˜ ํ’์š” ๋กœ์›€์„ ๊ฐ–๋Š” Java ๋˜๋Š” C + + ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐœ์ธ ๋˜๋Š” ์ฃผ์†Œ ํด๋ž˜์Šค ์ฒ˜๋ฆฌ์— ์ต์ˆ™ํ•ด ์ ธ ์ผ๋‹จ ๊ตฌ์† ๋Š๋‚„ ๊ฒƒ์ด๋‹ค. ๋‹จ์ˆœ์„ฑ, ์ดˆ์  ์ž์œ , ๊ถŒํ•œ ๋ถ€์—ฌ, ์ผ๊ด€์„ฑ, ๊ทธ๋ฆฌ๊ณ  Clojure์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๋ช…ํ™•์„ฑ - ๊ฑฐ์˜ ๋ชจ๋“  ์š”์†Œ๋Š” ์ด๋Ÿฌํ•œ ๋ชฉํ‘œ๋ฅผ ์ด‰์ง„ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Clojure์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ๋‹น์‹ ์ด ์—ผ๋‘์— ๋‹จ์ˆœ, ๊ถŒํ•œ ๋ถ€์—ฌ, ์†์— ์ง„์งœ ๋ฌธ์ œ์— ์ดˆ์ ์„ ๋งž์ถœ ์ˆ˜์žˆ๋Š” ์ž์œ ๋ฅผ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์š•๋ง์„ ์œ ์ง€ํ•˜๋Š” ๊ฒฝ์šฐ์—, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์ด Clojure์˜ ๋‹น์‹ ์—๊ฒŒ ๋‹น์‹ ์ด ์„ฑ๊ณตํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋„๊ตฌ๋ฅผ ์ œ๊ณต ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Why a(nother) Lisp?

Beauty

But whatโ€™s with all the parentheses?

Functional programming

A workable definition of functional programming

The implications of functional programming

Why Clojure isnโ€™t especially object-oriented

Defining terms

Imperative โ€œbaked inโ€

OOP gives you, Clojure provides

Summary

Clone this wiki locally