배열

배열은 값의 그룹을 보유하는 데이터 구조입니다. 배열은 유사한 유형의 항목 목록이 있을 때 유용합니다. 예를 들면 지역 목록 코드, 전화번호, 고객 이름 등이 있습니다.

Studio에서 사용할 수 있는 배열의 종류로는 다음과 같이 두 가지가 있습니다.

  • 문자 배열: 변수에서 파이프로 구분된 문자열입니다. 영숫자 글자로 구성될 수 있는 문자열 값을 보유합니다.
  • 동적 배열: 동적 데이터 개체에 저장되는 배열입니다.

데이터가 단일 엔터티에 관한 모든 다양한 유형의 정보로 구성된 목록이 있는 경우, 동적 데이터 개체가 사용하기 더욱 적합한 데이터 구조입니다. 데이터 구조 도움말 페이지에서 배열과 개체를 비교할 수 있습니다.

배열에 관한 주요 정보

  • 배열에는 최소 2가지 이상의 구성요소가 있어야 합니다. 구성요소가 1개뿐인 배열은 일반 변수로 나타납니다. 이것 역시 배열이며, 배열로서 호출할 수 있습니다. 동적 배열의 경우에도 마찬가지입니다.
  • Studio에서 배열 인덱스는 1부터 시작합니다.

  • index()indexof() 등 일부 함수를 배열과 사용할 수 있습니다.

  • 모든 구분자를 문자 배열에 사용할 수 있습니다. 하지만 기본적으로 읽으려면 문자 배열은 파이프 글자를 구분자로 사용해야 합니다.

시도해 보기

배열 예시 스크립트를 다운로드하고 Studio가져옵니다. 이 도움말 페이지의 많은 예시는 예시 스크립트의 Snippet에서 사용할 수 있습니다. 스니펫 편집기를 열고 디버거를 실행하면 예시를 볼 수 있습니다.

배열 구문 요약

다음 구문 중 하나로 문자 배열을 생성합니다.

인덱스를 사용하여 각 구성요소에 값을 할당합니다.

ASSIGN <var>[<index1>] = "<value1>"

ASSIGN <var>[<index2>] = "<value2>"

ASSIGN <var>[<index3>] = "<value3>"

모든 구성요소 값을 파이프로 구분된 문자열의 변수에 할당합니다.

ASSIGN <var> = "<value1> | <value2> | <value3>"

다음 구문으로 동적 배열을 생성합니다.

DYNAMIC <object>

ASSIGN <object>.<member>[<index>].<sub-member>= "value"

동적 배열의 추가 양식이 지원됩니다.

문자 배열에서 특정한 구성요소를 참조하려면 이 구문을 사용하십시오.

<var>[index]

동적 배열에서 특정한 구성요소를 참조하려면 이 구문을 사용하십시오.

ASSIGN <var> = <object>.<member>[<index>].<arrayElement>

구성요소 및 인덱스

배열에 보유되는 값은 구성요소라고 합니다. 스크립트는 배열 내 구성요소의 순서를 추적합니다. 배열의 각 구성요소에는 숫자 식별자가 있으며, 이는 인덱스 번호라고 부릅니다. 인덱스는 배열의 위치에 따라 각 구성요소에 자동으로 할당됩니다. 구성요소를 재배열하거나 추가하거나 제거하면 인덱스가 변경될 수 있습니다.

Studio에서 배열 인덱스는 1부터 시작합니다. 인덱스는 양수의 정수여야 합니다. 배열에서 특정한 구성요소와 상호작용할 인덱스를 알고 있어야 합니다. 구성요소의 인덱스를 모르는 경우 indexof() 함수를 사용하면 해당 인덱스를 알 수 있습니다.

문자 배열의 개별 구성요소 참조

문자 배열의 개별 구성요소를 참조할 때는 <arrayElement>[<index>] 구문을 사용하십시오. 이 구문은 등호(=) 기호의 어느 쪽에도 사용할 수 있습니다. 예를 들면 값을 다른 값으로 할당할 때처럼 구성요소에 값을 할당하거나 구성요소의 값을 참조할 때 이를 사용할 수 있습니다.

예:

ASSIGN heroes[1] = "Beowulf"
ASSIGN heroes[2] = "Sir Gawain" 
ASSIGN heroes[3] = "Byrhtnoth"

