🀿 (4) Generator ν•¨μˆ˜λž€?

KayΒ·2023λ…„ 3μ›” 8일
0

Javascript

λͺ©λ‘ 보기
5/12

이전 κΈ€ β€œ(3) λΈŒλΌμš°μ € λ Œλ”λ§ κ³Όμ • 탐ꡬ - HTML νŒŒμ„œβ€μ—μ„œ

html λ¬Έμžμ—΄μ„ ν•˜λ‚˜μ”© 순차적으둜 ν™•μΈν•˜κΈ° μœ„ν•΄ Generator ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κ²Œ λ˜μ—ˆλ‹€.

Generator ν•¨μˆ˜μ— λŒ€ν•΄ μ•Œμ•„λ³΄μž!

Generator ν•¨μˆ˜λž€?

ES6μ—μ„œ λ„μž…λœ ν•¨μˆ˜λ‘œ MDN λ¬Έμ„œμ— λ”°λ₯΄λ©΄ β€œλΉ μ Έλ‚˜κ°”λ‹€κ°€ λ‚˜μ€‘μ— λ‹€μ‹œ λŒμ•„μ˜¬ 수 μžˆλŠ” ν•¨μˆ˜β€λΌκ³  ν‘œν˜„ν•œλ‹€.

μΌλ°˜ν•¨μˆ˜μ™€μ˜ 차이점은 μΌλ°˜ν•¨μˆ˜μ²˜λŸΌ ν•¨μˆ˜ 호좜 μ‹œ λ°”λ‘œ μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” 것이 μ•„λ‹Œ, λŒ€μ‹  싀행을 μ²˜λ¦¬ν•˜λŠ” Iterator 객체가 λ°˜ν™˜λœλ‹€λŠ” 점이닀.

ν’€μ–΄ μ„€λͺ…ν•˜μžλ©΄ ν•¨μˆ˜ μ‹€ν–‰ 쀑에 쀑간에 μΌμ‹œμ •μ§€(pause)ν•˜κ³  λ™μž‘μ„ 재개(resume)ν•  수 μžˆλŠ” ν•¨μˆ˜μ΄λ‹€.

이λ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” 것이 yield ν‚€μ›Œλ“œμ΄λ©°, yield ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œ ν•¨μˆ˜λŠ” Iterable 객체λ₯Ό λ°˜ν™˜ν•œλ‹€.

Iteratorλž€?

ES6에 λ„μž…λœ ν‘œν˜„λ²•(protocol)이닀.

for...of κ΅¬λ¬Έμ—μ„œ μ–΄λ–€ value듀을 λ°˜λ³΅ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλŠ” 객체λ₯Ό μ˜λ―Έν•˜λ©°,

String,Β Array,Β TypedArray,Β Map,Β SetΒ λŠ” λͺ¨λ‘ λ‚΄μž₯ iterable 이닀.

μ‚¬μš©μžκ°€ μ •μ˜ν•˜μ—¬ λ§Œλ“€ 수 있으며, yield ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

Generator ν•¨μˆ˜ ꡬ쑰

κ΅¬μ‘°λŠ” 일반 ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜λŠ” 방법과 λΉ„μŠ·ν•˜λ©° *을 λΆ™μ—¬μ€€λ‹€λŠ” μ μ—μ„œ λ‹€λ₯΄λ‹€.

function* name([param, [, param, [, ...param]]]) {
	statements
}
  • name: ν•¨μˆ˜λͺ…
  • param: ν•¨μˆ˜μ— μ „λ‹¬λ˜λŠ” 인수의 이름.
  • statements ν•¨μˆ˜μ˜ 본체λ₯Ό κ΅¬μ„±ν•˜λŠ” ꡬ문
function* generator(i) {
  yield i;
  yield i + 10;
}

const gen = generator(10);

console.log(gen.next().value);
// Expected output: 10

