# 수식 내 동적 배열

## Content

동적 배열 수식은 사용자가 스프레드시트에서 데이터 캐시를 효과적으로 활용하려고 할 때 특히 유용합니다. 이는 이러한 수식이 낮은 메모리 사용으로 무작위 접근을 허용하기 때문에 가능합니다.
셀에 동적 배열 수식이 포함되면, 배열의 요소들이 인접한 빈 셀로 넘쳐흐르기 때문에 여러 값이 반환됩니다. 일반 배열과 달리, 동적 배열은 데이터가 소스 범위에서 삽입되거나 제거될 때 자동으로 크기가 조정됩니다.

## **스필드 배열 수식 (Spilled Array Formulas)**

여러 개의 결과를 반환하고, 인접한 셀로 값이 넘쳐 흐르며, 여러 행과 열을 포함하는 셀 범위로 값을 확장하는 동적 배열 수식을 스필드 배열 수식(Spilled Array Formulas)이라고 합니다.

> 스필드 배열 수식은 표에서는 지원되지 않습니다. 그러나 동적 배열 수식이 여러 행과 열로 넘쳐 흐를 때, 스프레드시트에서 사용되는 셀 범위는 명시적으로 형식을 지정하여 표처럼 표시할 수 있습니다.

## **내장 동적 배열 수식**

SpreadJS는 다음과 같은 내장 동적 배열 수식을 지원합니다. 이들에 대한 자세한 정보와 예시는 아래 주제를 참조하십시오.

1. [UNIQUE](/spreadjs/docs/v18/formulareference/FormulaFunctions/lookup-reference-functions/unique)
2. [SORT](/spreadjs/docs/v18/formulareference/FormulaFunctions/lookup-reference-functions/sort)
3. [SORTBY](/spreadjs/docs/v18/formulareference/FormulaFunctions/lookup-reference-functions/sortby)
4. [RANDARRAY](/spreadjs/docs/v18/formulareference/FormulaFunctions/math-trig-functions/randarray)
5. [SEQUENCE](/spreadjs/docs/v18/formulareference/FormulaFunctions/math-trig-functions/sequence)
6. [FILTER](/spreadjs/docs/v18/formulareference/FormulaFunctions/lookup-reference-functions/filter-dynamic-array)

## **사용자 정의 동적 배열 수식**

내장 동적 배열 수식과 함께, SpreadJS는 사용자가 사용자 정의 함수를 생성하고 이를 동적 배열 수식에 사용할 수 있는 **사용자 정의 동적 배열 수식**도 지원합니다.
다음 코드 샘플은 "Selection"이라는 사용자 정의 함수가 선택된 셀 범위에 따라 셀 범위에 넘쳐 흐르는 사용자 정의 동적 배열 수식을 생성하는 예입니다.

```JavaScript
    // Spread 초기화
    var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"));
    // DynamicArray 허용
    spread.options.allowDynamicArray = true;
    // 활성 시트 가져오기
    var sheet = spread.getActiveSheet();
    // 사용자 정의 함수 "SelectionFunction" 추가
    spread.addCustomFunction(new SelectionFunction());
    spread.suspendPaint();
    // 값 설정
    sheet.setArray(6, 6, [
        [1, 2, 3, 4],
        [5, 6, 7, 8],
        [9, 10, 11, 12]
    ]);
    // 열 너비 설정
    sheet.setColumnWidth(0, 120);
    sheet.setColumnWidth(1, 120);
    // 선택 추가
    sheet.setSelection(6, 6, 3, 4);
    sheet.setValue(0, 0, "DynamicRange:");
    // "Selection" 수식 추가
    sheet.setFormula(0, 1, "=Selection()");
    spread.resumePaint();
    spread.bind(GC.Spread.Sheets.Events.SelectionChanging, function (sendar, args) {
        args.sheet.recalcAll();
    });
});

// 사용자 정의 함수
function SelectionFunction() {
    this.name = "SELECTION";
    this.minArgs = 0;
    this.maxArgs = 0;
};
SelectionFunction.prototype = new GC.Spread.CalcEngine.Functions.Function();
SelectionFunction.prototype.evaluate = function (context) {
    var sheet = context.source.getSheet();
    var sel = sheet.getSelections()[0];
    var dataArr = sheet.getArray(sel.row, sel.col, sel.rowCount, sel.colCount);
    return new GC.Spread.CalcEngine.CalcArray(dataArr);
}
SelectionFunction.prototype.isContextSensitive = function () {
    return true;
}
```