예를 들어 Beowulf의 인덱스는 1이고 Sir Gawain의 인덱스는 2이며, Byrtnoth의 인덱스는 3입니다. 파이프로 구분된 양식인  name = "Beowulf|Sir Gawain|Byrhtnoth"(으)로 배열을 볼 때 이러한 구성요소에는 동일한 인덱스가 존재합니다. 이 형식으로 배열의 인덱스를 파악하려면 왼쪽부터 오른쪽으로 구성요소를 1부터 세십시오.

인덱스는 번호 순서대로 채워집니다.

인덱스는 번호 순서대로 하나씩 채워집니다. 현재 배열에 존재하지 않는 인덱스를 참조하는 경우, 스크립트가 인덱스를 생성하며, 인덱스에 값을 할당하기 전까지는 비어 있는 상태를 유지합니다. 스크립트는 참조하는 인덱스와 배열 내의 최근 인덱스 간에 존재하지 않는 모든 인덱스를 생성합니다. 인덱스를 채우기 위해 추가되는 스크립트의 구성요소는 비어 있습니다. 예:

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth" 
ASSIGN heroes[6] = "Lancelot"

결과 배열은 heroes = "Beowulf|Sir Gawain|Byrhtnoth|||Lancelot"입니다. 스크립트가 인덱스 4와 5에 구성요소를 추가했지지만 해당 인덱스에 아무 값도 할당되지 않았기 때문에 비어 있습니다.

마찬가지로, 존재하지 않는 구성요소에서 값을 가져오면 해당 구성요소가 생성됩니다. 참조하려고 시도한 구성요소와 최근의 이전 구성요소 사이의 모든 구성요소 역시 생성되며, 빈 상태로 유지됩니다.

비어 있는 배열 구성요소가 숫자로 예상되는 컨텍스트로 참조되는 경우, 스크립트는 값이 0인 것처럼 행동합니다.

다음 미사용 인덱스 결정

배열에서 불필요하게 비어 있는 구성요소를 생성하는 경우를 방지하기 위해, 다음 미사용 인덱스를 정할 수 있습니다. 배열에서 구성요소를 센 다음 해당 숫자에 1을 더해야 합니다. 그러면 열려 있는 다음 인덱스 번호가 부여됩니다.

이를 수행하려면 size() 함수를 사용하십시오. 예:

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth"  
ASSIGN nextIndex = heroes.size() + 1
ASSIGN heroes[nextIndex] = Roland

이 예시에서 heroes.size()은(는) 이름 배열의 구성요소 개수를 반환합니다. totalNames의 값은 3입니다. 하나를 추가한 다음 nextIndex변수를 인덱스 번호 대신 사용하면 구성요소를 배열에 추가할 수 있습니다.

또한 count() 함수도 사용할 수 있습니다.

문자 배열

문자 배열은 두 가지로 정의될 수 있습니다. 일단 명시적으로 각각의 구성요소 이름을 개별적으로 부여합니다. 다음 예시에서는 구성요소별로 정의되는 텍스트 값을 포함한 문자 배열을 보여줍니다.

ASSIGN heroes[1] = "Beowulf"
ASSIGN heroes[2] = "Sir Gawain" 
ASSIGN heroes[3] = "Byrhtnoth"

배열 이름 다음에 대괄호로 묶인 숫자는 구성요소의 인덱스 번호입니다. 이는 각 구성요소의 식별자입니다.

문자 배열을 정의하는 두 번째 방법은 각 구성요소 사이에 파이프 문자(|)를 사용하여 파이프로 구분된 문자열을 사용하는 것입니다. 이 예시에서는 파이프로 구분된 문자열로 정의된 첫 예시의 배열을 보여줍니다. 파이프로 구분된 문자 배열을 생성할 때 문의 오른쪽에 있는 값은 대괄호로 묶여야 합니다.

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth"

함수 사이에는 아무런 차이가 없으며, 둘 중 아무것이나 사용할 수 있습니다. 두 가지 문자열 정의 방식으로 도출되는 결과는 동일합니다. 즉, 구성요소 배열이 포함된 변수가 도출됩니다.