console.log(gen.next().value);
// Expected output: 20
  • yield ν‚€μ›Œλ“œλ₯Ό 톡해 ν•¨μˆ˜ λ‚΄μ—μ„œ 순차적으둜 싀행될 ꡬ문을 μž‘μ„±ν•˜κ³ ,
  • next() λ₯Ό ν˜ΈμΆœν•˜λ©΄ 진행이 λ©ˆμ·„λ˜ μœ„μΉ˜μ—μ„œλΆ€ν„° μž¬μ‹€ν–‰λœλ‹€.
    • next()λŠ” 항상 μ•„λž˜ 두 ν”„λ‘œνΌν‹°λ₯Ό 가진 객체λ₯Ό λ°˜ν™˜ν•œλ‹€.
      • value: μ‚°μΆœ κ°’
      • done: ν•¨μˆ˜ μ½”λ“œ 싀행이 λλ‚¬μœΌλ©΄Β true, μ•„λ‹ˆλΌλ©΄Β false

μ΄ν„°λ ˆμ΄ν„°λŠ” for...of ꡬ문을 톡해 값을 얻을 μˆ˜λ„ μžˆλ‹€.

function* generateSequence() {
  yield 1;
  yield 2;
  return 3;
}

let generator = generateSequence();

for(let value of generator) {
  alert(value); // 1, 2κ°€ 좜λ ₯됨
}
  • 주의점: for...of ꡬ문을 톡해 값을 얻을 경우 done: false인 value만 좜λ ₯λ˜λ―€λ‘œ returnλ˜λŠ” 값은 좜λ ₯λ˜μ§€ μ•ŠλŠ”λ‹€.
    • λͺ¨λ“  값을 좜λ ₯ν•˜κ³  μ‹ΆμœΌλ©΄ μ˜ˆμ‹œ 속 return을 yield ν‚€μ›Œλ“œλ‘œ λ°”κΎΈλ©΄ λœλ‹€.

Generator μ•ˆμ˜ Generator

Generator μ•ˆμ˜ Generatorλ₯Ό μ œλ„ˆλ ˆμ΄ν„° μ»΄ν¬μ§€μ…˜(Generator Composition)이라고 ν•œλ‹€.

μ΄λ•Œ yield* 문법이 μ‚¬μš©λœλ‹€. Generator ν•¨μˆ˜ μ•ˆμ—μ„œ Generator ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ yield*λ₯Ό μ‚¬μš©ν•˜λ©΄ λ˜λŠ” 것이닀.

function* generateSequence(start, end) {
  for (let i = start; i <= end; i++) {
		yield i;
	}
}

function* generatePasswordCodes() {
  // 0..9
  yield* generateSequence(48, 57);

  // A..Z
  yield* generateSequence(65, 90);

  // a..z
  yield* generateSequence(97, 122);

}

let str = '';

for(let code of generatePasswordCodes()) {
  str += String.fromCharCode(code);
}

Generator ν•¨μˆ˜μ—μ„œ next() μΈμžκ°’μ΄ 주어진닀면?

next() μΈμžκ°’μ„ λ„£λŠ”λ‹€λ©΄ Generator μ•ˆμœΌλ‘œ 값을 μ „λ‹¬ν•˜λŠ”λ°, μ˜ˆμ‹œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

function* gen() {
  let ask1 = yield "2 + 2 = ?";

  alert(ask1); // 4

  let ask2 = yield "3 * 3 = ?"

  alert(ask2); // 9
}

let generator = gen();

alert( generator.next().value ); // "2 + 2 = ?"

alert( generator.next(4).value ); // "3 * 3 = ?"

alert( generator.next(9).done );

좜처: JAVASCRIPT INFO - μ œλ„ˆλ ˆμ΄ν„°

좜처

MDN λ¬Έμ„œ- function*
JAVASCRIPT INFO - μ œλ„ˆλ ˆμ΄ν„°

0개의 λŒ“κΈ€