λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Language/JavaScript

[JavaScript] JavaScript의 μΌκΈ‰κ°μ²΄λž€?

 

 

 

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 일급 객체가 무엇인지 μ•Œμ•„λ³΄κΈ° 전에 ν•¨μˆ˜μ˜ 선언식과 ν‘œν˜„μ‹μ— λŒ€ν•΄ 짚고 λ„˜μ–΄κ°€λ³΄κ² μŠ΅λ‹ˆλ‹€.

ν•¨μˆ˜ 선언식 & ν•¨μˆ˜ ν‘œν˜„μ‹

μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜μ—λŠ” 선언식(Function Declarations)κ³Ό ν‘œν˜„μ‹(Function Expressions)이 μžˆμŠ΅λ‹ˆλ‹€.

ν•¨μˆ˜ 선언식

function f1() {
  // ...
}

ν•¨μˆ˜ ν‘œν˜„μ‹

  • ν‘œν˜„μ‹μ—λŠ” μ•„λž˜μ™€ 같이 두가지 방식이 μžˆμŠ΅λ‹ˆλ‹€.
const a = function f1() {
  //...
};

const b = () => {
  // ν™”μ‚΄ν‘œ ν•¨μˆ˜(Arrow Functions)
};

 

 

ν‘œν˜„μ‹μ—μ„œλŠ” λ³€μˆ˜μ— ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ΄ μ•„λ‹ˆλΌ ν•¨μˆ˜ 자체λ₯Ό λ‹΄λŠ” λͺ¨μ–‘μƒˆμž…λ‹ˆλ‹€.

선언식과 달리 λ³€μˆ˜μ— ν•¨μˆ˜λ₯Ό μ–΄λ–»κ²Œ λŒ€μž…ν•  수 μžˆλŠ” κ²ƒμΌκΉŒμš”?

이것을 μ΄ν•΄ν•˜κΈ° μœ„ν•΄ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 객체의 의미λ₯Ό 이해해야 ν•  ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€.

 

 

μžλ°”μŠ€ν¬λ¦½νŠΈ μžλ£Œν˜•

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μžλ£Œν˜•μ€ 크게 μ›μ‹œ μžλ£Œν˜•κ³Ό 객체둜 λ‚˜λˆŒ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ›μ‹œ μžλ£Œν˜•

  • string
  • number
  • boolean
  • undefined
  • null
  • symbol

객체

  • λ°°μ—΄ [ ]
  • ν•¨μˆ˜ ( ) => { }
  • 객체 λ¦¬ν„°λŸ΄ { }

λ°°μ—΄κ³Ό ν•¨μˆ˜κ°€ 객체인 μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒμš”?

그것은 λ°”λ‘œ λ°°μ—΄κ³Ό ν•¨μˆ˜κ°€ 객체의 μ„±μ§ˆ(속성 μΆ”κ°€/μˆ˜μ •/μ‚­μ œ)을 λͺ¨λ‘ μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

κ·Έλ ‡λ‹€κ³  ν•΄μ„œ λ°°μ—΄κ³Ό ν•¨μˆ˜λ₯Ό 객체 λ¦¬ν„°λŸ΄μ²˜λŸΌ 속성을 μ‘°μž‘ν•˜λ €κ³  μ‚¬μš©ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.

배열은 μ—°κ΄€λœ 데이터λ₯Ό λ¬ΆκΈ° μœ„ν•¨μ΄κ³ , ν•¨μˆ˜λŠ” ν•˜λ‚˜μ˜ λͺ©μ μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ 독립적인 μ½”λ“œλ₯Ό λ¬ΆλŠ” μœ„ν•¨μœΌλ‘œ 각자의 μš©λ„κ°€ μžˆμŠ΅λ‹ˆλ‹€.

속성을 μ‘°μž‘ν•΄μ•Ό ν•œλ‹€λ©΄ 객체 λ¦¬ν„°λŸ΄μ„ μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.

// κ°€λŠ₯은 ν•˜μ§€λ§Œ μ΄λ ‡κ²Œ μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
const f1 = () => {};
f1.abc = 1;

console.log(f1.abc); // 1

 

일급 κ°μ²΄λž€?

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ°°μ—΄κ³Ό ν•¨μˆ˜κ°€ κ°μ²΄λΌλŠ” 것을 μ΄ν•΄ν•˜κ³ , 일급 객체에 λŒ€ν•΄ 이야기 ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

