Generator 함수
Generator
- * 가 붙은 함수
- 호출되면 iterator 객체를 반환
- 이 iterator 객체는 next 메서드를 통해 제어됨
Yield
- generator 함수를 일시중단하는 역할 -> 호출자에게 "제어"가 반환됨(중단할지 말지)
- 반환된 값은 { value : undefined, done : <generator 함수 종료 여부> } 형태로 반환됨
Next
- generator 함수를 다음 yield 까지 실행 -> 실행된 yield 값을 반환
- 만약 generator 함수가 종료되면 { value : undefined, done : true} 를 반환
자 그럼 이제 코드로 한번 봐 보자.
1. coffeeMaker.next( ) : coffeeGenerator 함수의 결과-coffeeGenerator( ) 를 next 메서드로 순환시켜라
2. coffeeGenerator 함수의 결과가 뭔데? 따라가보자
엇 yield 만났음. yield 만나면 일단 멈추고 뒤에 addCoffee("", "에스프레소") 만 실행
3. addCoffee("", "에스프레소")
- 다시 함수네. 0.5초 뒤에 뭘 하라는 거긴 한데
- coffeeMaker.next(prevName ? prevName + " ," + name : name); 이게 무슨 말이지? (여기서 한참 헤맴)
coffeeMaker.next => 제너레이터 함수를 재개하라! 라는 뜻
4. 근데 이제 매개변수가 (prevName ? prevName + " ," + name : name);
addCoffee("", "에스프레소") 를 가지고 한다면 삼항연산자에 의해 coffeeMaker.next( "에스프레소" ) 가 되겠지?
- 여기서 중요!!
제너레이터 함수에서 next 메서드를 호출할 때, 인자를 가지면 즉, .next( "에스프레소" )
그 인자("에스프레소")는 중단한 "yield 문의 결과"로 사용됨
WOW...
5. 그래서 결과적으로 "에스프레소" 가 yield문의 결과로서 espresso라는 변수에 할당이 되고,
6. 이제 진짜 재개할 건데! 재개하라면 어디서부터 재개해야겠어 일시중단 한 그 다음인 console.log(espresso); 여기서부터지?
7. 그러므로 결과는 "에스프레소" 그 뒤에도 같은 방식으로~~
학... 난 너무 어려웠어...
삽입 정렬 구현하기를 코드로 작성해보라고 하셔서 작성해보았다.
고심 끝에 작성해 보았는데 작성하면서 도대체 값을 교환하는 부분이 이해가 안 되었다.
- arr[j] 값을 temp라는 임시 저장소에 할당하고 let temp = arr[ j ];
- 비어있는 arr[j] 자리에 arr[i] 값을 할당 arr[ j ] = arr[ i ]; -> arr[j]의 값이 변경된다.
- 그러면 또 비어있는 arr[i] 자리에, 임시저장소에 저장해두었던 arr[j]를 할당한다. arr[ i ] = temp; -> arr[ i ]의 값 변경
라는 의미였다. 한 1시간 동안 고민했다. 다음 번에는 헷갈리지 않을 것 같다.
오늘은 컨디션이 너무 안좋아서 여기서 TIL을 마쳐야 할 것 같다ㅠㅠ
'TIL' 카테고리의 다른 글
2024.01.10 TIL (0) | 2024.01.10 |
---|---|
2024.01.09 TIL #type="module" #export #import #arr.join() #클로져 #data-id="id" (0) | 2024.01.09 |
2024.01.05 TIL 새로 알게 된 점 #While문 안의try catch문 #setter 메서드 (1) | 2024.01.05 |
2024.01.04 TIL #알고리즘 #반복문 안 return문 (0) | 2024.01.04 |
2024.01.03 TIL #명시적 This binding #apply #bind (0) | 2024.01.03 |