문자 배열 선언 시 ASSIGN 키워드를 반드시 사용할 필요는 없습니다. 하지만, 사용하면 유용합니다. ASSIGN을(를) 포함하면 고급 검색을 사용하여 스크립트 내에 배열을 배치한 위치를 쉽게 찾을 수 있습니다. ASSIGN을(를) 사용하지 않으면 배열의 이름을 검색해야 합니다. 검색 결과에는 스크립트 내에 배열에 대한 모든 참조가 포함될 것입니다. 검색어에 ASSIGN을(를) 포함하면 변수가 명시적으로 할당된 결과만이 검색 결과로 반환됩니다. ASSIGN 없이 변수를 선언하려면 <name> = "<value>" 구문을 사용하십시오.

동적 문자열

동적 문자열에는 여러 형식이 있을 수 있습니다.

  • 동적 데이터 개체에는 배열이 포함됩니다. 또한 각 배열 구성요소는 개체 멤버이기도 합니다.

    DYNAMIC beowulfLocations 
    ASSIGN beowulfLocations[1] = "Land of the Geats"
    ASSIGN beowulfLocations[2] = "Heorot" 
    ASSIGN beowulfLocations[3] = "Earnanæs"
  • 동적 개체에는 배열을 보유한 멤버가 포함되어 있습니다. 개체의 나머지 멤버에는 문자열 또는 숫자값이 포함될 수 있으며, 아니면 다른 배열일 수도 있습니다.

    DYNAMIC beowulfCharacteristics 
    ASSIGN beowulfCharacteristics.foe[1].characteristics[1] = "Grendel"
    ASSIGN beowulfCharacteristics.foe[1].characteristics[2] = "son of Cain"
    ASSIGN beowulfCharacteristics.foe[2] = $"Grendel\'s mother" 
    ASSIGN beowulfCharacteristics.foe[3] = "Dragon"
  • 문자 배열에는 각각 동적 데이터 개체가 포함된 구성요소가 보유됩니다.

    DYNAMIC epicPoems
    ASSIGN epicPoems.poemName = "Beowulf"
    DYNAMIC heroes 
    ASSIGN heroes.heroName = "Beowulf"
    DYNAMIC monsters
    ASSIGN monsters.monsterName = "Grendel"
    ASSIGN oldEnglish[1] = epicPoems
    ASSIGN oldEnglish[2] = heroes
    ASSIGN oldEnglish[3] = monsters

    디버거를 실행하면 동적 개체 및 스니펫 편집기 창에서 트리 탭으로서 변수에 대한 문자 배열의 내용을 볼 수 있습니다.

    이러한 유형의 동적 배열은 API에 연결할 때처럼 스크립트가 다른 시스템과 함께 작동해야 할 때는 사용할 수 없습니다. 문자 배열에 보유되는 데이터는 직렬화되거나 JSON 또는 XML 문자열로 변환될 수 없습니다.

위치별로 배열 구성요소 참조

배열에서 인덱스에 의해 지정된 위치를 사용하여 문자열 또는 동적 배열에 있는 구성요소를 참조할 수 있습니다. 예:

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth"
ASSIGN currentName = heroes[2]

currentName의 값은 Sir Gawain입니다.

ASSIGN 문의 등호(=) 기호 중 아무 쪽에나 인덱스 번호 대신 변수를 사용할 수 있습니다. 이를 통해 스크립트 내의 인덱스를 하드코딩하지 않아도 특정한 인덱스를 참조할 수 있습니다. 예:

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth"
ASSIGN location = 2
ASSIGN currentHero = heroes[location]
ASSIGN nextIndex = heroes.count() + 1
ASSIGN heroes[nextIndex] = "Roland"

이 예시의 currentHero 값은 Sir Gawain입니다. 위 예시의 마지막 두 줄에서는 변수를 ASSIGN 문의 왼쪽에 있는 인덱스로 사용하는 경우를 확인할 수 있습니다. 또한 count() 함수를 사용하여 배열의 구성요소 개수를 반환하는 경우도 보여줍니다. 이 정보는 비어 있는 다음 인덱스에 새 구성요소를 추가하기 위해 사용됩니다.

인덱스 번호에 대한 변수를 사용할 때는 변수 이름 주위에 중괄호를 사용할 필요가 없습니다. 스크립트는 배열 이름의 대괄호 사이에 있는 숫자값을 기대합니다. 숫자가 아닌 모든 것이 변수라고 간주하므로 해당 이름에 따른 변수를 찾습니다. 숫자값을 할당하는 해당 변수 선언이 있어야 합니다. 선언이 없는 경우 다음 오류 중 하나가 발생합니다.

