TIL

2024.01.08 TIL #Generator함수 #값 교환하기

inz1234 2024. 1. 8. 22:02

Generator 함수

 

Generator

- * 가 붙은 함수

- 호출되면 iterator 객체를 반환 

- 이 iterator 객체는 next 메서드를 통해 제어됨

 

Yield

- generator 함수를 일시중단하는 역할 -> 호출자에게 "제어"가 반환됨(중단할지 말지)

- 반환된 값은 { value : undefined, done : <generator 함수 종료 여부> } 형태로 반환됨

 

Next

- generator 함수를 다음 yield 까지 실행  -> 실행된 yield 값을 반환 

- 만약 generator 함수가 종료되면 { value : undefined, done : true} 를 반환

 

자 그럼 이제 코드로 한번 봐 보자.

 
// (1) 제너레이터 함수 안에서 쓸 addcoffee 함수 선언 
 
 var addCoffee = function(prevName, name) {
    setTimeout(function() {
        coffeeMaker.next(prevName ? prevName + " ," + name : name);
    }, 500);
 };

// (2) 제너레이터 함수 선언!
 
 var coffeeGenerator = function*() {
    var espresso = yield addCoffee("", "에스프레소");  
    console.log(espresso);                        
    var americano = yield addCoffee(espresso, "아메리카노");
    console.log(americano);
    var mocha = yield addCoffee(americano, "카페모카");
    console.log(mocha);
    var latte = yield addCoffee(mocha, "카페라떼");
    console.log(latte);
 };

 var coffeeMaker = coffeeGenerator(); 
 coffeeMaker.next();
 

 

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. 그러므로 결과는 "에스프레소"  그 뒤에도 같은 방식으로~~

학... 난 너무 어려웠어...


 

삽입 정렬 구현하기를 코드로 작성해보라고 하셔서 작성해보았다.

let list = [4, 1, 2, 9, 3];

function selection(arr) {
    let n = arr.length;
    for (let i = 1; i < n; i++) {
        for (let j = 0; j < n-1; j++) {
            if (arr[ j ] > arr[ i ]) {
                let temp = arr[ j ];
                arr[ j ] = arr[ i ];
                arr[ i ] = temp;
            }
        }
    }
    return arr;
}

고심 끝에 작성해 보았는데 작성하면서 도대체  값을 교환하는 부분이 이해가 안 되었다.

                let temp = arr[j];
                arr[j] = arr[i];
                arr[i] = temp;

- 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을 마쳐야 할 것 같다ㅠㅠ