μ •μ˜

  • λ‹€λ₯Έ 객체듀에 일반적으둜 적용 κ°€λŠ₯ν•œ 연산을 λͺ¨λ‘ μ§€μ›ν•˜λŠ” 객체λ₯Ό 일급객체(first-class object)라고 ν•©λ‹ˆλ‹€.
  • 즉, ν•¨μˆ˜λ₯Ό 일반적인 κ°’μ²˜λŸΌ μ·¨κΈ‰ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
  • 'first-class'λŠ” μ‚¬μš©ν•  λ•Œ λ‹€λ₯Έ μš”μ†Œλ“€κ³Ό 차별을 두지 μ•ŠλŠ”λ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜λŠ” μΌκΈ‰κ°μ²΄μž…λ‹ˆλ‹€.
  • 일급객체 κ°œλ…μ€ ν•˜λ‚˜μ˜ 언어적인 νŠΉμ„±μœΌλ‘œ, μžλ°”μŠ€ν¬λ¦½νŠΈμ—λ§Œ κ΅­ν•œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. (Python, Go, Java λžŒλ‹€ λ“±)

 

쑰건

일급 객체가 되기 μœ„ν•œ 쑰건을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

1. λ³€μˆ˜μ— λŒ€μž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • ν•¨μˆ˜κ°€ 일급 객체이기 λ•Œλ¬Έμ— ν•¨μˆ˜ ν‘œν˜„μ‹μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— λŒ€μž…ν•  수 μžˆλ‹€κ³  ν•΄μ„œ μžλ£Œν˜•μ΄ κ°μ²΄μ—μ„œ μ›μ‹œμžλ£Œν˜•μœΌλ‘œ λ°”λ€ŒλŠ” 것은 μ•„λ‹™λ‹ˆλ‹€.
const f1 = function () {
  console.log("Hello World");
};

// μžλ£Œν˜• 확인
console.log(typeof f1); // 'function'

 

 

 

2. ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°λ‘œ 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • ν•¨μˆ˜κ°€ 일급 객체이기 λ•Œλ¬Έμ— 콜백 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ‹€λ₯Έ ν•¨μˆ˜μ˜ 인자둜 μ „λ‹¬λ˜λŠ” ν•¨μˆ˜λ₯Ό 콜백 ν•¨μˆ˜(callback function)라고 ν•©λ‹ˆλ‹€. 
// μ˜ˆμ‹œ : 이벀트 λ¦¬μŠ€λ„ˆ 등둝
button.addEventListener('click', () = > {
  console.log('λ²„νŠΌ 클릭')
});

 

3. ν•¨μˆ˜μ˜ λ¦¬ν„΄κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • ν•¨μˆ˜κ°€ 일급 객체이기 λ•Œλ¬Έμ— κ³ μ°¨ν•¨μˆ˜λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν•¨μˆ˜λ₯Ό 인자둜 μ „λ‹¬λ°›κ±°λ‚˜ ν•¨μˆ˜λ₯Ό 결과둜 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό κ³ μ°¨ν•¨μˆ˜(high order function)라고 ν•©λ‹ˆλ‹€.
  • κ³ μ°¨ν•¨μˆ˜μ˜ ν™œμš©ν•  수 μžˆλŠ” μ˜ˆμ‹œλ‘œ 컀링(currying)이 μžˆμŠ΅λ‹ˆλ‹€. 컀링은 μ›λž˜ μ—¬λŸ¬ 개의 인자λ₯Ό λ°›λŠ” ν•¨μˆ˜λ₯Ό 단일 인자λ₯Ό λ°›λŠ” ν•¨μˆ˜λ‘œ λ³€ν™˜ν•˜λŠ” κΈ°λ²•μž…λ‹ˆλ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν΄λ‘œμ €(ν•¨μˆ˜κ°€ μ„ μ–Έλœ ν™˜κ²½μ„ κΈ°μ–΅ν•˜λŠ” ν•¨μˆ˜)λ₯Ό 톡해 μ™ΈλΆ€ λ³€μˆ˜λ₯Ό 계속 μ‚¬μš©ν•  수 μžˆλŠ”λ°, 이 뢀뢄을 컀링에 ν™œμš©ν•˜λ©΄ ν•¨μˆ˜μ˜ μž¬μ‚¬μš©μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.
const multiply = (a) => (b) => a * b;
const double = multiply(2);
const triple = multiply(3);

// aκ°€ 각각 2, 3μ΄λΌλŠ” 것을 κΈ°μ–΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
double(5);  // 2 * 4 = 10
triple(7);  // 3 * 7 = 21

 

κ²°λ‘ 

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜λŠ” μΌκΈ‰κ°μ²΄μž…λ‹ˆλ‹€.
  • μΌκΈ‰κ°μ²΄λŠ”
    • λ³€μˆ˜λ‚˜ 데이터에 담을 수 있으며
    • ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°λ‘œ 전달할 수 있으며
    • ν•¨μˆ˜μ˜ λ¦¬ν„΄κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ”°λΌμ„œ ν•¨μˆ˜ν‘œν˜„μ‹, μ½œλ°±ν•¨μˆ˜, κ³ μ°¨ν•¨μˆ˜ λ“±μ˜ μ‚¬μš©μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

μ°Έκ³ 

'Language > JavaScript' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[JavaScript] parseInt( ) vs Number( )  (1) 2024.08.27
[JavaScript] for...in κ³Ό for...of의 차이  (0) 2024.06.28