_ERR=In Snippet line 12: Array index must be >= 1.

Snippet 작업에 대한 Error 브랜치가 연결되면 오류가 발생했을 때 이 스크립트가 이 브랜치를 사용합니다.

문자 배열로 FOREACH 사용하기

FOREACH 을 문자 배열과 사용하면 각 구성요소를 통해 반복할 수 있습니다.

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth|Lancelot"
 FOREACH elem IN heroes 
{
   ASSIGN aName = elem 
}

이 예시에서는 elemaName이(가) 반복할 때마다 업데이트됩니다. elem 변수는 FOREACH 루프가 처리하는 현재 구성요소를 보유합니다. 스크립트는 aName을(를) elem의 내용으로 업데이트합니다. 각 반복 이후 elemaName은(는) 같은 값을 가지지만, 반복 중에는 elem은(는) 새로운 값을 가지고 aName은(는) 이전 값을 가지거나 첫 반복을 시작하는 경우 아무 값도 가지지 않습니다.

배열 예시 스크립트FOREACH Loop with a String Array 스니펫에서 이를 명확히 확인할 수 있습니다. 변수 업데이트 방식을 보려면 스니펫을 줄마다 단계별로 살펴보십시오.

문자 배열과 FOR 사용하기

FOR 루프를 문자 배열과 사용하면 배열 반복하고 정해진 횟수만큼 정의된 작업을 수행할 수 있습니다.

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth|Lancelot"
FOR i = 1 TO heroes.count 
   {    
      item = "{heroes[i]}" 
   } 
        

이 예시의 결과로 Item은(는) i의 값에 의해 지정된 인덱스 위치에서 FOR 루프의 각 반복을 heroes 배열 내용으로 업데이트합니다. heroes.count에 나타난 것처럼, FOR 루프는 문자 배열 끝에 도달한 이후 반복을 중단합니다.

배열 예시 스크립트FOR Loop with a String Array 스니펫에서 이 루프를 볼 수 있습니다.

배열에 함수 사용하기

배열에 함수를 사용할 수 있습니다. 배열의 이름을 대괄호로 묶인 인덱스로 사용한 다음 점 표기법을 사용하여 함수 이름을 추가합니다. 이는 다음 예시에서 확인할 수 있습니다.


ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth"
ASSIGN miniHero = "{heroes[2].lower}"
ASSIGN yellyHero = "{heroes[2].upper}"

이 예시의 결과는 miniHero = sir gawainyellyHero = SIR GAWAIN입니다.

일부 함수는 일부 배열과 함께 사용할 수 없습니다. 일부는 특정한 유형의 값만 사용할 수 있습니다. 작업에 사용하려는 함수의 유형을 선택합니다.

동적 배열에 함수를 사용할 수 있습니다. 하지만, 특정한 동적 배열과 포함된 사항에 따라 특별한 개체 속성.$value를 사용해야 할 수 있습니다. 일부 함수는 전체 개체에 사용할 수 없습니다. 예를 들면 개체 배열에 lower() 함수를 사용할 수 없습니다. 이를 시도하면 스크립트에서 함수를 무시합니다. 이 경우에는 다른 방법을 적용해야 합니다. 예를 들어, 배열의 개체에서 특정한 값을 별도의 변수에 복사할 수 있습니다. 변수의 내용에 따라 lower() 을(를) 사용할 수 있으며, 필요하면 변환된 값을 개체로 도로 가져올 수 있습니다.

다음 표의 함수는 배열로 사용할 수 있도록 특별히 설계되어 있습니다. 배열 예시 스크립트Functions and Arrays 스니펫에서 이 함수를 테스트합니다.

기능

설명

count()

배열 또는 개체 내의 구성요소 수를 반환합니다.

index(indexValue)

지정된 indexValue에 따라 변수의 내용에서 배열 요소를 반환합니다.

indexof(text)

변수의 내용 안에 있는 지정된 text의 문자 위치를 반환합니다.

size()

배열 내의 요소 수를 반환합니다.

split(delimiter)

배열로 처리할 수 있는 파이프 문자로 구분된 문자열로 변수의 내용을 반환합니다. 파이프 문자로 구분된 기존의 특정한 delimiter을(를) 대체합니다.