• μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ λ°°μš°λŠ” SICP - ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ 좔상화(1)

    2023. 5. 24.

    by. mason.jeong

    πŸ’‘ 1. λ‹€μˆ˜μ˜ λ‹¨μˆœ 관념을 ν•˜λ‚˜μ˜ 볡합 κ΄€λ…μœΌλ‘œ μ‘°ν•©ν•œλ‹€. λ³΅μž‘ν•œ 관념듀은 λͺ¨λ‘ μ΄λŸ°μ‹μœΌλ‘œ λ§Œλ“€μ—ˆλ‹€. 2. λ‘˜μ§ΈλŠ” 두 관념을 가져와 또 λ‹€λ₯Έ κ΄€λ…μœΌλ‘œ μ„€μ •ν•¨μœΌλ‘œμ¨ κ·Έ λ‘˜μ„ ν•˜λ‚˜μ˜ κ΄€λ…μœΌλ‘œ ν†΅ν•©ν•˜μ§€ μ•Šκ³ λ„ 두 관념을 ν•œλ²ˆμ— λ³Ό 수 있게 λ§Œλ“œλŠ” 것이닀. 관계에 κ΄€ν•œ 관념은 λͺ¨λ‘ μ΄λŸ°μ‹μœΌλ‘œ λ§Œλ“€μ–΄ 진닀. 3. μ…‹μ§ΈλŠ” ν•˜λ‚˜μ˜ 관념을 κ·Έ μ‹€μ œ μ‘΄μž¬μ— μˆ˜λ°˜ν•˜λŠ” λ‹€λ₯Έ λͺ¨λ“  κ΄€λ…μœΌλ‘œ λΆ€ν„° λΆ„λ¦¬ν•˜λŠ” 것이닀. 이λ₯Ό 좔상화 라고 ν•˜λ©° 일반적인 관념은 λͺ¨λ‘ μ΄λŸ°μ‹μœΌλ‘œ λ§Œλ“€μ–΄ 진닀. - μ‘΄ 둜크 (인간지성둠)

     

    λ“€μ–΄κ°€λ©΄μ„œ

    이 μž₯μ—μ„œλŠ” 계산적 κ³Όμ •μ΄λΌλŠ” 아이디어에 λŒ€ν•΄μ„œ κ³΅λΆ€ν–ˆμŠ΅λ‹ˆλ‹€. 계산적 과정은 μ»΄ν“¨ν„°μ•ˆμ— μ‚¬λŠ” 좔상적 쑴재라고 ν‘œν˜„ν–ˆμŠ΅λ‹ˆλ‹€. 이 과정이 점차 μ „κ°œ 되며 데이터λ₯Ό μ‘°μž‘ν•˜κ²Œ λ˜λŠ”λ° μ΄λŸ¬ν•œ νŒ¨ν„΄μ„ ν”„λ‘œκ·Έλž¨μ΄λΌκ³  ν•©λ‹ˆλ‹€.

     

    μΈμƒκΉŠμ—ˆλ˜ λ¬Έμž₯쀑 ν•˜λ‚˜λŠ” "본질적으둜 ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” μžμ‹ μ˜ μ£Όλ¬Έλ“€λ‘œ μ»΄ν“¨ν„°μ˜ μ˜ν˜Όμ„ λΆˆλŸ¬λ‚Έλ‹€. λΆˆλŸ¬λ‚Έ μ˜ν˜Όμ€ λ³Ό μˆ˜λ„ μ—†κ³  만질 μˆ˜λ„ μ—†μœΌλ©° μ–΄λ–€ 물질둜 λ§Œλ“ κ²Œ μ•„λ‹ˆμ§€λ§Œ, λ§ˆλ²•μ‚¬κ°€ 보기에 κ·Έ μ˜ν˜Όμ€ μ‘΄μž¬ν•œλ‹€. λ§ˆλ²•μ‚¬κ°€ λΆˆλŸ¬λ‚Έ 영혼처럼 계산적 과정은 μ–΄λ–€ 지적인 일을 μˆ˜ν–‰ν•œλ‹€. μ§ˆλ¬Έμ— λ‹΅ν•˜κ±°λ‚˜ μ€ν–‰μ—μ„œ λˆμ„ μ§€κΈ‰ν•˜κ³  곡μž₯μ—μ„œ λ‘œλ΄‡νŒ”μ„ μ œμ–΄ν•΄μ„œ 세상에 영ν–₯을 λΌμΉœλ‹€. μš°λ¦¬κ°€ 계산적 과정을 λΆˆλŸ¬λ‚΄κΈ°μœ„ν•΄ μ‚¬μš©ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ€ λ§ˆλ²•μ‚¬μ˜ μ£Όλ¬Έκ³Ό λΉ„μŠ·ν•˜λ‹€. 주문을 ν•˜κΈ° μœ„ν•œ μˆ˜λ‹¨μ„ 우린 ν”„λ‘œκ·Έλž˜λ° 언어라고 ν•œλ‹€."

     

    "ν•˜μ§€λ§Œ 계산적 과정은 ν”„λ‘œκ·Έλž¨λ“€μ΄ μ—„λ°€ν•˜κ³  μ •ν™•ν•˜κ²Œ μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ— λ§ˆλ²•μ‚¬μ˜ 제자 처럼 초보 ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” μžμ‹ μ΄ λΆˆλŸ¬λ‚Έ 과정이 μ–΄λ–€ 일을 ν•˜λŠ”μ§€ μ΄ν•΄ν•˜κ³  μ˜ˆμΈ‘ν•˜λŠ” 방법을 λ°°μ›Œμ•Ό ν•œλ‹€. μ‚¬μ†Œν•œ 였λ₯˜κ°€ 있으면 λ³΅μž‘ν•˜κ³  μ˜ˆμΈ‘ν•˜μ§€ λͺ»ν•œ κ²°κ³Όκ°€ λΉšμ–΄μ§ˆ 수 μžˆλ‹€."

     

    μžλ°”μŠ€ν¬λ¦½νŠΈ ν”„λ‘œκ·Έλž˜λ°

    일상적 생각듀을 μžμ—°μ–΄(ν•œκ΅­μ–΄, μ˜μ–΄, 일본어, 쀑ꡭ어)둜 ν‘œν˜„ν•˜κ³ , μ •λž΅μ μΈ ν˜„μƒλ“€μ„ μˆ˜ν•™μ  ν‘œκΈ°λ²•μœΌλ‘œ μ„œμˆ ν•˜λ“―, 계산적 과정에 κ΄€ν•œ 절차적 생각듀을 μ—¬κΈ°μ„œλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ ν‘œν˜„ν•©λ‹ˆλ‹€. μ§€λ‚œ μž₯μ—μ„œ μ„€λͺ…ν–ˆμ§€λ§Œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν”„λ‘œκ·Έλž˜λ° 언어인 μŠ€ν‚΄κ³Ό μ…€ν”„μ˜ 핡심 κΈ°λŠ₯을 λ¬Όλ €λ°›μ•˜μŠ΅λ‹ˆλ‹€. μ–΄νœ˜μˆœ λ²”μœ„(Lexically scoped), 일급 ν•¨μˆ˜λ‚˜ 동적 ν˜•μ‹ 적용 같은 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κ°€μž₯ 근본적인 섀계 원칙듀을 μŠ€ν‚΄μ—μ„œ λ¬Όλ €λ°›μ•˜μŠ΅λ‹ˆλ‹€.

     

    ECMAScript2015 μ—μ„œ μ–΄νœ˜μˆœ 일급 ν•¨μˆ˜λ₯Ό λžŒλ‹€ ν‘œν˜„μ‹μ„ 톡해 λ¬Έλ²•μ μœΌλ‘œ μ§€μ›ν•˜λŠ” 덕뢄에 ν•¨μˆ˜μ  좔상듀에 μ§μ ‘μ μœΌλ‘œ κ°„κ²°ν•˜κ²Œ μ ‘κ·Όν•  수 있으며, 동적 ν˜•μ‹ 적용 덕뢄에 μŠ€ν‚΄μ„ μ΄μš©ν•œ SICP와 μ΅œλŒ€ν•œ λΉ„μŠ·ν•˜κ²Œ μ„€λͺ…ν• μˆ˜ 있게 됐닀고 μ„€λͺ…ν•©λ‹ˆλ‹€. (이 μ±…μ—μ„œλŠ” ECMAScript 2015λ₯Ό 기본적으둜 μ μš©ν•©λ‹ˆλ‹€.)

     

    1.1 ν”„λ‘œκ·Έλž˜λ° κΈ°λ³Έ μš”μ†Œ

    ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λŠ” μš°λ¦¬κ°€ 과정에 κ΄€ν•œ 생각을 쑰직화 ν•˜λŠ” ν‹€λ‘œλ„ μž‘μš©ν•©λ‹ˆλ‹€. ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ₯Ό κ³ μ°°ν•  λ•Œ λ‹¨μˆœν•œ 아이디어듀을 μ‘°ν•©ν•΄μ„œ μ’€ 더 λ³΅μž‘ν•œ 아이디어λ₯Ό λ§Œλ“œλŠ”λ° μ‚¬μš©ν•˜λŠ” μˆ˜λ‹¨μ΄λΌλŠ” 점을 생각해야 ν•©λ‹ˆλ‹€. λͺ¨λ“  μ–Έμ–΄λŠ” 이λ₯Ό μœ„ν•΄ 세가지 λ§€μ»€λ‹ˆμ¦˜μ„ μ œκ³΅ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    • μ›μ‹œ ν‘œν˜„μ‹ - 언어와 κ΄€λ ¨λœ κ°€μž₯ λ‹¨μˆœν•œ 객체(entity)λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
    • μ‘°ν•© μˆ˜λ‹¨ - λ‹¨μˆœν•œ μš”μ†Œλ“€λ‘œλΆ€ν„° 볡합적인 μš”μ†Œλ₯Ό λ§Œλ“œλŠ”λ° 쓰인닀.
    • 좔상화 μˆ˜λ‹¨ - 볡합적인 μš”μ†Œλ“€μ— 이름을 λΆ™μ—¬μ„œ ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ λ‹€λ£¨λŠ”λ° 쓰인닀.

    ν”„λ‘œκ·Έλž˜λ°μ—μ„œ λ‹€λ£¨λŠ” μš”μ†ŒλŠ” 크게 ν•¨μˆ˜μ™€ λ°μ΄ν„°λ‘œ λ‚˜λ‰˜λŠ”λ°, 쒋은 μ–Έμ–΄λŠ” λ°˜λ“œμ‹œ μ›μ‹œ 데이터와 μ›μ‹œ ν•¨μˆ˜λ₯Ό μ„œμˆ ν•˜λŠ” κΈ°λŠ₯κ³Ό 그런 ν•¨μˆ˜λ“€κ³Ό 데이터λ₯Ό μ‘°ν•©ν•˜κ³  μΆ”μƒν™”λŠ” μˆ˜λ‹¨λ„ 제곡이 λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

     

    1.1.1 ν‘œν˜„μ‹

    이 μ±…μ—μ„œλŠ” ν”„λ‘œκ·Έλž˜λ° ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•΄ λŒ€ν™”ν˜• λ°©μ‹μ˜ 인터프리터λ₯Ό μ‚¬μš©ν• κ²ƒμ„ ꢌμž₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 인터프리터λ₯Ό 톡해 ν”„λ‘¬ν”„νŠΈμ— ν•˜λ‚˜μ˜ λ¬Έμž₯(statement)λ₯Ό μž…λ ₯ν•˜μ—¬ 인터프리터가 λ¬Έμž₯을 평가(evaluation) ν•˜μ—¬ κ²°κ³Όλ₯Ό 화면에 ν‘œμ‹œν•΄μ€λ‹ˆλ‹€. nodejs λ₯Ό μ΄μš©ν•˜μ—¬ μ½˜μ†” ν™˜κ²½μ—μ„œ λŒ€ν™”ν˜• 인터프리터λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ main.js λ₯Ό λ§Œλ“€μ–΄μ„œ μ‹€ν–‰μ‹œμΌœλ„ μ’‹μŠ΅λ‹ˆλ‹€. 

     

    μžλ°”μŠ€ν¬λ¦½νŠΈμ— μ•„λž˜μ™€ 같은 λͺ…령을 내리면

    486;

     

    μΈν„°ν”„λ¦¬ν„°λŠ” μ•„λž˜μ™€ 같은 평가λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

    486

     

    수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν‘œν˜„μ‹λ“€μ„ μ—°μ‚°μžλ‘œλ„ μ‘°ν•©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έ κ²°κ³ΌλŠ” μ—°μ‚°μžλ“€μ— ν•΄λ‹Ήν•˜λŠ” μ›μ‹œ ν•¨μˆ˜λ₯Ό ν•΄λ‹Ή μˆ˜λ“€μ— μ μš©ν•˜λŠ” 볡합 ν‘œν˜„μ‹μž…λ‹ˆλ‹€.

    137 * 349;
    486
    
    1000 - 334;
    666
    
    5 * 99;
    495
    
    10 / 4;
    2.5
    
    2.7 + 10;
    12.7

     

    μ΄λ ‡κ²Œ λ‹€λ₯Έ ν‘œν˜„μ‹μ„ κ΅¬μ„±μš”μ†Œλ‘œ λ‹΄κ³  μžˆλŠ” ν‘œν˜„μ‹μ„ 쑰합이라고 ν•˜λ©° κ°€μš΄λ° μ—°μ‚°μžκ°€ 있고 μ™Όμͺ½ 였λ₯Έμͺ½μ— ν”Όμ—°μ‚°μž ν‘œν˜„μ‹μ΄ μžˆλŠ” ν˜•νƒœμ˜ 쑰합을 μ—°μ‚°μž 쑰합이라고 λΆ€λ¦…λ‹ˆλ‹€. μ—°μ‚°μž μ‘°ν•©μ˜ 값은 μ—°μ‚°μžλ‘œ μ§€μ •λœ ν•¨μˆ˜λ₯Ό μΈμˆ˜λ“€, 즉 ν”Όμ—°μ‚°μž 값듀에 μ μš©ν•΄μ„œ κ΅¬ν• μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

     

    μ—°μ‚°μžλ₯Ό 두 ν”Όμ—°μ‚°μž 사이에 λ°°μΉ˜ν•˜λŠ”κ²ƒμ„ μ€‘μœ„ ν‘œκΈ°λ²•μ΄λΌκ³  ν•©λ‹ˆλ‹€.

    (3 * 5) + (10 - 6);
    19

     

    μˆ˜ν•™μ²˜λŸΌ μžλ°”μŠ€ν¬λ¦½νŠΈλ„ μ—°μ‚° μˆœμ„œμ˜ ν˜Όλž€μ„ ν”Όν•˜κΈ° μœ„ν•΄ μ†Œκ΄„ν˜Έλ‘œ μ—°μ‚°μž 쑰합을 λ¬Άμ„μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μ†Œκ΄„ν˜Έλ₯Ό μƒλž΅ν•΄λ„ μžλ°”μŠ€ν¬λ¦½νŠΈ μΈν„°ν”„λ¦¬ν„°λŠ” 톡상적인 방법에 따라 μ—°μ‚°μˆœμ„œλ₯Ό μ •ν•©λ‹ˆλ‹€. κ³±μ…‰κ³Ό λ‚˜λˆ—μ…ˆ 그리고 λ§μ…ˆκ³Ό λΊΌμ…ˆ μˆœμœΌλ‘œμš”. 예λ₯Ό λ“€μ–΄ λ‹€μŒμ€

    3 * 5 + 10 / 2

    λ‹€μŒμ— ν•΄λ‹Ήν•©λ‹ˆλ‹€.

    (3 * 5) + (10 / 2);

    이런 κ΄€λ‘€λ₯Ό μ—°μ‚°μžκ°€ μ™Όμͺ½ 결합됐닀고 ν•©λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ 인터프리터가 평가할 수 μžˆλŠ” ν‘œν˜„μ‹μ˜ λ³΅μž‘λ„λŠ” μ œν•œμ΄ μ—†μ§€λ§Œ μ‚¬λžŒμ΄λΌλ©΄ 이런 μ˜ˆκ°€ ν—·κ°ˆλ¦΄μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

    3 * 2 * (3 - 5 + 4) + 27 / 6 * 10

    μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 이것을 57둜 ν‰κ°€ν•˜κ² μ§€λ§Œ λ‹€μŒμ²˜λŸΌ ν‘œν˜„μ‹μ˜ μ£Όμš” κ΅¬μ„±μš”μ†Œλ₯Ό μ‹œκ°μ μœΌλ‘œ λͺ…ν™•ν•˜κ²Œ κ΅¬λΆ„ν•΄μ„œ ν‘œκΈ°ν•œλ‹€λ©΄ 덜 ν—·κ°ˆλ¦΄ 수 μžˆμŠ΅λ‹ˆλ‹€.

    3 * 2 * (3 - 5 + 4)
    +
    27 / 6 * 10;

    μ΄λ ‡κ²Œ μΈν„°ν”„λ¦¬ν„°μ—λŠ” λ³΅μž‘ν•œ λ¬Έμž₯이 주어져도 ν•˜λ‚˜μ˜ μ‚¬μ΄ν΄λ‘œ λ™μž‘ν•˜λ©° μΈν„°ν”„λ¦¬ν„°λŠ” μ‚¬μš©μžκ°€ μž…λ ₯ν•œ λ¬Έμž₯을 λ¦­κ³ , ν‰κ°€ν•˜μ—¬ 좜λ ₯ν•΄μ£ΌλŠλ° μ΄λŸ¬ν•œ μ£ΌκΈ°λ₯Ό REPL(read-evaluate-print loop) 라고 λΆ€λ¦…λ‹ˆλ‹€.

     

    1.1.2 이름 뢙이기와 ν™˜κ²½

    계산적 κ°œμ²΄μ— 이름을 λΆ™μ—¬μ„œ μ΄λ¦„μœΌλ‘œ 개체λ₯Ό μ§€μΉ­ν•˜λŠ” μˆ˜λ‹¨μ€ μ–Έμ–΄μ˜ ν•„μˆ˜ κΈ°λŠ₯μž…λ‹ˆλ‹€. μš°λ¦¬κ°€ 선언이라고 λΆˆλŸ¬μ™”λ˜ λ³€μˆ˜μ˜ 선언을 이 μ±…μ—μ„œλŠ” 계산적 κ°œμ²΄μ— 이름을 λΆ™μ΄λŠ” μˆ˜λ‹¨ 즉 좔상적 μˆ˜λ‹¨μœΌλ‘œ μ„€λͺ…ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

    const size = 2;

    이 λ¬Έμž₯에 λŒ€ν•΄ μΈν„°ν”„λ¦¬ν„°λŠ” 2λΌλŠ” 값을 sizeλΌλŠ” 이름에 μ—°κ΄€ μ‹œν‚΅λ‹ˆλ‹€. 이름이 2λΌλŠ” μˆ˜κ°€ μ—°κ΄€λ˜λ©΄ κ·Έλ•ŒλΆ€ν„° κ°’2λ₯Ό sizeλΌλŠ” μ΄λ¦„μœΌλ‘œ μ§€μΉ­ν• μˆ˜ 있게 λ©λ‹ˆλ‹€. λ‹€λ₯Έ 예λ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

    const pi = 3.14159;
    
    const radius = 10;
    
    pi = radius * radius;
    314.159
    
    const circumference = 2 * pi * radius;
    
    circumference;
    62.8318

    볡합적인 μ—°μ‚° κ²°κ³Όλ₯Ό κ°„λ‹¨ν•œ 이름인 circumference둜 지칭할 수 μžˆλ‹€λŠ” μ μ—μ„œ μƒμˆ˜μ˜ 선언은 κ°€μž₯ λ‹¨μˆœν•œ 좔상화 μˆ˜λ‹¨μ΄λΌκ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 일반적으둜 계산적 κ°μ²΄λŠ” κ·Έ ꡬ쑰가 λ³΅μž‘ν•  수 μžˆλŠ”λ° λ³΅μž‘ν•œ ꡬ쑰의 μ„ΈλΆ€ 사항을 κΈ°μ–΅ν•΄ 두고 객체λ₯Ό μ‚¬μš©ν•  λ•Œλ§ˆλ‹€ κ·Έ ꡬ쑰λ₯Ό κ±°λ“­ λͺ…μ‹œν•˜λŠ”κ²ƒμ€ λΆˆνŽΈν•˜κΈ° 떄문에 인터프리터λ₯Ό μ΄μš©ν•˜μ—¬ 이름-객체 κ°„ μƒν˜Έμž‘μš©μ„ 톡해 μ μ§„μ μœΌλ‘œ λ§Œλ“€μ–΄ λ‚˜κ°ˆ 수 μžˆμœΌλ―€λ‘œ 단계적 ν”„λ‘œκ·Έλž˜λ°μ΄ νŽΈν•΄μ§‘λ‹ˆλ‹€.

     

    이름과 값을 μ—°κ΄€ μ‹œν‚€κ³  μ΄λ¦„μœΌλ‘œλΆ€ν„° 값을 μ‘°νšŒν•  수 있으렀면 μΈν„°ν”„λ¦¬ν„°λŠ” λ°˜λ“œμ‹œ 이름-객체 μŒμ„ μ €μž₯ν•˜λŠ” λ©”λͺ¨λ¦¬ 곡간을 κ°–κ²Œ λ˜λŠ”λ° 이런 λ©”λͺ¨λ¦¬ 곡간을 ν”„λ‘œκ·Έλž¨ ν™˜κ²½(program environment) 라고 λΆ€λ¦…λ‹ˆλ‹€.

     

    1.1.3 μ—°μ‚°μž μ‘°ν•©μ˜ 평가

    이번μž₯의 λͺ©ν‘œμ€‘ ν•˜λ‚˜λŠ” 절차적 사고에 κ΄€ν•œ 논점을 잘 κ΅¬λΆ„ν•˜λŠ”κ²ƒ, 예λ₯Ό λ“€μ–΄ μ—°μ‚°μž 쑰합을 평가할떄 해석기가 λ”°λ₯΄λŠ” λ‹€μŒκ³Ό 같은 절차λ₯Ό λ³΄κ² μŠ΅λ‹ˆλ‹€.

    • 주어진 μ—°μ‚°μž 쑰합을 ν‰κ°€ν•˜κΈ° μœ„ν•΄ λ‹€μŒμ„ μˆ˜ν–‰ν•œλ‹€.
      1. μ‘°ν•©μ˜ ν”Όμ—°μ‚°μž ν‘œν˜„μ‹λ“€μ„ ν‰κ°€ν•œλ‹€.
      2. μ—°μ‚°μžκ°€ λ‚˜νƒ€λ‚΄λŠ” ν•¨μˆ˜λ₯Ό μΈμˆ˜λ“€μ— μ μš©ν•œλ‹€.

    단계 1은 주어진 μ‘°ν•©μ˜ 평가 과정을 μ™„λ£Œν•˜κΈ° μœ„ν•΄μ„œλŠ” λ¨Όμ € μ‘°ν•©μ˜ 각 ν”Όμ—°μ‚°μžλ₯Ό 평가해야 함을 이야기 ν•΄μ€λ‹ˆλ‹€. μ΄λŠ” κ·œμΉ™μ˜ ν•œ λ‹¨κ³„μ—μ„œ κ·œμΉ™ μžμ‹ μ„ μˆ˜ν–‰ν•΄μ•Ό 함을 λœ»ν•˜λ©° 이 평가 κ·œμΉ™μ€ μž¬κ·€μ μ΄λΌκ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

     

    μž¬κ·€λΌλŠ” κ°œλ… 덕뢄에 κΉŠμ— μ€‘μ²™λœ μ‘°ν•©μ˜ 평가 κ·œμΉ™λ„ κ°„κ²°ν•˜κ²Œ ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μž¬κ·€κ°€ μ—†λ‹€λ©΄ 평가 과정을 λ³΅μž‘ν•˜κ²Œ μ„œμˆ ν•΄μ•Ό ν–ˆμ–΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.

    (2 + 4 * 6) * (3 + 12);

    이 볡합 μ—°μ‚°μž 쑰합을 ν‰κ°€ν•˜λ €λ©΄ μ„œλ‘œ λ‹€λ₯Έ 넀가지 쑰합에 평가 κ·œμΉ™μ„ μ μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. κ·Έ 과정을 ν•˜λ‚˜μ˜ 트리 ν˜•νƒœλ‘œ μ‹œκ°ν™” ν• μˆ˜ μžˆλŠ”λ°. 각 λ…Έλ“œλŠ” ν•˜λ‚˜μ˜ 쑰합을 λ‚˜νƒ€λ‚΄κ³  λ…Έλ“œμ—μ„œ λ»—μ–΄ λ‚˜μ˜¨ κ°ˆλž˜λ“€μ€ κ·Έ μ‘°ν•©μ˜ μ—°μ‚°μžμ™€ ν”Όμ—°μ‚°μžλ“€λ‘œ μ΄μ–΄μ§‘λ‹ˆλ‹€. μ΄λŸ¬ν•œ 트리 ν‘œν˜„μ—μ„œ μ‘°ν•©μ˜ 평가 과정은 트리의 말단 λ…Έλ“œμ—μ„œ μΆœλ°œν•΄μ„œ ν”Όμ—°μ‚°μž 값듀을 ν•΄λ‹Ή μ—°μ‚°μžμ— 따라 κ²°ν•©ν•΄μ„œ 점차 μœ„μͺ½ λ…Έλ“œλ‘œ μ˜¬λ €λ³΄λ‚΄λŠ” 과정에 ν•΄λ‹Ήν•©λ‹ˆλ‹€. 일반적으둜 μž¬κ·€λŠ” 이처럼 트리 ν˜•νƒœμ˜ μœ„κ³„ ꡬ쑰둜 μ‘°μ§ν™”λœ 객체듀을 λ‹€λ£¨λŠ”λ° λŒ€λ‹¨νžˆ κ°•λ ₯ν•œ κΈ°λ²•μ΄μ—μš”. 이λ₯Ό 트리 λˆ„μ‚°μ΄λΌκ³  λΆ€λ¦…λ‹ˆλ‹€.

    μ—°μ‚°μž μ‘°ν•© 평가 κ³Όμ •μ˜ 트리 ν‘œν˜„, 각 λΆ€λΆ„ ν‘œν˜„μ‹μ˜ 값이 ν‘œμ‹œλ˜μ–΄ 있음.

    μ€‘μš”ν•œ 점은, 단계 1을 μž¬κ·€μ μœΌλ‘œ κ±°λ“­ μ μš©ν•˜λ‹€ 보면 쑰합이 μ•„λ‹ˆλΌ μ›μ‹œ ν‘œν˜„μ‹μ„ ν‰κ°€ν•΄μ•Όν•˜λŠ” 지점에 λ„λ‹¬ν•œλ‹€λŠ” μ μž…λ‹ˆλ‹€. ν‘œν˜„μ‹ ν‰κ°€μ—λŠ” λ‹€μŒκ³Ό 같은 κ·œμΉ™λ“€μ΄ μ μš©λ©λ‹ˆλ‹€.

    • 수치의 값은 ν•΄λ‹Ή μˆ«μžλ“€μ΄ λ‚˜νƒ€λ‚΄λŠ” λ°”λ‘œ κ·Έ 값이닀.
    • μ΄λ¦„μ˜ 값은 ν˜„μž¬ ν™˜κ²½μ—μ„œ κ·Έ 이름에 μ—°κ΄€λœ 객체이닀.

    μ—¬λ¦¬μ„œ μ€‘μš”ν•œκ±΄ ν‘œν˜„μ‹ μ•ˆμ˜ 이름이 λœ»ν•˜λŠ” λ°”λ₯Ό ν™˜κ²½μ΄ κ²°μ •ν•œλ‹€λŠ” μ μž…λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ 같은 λŒ€ν™”μ‹ μ–Έμ–΄μ—μ„œ x + 1같은 ν‘œν˜„μ‹μ˜ 값을 이야기 ν•˜λ €λ©΄ xλΌλŠ” μ΄λ¦„μ˜ 의미λ₯Ό μ œκ³΅ν•˜λŠ” ν™˜κ²½μ— κ΄€ν•œ 정보가 κΌ­ ν•„μš”ν•˜κ²Œ λ©λ‹ˆλ‹€. 평가가 μΌμ–΄λ‚˜λŠ” λ¬Έλ§₯을 μ œκ³΅ν•˜λŠ” ν™˜κ²½μ΄λΌλŠ” 일반적 κ°œλ…μ€ ν”„λ‘œκ·Έλž¨μ˜ 싀행을 μ΄ν•΄ν• λ•Œ μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€.

     

    μ£Όμ˜ν• μ μ€ 평가 κ·œμΉ™μ΄ μ„ μ–Έμ—λŠ” μ μš©λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ const x = 3 을 ν‰κ°€ν• λ•Œ 인터프리터가 두 μΈμˆ˜μ— 상동 μ—°μ‚°μž(=)λ₯Ό μ μš©ν•˜λŠ”κ²ƒμ΄ μ•„λ‹ˆλ©° κ°„λ‹¨νžˆ 말해 const x = 3은 쑰합이 μ•„λ‹™λ‹ˆλ‹€. constλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ ν‚€μ›Œλ“œμ΄λ©° ν‚€μ›Œλ“œλ₯Ό ν¬ν•¨ν•œ λ¬Έμž₯을 κ΅¬λ¬Έν˜•μ΄λΌκ³  ν•˜λŠ”λ° κ΅¬λ¬Έν˜• λ§ˆλ‹€ 고유의 평가 κ·œμΉ™μ΄ μžˆμŠ΅λ‹ˆλ‹€. λ‹€μ–‘ν•œ μ’…λ₯˜μ˜ λ¬Έμž₯λ“€κ³Ό ν‘œν˜„μ‹λ“€μ€ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ ꡬ문둠을 ν˜•μ„±ν•©λ‹ˆλ‹€.

     

    1.1.4 볡합 ν•¨μˆ˜

    μ•žμ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ ν”„λ‘œκ·Έλž˜λ°μ˜ μ›μ‹œ μš”μ†Œλ₯Ό μ‚΄νŽ΄ λ³΄μ•˜λŠ”λ° 정리λ₯Ό ν•΄λ³΄μžλ©΄

    • μˆ˜μΉ˜μ™€ μ‚°μˆ  연산은 μ›μ‹œ 데이터와 μ›μ‹œ ν•¨μˆ˜μ— ν•΄λ‹Ήν•œλ‹€.
    • μ‘°ν•©μ˜ 쀑첩은 연산듀을 μ‘°ν•©ν•˜λŠ” μˆ˜λ‹¨μ„ μ œκ³΅ν•œλ‹€.
    • 이름과 값을 μ—°κ΄€μ‹œν‚€λŠ” μƒμˆ˜ 선언은 μ œν•œμ μ΄λ‚˜λ§ˆ μΆ”μƒν™”μ˜ μˆ˜λ‹¨μ„ μ œκ³΅ν•œλ‹€.

    μ΄λ²ˆμ—λŠ” ν•¨μˆ˜ 선언을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. 볡합 연산에 이름을 뢙이고 κ·Έ 연산을 ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ μ§€μΉ­ν•˜κ²Œ ν•΄μ£ΌλŠ” ν•¨μˆ˜ 선언은 μƒμˆ˜ 언언보닀 훨씬 κ°•λ ₯ν•œ 좔상화 κΈ°λ²•μž…λ‹ˆλ‹€.

     

    μ œκ³±μ— κ΄€ν•œ ν•¨μˆ˜λ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

    function square(x) {
    	return x * x;
    }

    이것은 squareλΌλŠ” 이름이 뢙은 ν•˜λ‚˜μ˜ 볡합 ν•¨μˆ˜ μž…λ‹ˆλ‹€. 이걸 ν•˜λ‚˜μ˜ ν•¨μˆ˜ 적용 ν‘œν˜„μ‹μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    square(21);
    441

    ν•¨μˆ˜ μ μš©μ€ ν‘œν˜„μ‹λ“€λ‘œλΆ€ν„° 더 큰 ν‘œν˜„μ‹μ„ λ§Œλ“œλŠ” 또 λ‹€λ₯Έ μ’…λ₯˜μ˜ μ‘°ν•©γ…‡λΉ„λ‹ˆλ‹€. (λ‹€λ₯Έ ν•˜λ‚˜λŠ” μ—°μ‚°μž μ‘°ν•©μž…λ‹ˆλ‹€.) ν•¨μˆ˜ μ μš©μ„ 평가할 λ•Œ μΈν„°ν”„λ¦¬ν„°λŠ” μ—°μ‚°μž μ‘°ν•©μ˜ 평가 μ ˆμ°¨μ™€ μƒλ‹Ήνžˆ λΉ„μŠ·ν•œ 절차λ₯Ό λ”°λ¦…λ‹ˆλ‹€.

    • ν•¨μˆ˜μ˜ μ μš©μ„ ν‰κ°€ν•˜λ €λ©΄ λ‹€μŒμ„ μˆ˜ν–‰ν•œλ‹€.
      1. 적용의 뢀뢄식듀, 즉 ν•¨μˆ˜ ν‘œν˜„μ‹κ³Ό 인수 ν‘œν˜„μ‹λ“€μ„ 각각 ν‰κ°€ν•œλ‹€.
      2. ν•¨μˆ˜, 즉 ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ 값을 인수 ν‘œν˜„μ‹ 값듀에 μ μš©ν•œλ‹€.
    squre(2 + 5);
    49

    μœ„μ™€ 같은 경우 인수 ν‘œν˜„μ‹μ€ ν•˜λ‚˜μ˜ 볡합 ν‘œν˜„μ‹μΈ μ—°μ‚°μž μ‘°ν•© 2 + 5 μž…λ‹ˆλ‹€.

    square(square(3));
    81

    ν•¨μˆ˜ 적용 ν‘œν˜„μ‹μ„ 담은 ν•¨μˆ˜μ˜ 적용 인수 ν‘œν˜„μ‹μœΌλ‘œ μ‚¬μš©μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€. squareλ₯Ό λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” ꡬ좕 μš”μ†Œλ‘œλ„ μ‚¬μš©μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

    square(x) + square(x)

     

    μ•„λž˜λŠ” 주어진 두 수의 제곱의 합을 μ‚°μΆœν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

    function sum_of_squares(x, y) {
    	return square(x) + square(y);
    }
    
    sum_of_squares(3, 4);
    25

    더 λ‚˜μ•„κ°€μ„œ sum_of_squares 자체λ₯Ό 또 λ‹€λ₯Έ ν•¨μˆ˜μ˜ ꡬ좕 μš”μ†Œλ‘œ μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

    function f(a) {
    	return sum_of_square(a + 1, a * 2);
    }
    
    f(5);
    136

    이런 볡합 ν•¨μˆ˜λ“€ 외에 λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈ ν™˜κ²½μ€ 인터프리터 μžμ²΄μ— λ‚΄μž₯된, λ˜λŠ” ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬λ‘œλΆ€ν„° μ μž¬ν•œ μ›μ‹œν•¨μˆ˜λ“€λ„ μ œκ³΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

     

     

    λŒ“κΈ€