Object Array()
Pml Basic 4
Array
PML을 사용하는 이유가 반복적인 작업을 단순화하려는 만큼, Array는 매우 많이 사용됩니다. 기본적인 PML1 방식의 Array보다 PML2 방식의 Array를 이용하면 좀 더 효율적으로 PML을 작성할 수 있습니다. 1차원 배열과 2차원 배열을 PML1 방식과 PML2 방식으로 다뤄보도록 하겠습니다.
1. 1차원 배열
1차원 배열은 단일 리스트로, Element들이 하나의 차원에 배열됩니다. 예를 들어, ['apple','banana', 'cherry']와 같은 배열이 1차원 배열입니다. Array에 Append를 하기 전, 반드시 OBJECT ARRAY()로 배열을 우선 생성해야 합니다.(직접 할당하면 생략해도 됨)
1.1 1차원 Array 생성 및 사용 (APPEND 로 추가)
배열을 생성한 후 .APPEND() 메서드를 사용해 Element를 추가합니다.
!array = OBJECT ARRAY() -- 1차원 배열 생성
!array.APPEND('apple') -- 첫 번째 Element 추가
!array.APPEND('banana') -- 두 번째 Element 추가
!array.APPEND('cherry') -- 세 번째 Element 추가
q var !array
- 배열 생성:
OBJECT ARRAY()로 빈 배열을 생성합니다. - Element 추가:
.APPEND()메서드를 사용해 배열에 Element를 순차적으로 추가합니다. - Element 접근: 인덱스를 통해 배열 내 Element에 접근합니다. PML에서는 배열의 인덱스가 1부터 시작하므로 첫 번째 Element는
!array[1]으로 접근합니다.
1.2 1차원 Array 생성 및 사용 (직접 할당)
배열을 생성한 후 인덱스를 사용해 직접 값을 할당할 수 있습니다.
!array = OBJECT ARRAY() -- 1차원 배열 생성
!array[1] = 'apple' -- 첫 번째 Element 할당
!array[2] = 'banana' -- 두 번째 Element 할당
!array[3] = 'cherry' -- 세 번째 Element 할당
q var !array- 배열 생성:
OBJECT ARRAY()로 빈 배열을 생성합니다. - 인덱스 할당: 배열의 각 위치에 인덱스를 통해 직접 Element를 할당합니다.
- Element 접근: 인덱스를 통해 배열 내 Element에 접근합니다. PML에서는 배열의 인덱스가 1부터 시작하므로 첫 번째 Element는
!array[1]으로 접근합니다..
2. 2차원 배열
PML에서 2차원 배열은 배열 내에 배열을 추가하는 방식으로 구현됩니다. 이는 행(row)을 배열로 만들고, 이 행들을 또 다른 배열에 추가하는 방식으로 구성됩니다.
2.1 APPEND를 이용한 2차원배열
-- 배열 생성
!oArray = OBJECT ARRAY() -- 2차원 배열 생성
!oRow1 = OBJECT ARRAY() -- 첫 번째 행 생성
!oRow2 = OBJECT ARRAY() -- 두 번째 행 생성
-- 첫 번째 행에 Element 추가
!oRow1.APPEND('Row1 Element1')
!oRow1.APPEND('Row1 Element2')
-- 두 번째 행에 Element 추가
!oRow2.APPEND('Row2 Element1')
!oRow2.APPEND('Row2 Element2')
-- 2차원 배열에 행 추가
!oArray.APPEND(!oRow1)
!oArray.APPEND(!oRow2)
-- Element 접근
q var !oArray- 배열 생성:
OBJECT ARRAY()로 빈 배열을 생성하고, 각 행을 다른 배열로 만듭니다. - Element 추가: 각 행에
.APPEND()메서드를 사용해 Element를 추가합니다. - 배열에 배열 추가: 각 행(배열)을 2차원 배열에
.APPEND()메서드로 추가합니다. - Element 접근:
[행][열]방식으로 접근합니다. 예를 들어!oArray[1][1]은 첫 번째 행의 첫 번째 Element입니다.
2.2 직접 값 할당을 통한 2차원 배열
예시:
-- 배열 생성
!oArray = OBJECT ARRAY() -- 2차원 배열 생성
-- 인덱스를 사용해 Element 직접 할당
!oArray[1][1] = 'Row1 Element1'
!oArray[1][2] = 'Row1 Element2'
!oArray[2][1] = 'Row2 Element1'
!oArray[2][2] = 'Row2 Element2'
-- Element 접근
q var !oArray- 배열 생성:
OBJECT ARRAY()로 빈 배열을 생성합니다. - 인덱스 할당: 각 행과 열에 직접 Element를 할당합니다.
- Element 접근:
[행][열]형식으로 Element에 접근할 수 있습니다. 예를 들어!oArray[1][1]은 첫 번째 행의 첫 번째 Element입니다.
3. Array Method
3.1 APPEND()
- 기능: 배열의 끝에 새로운 Element를 추가합니다.
- 사용법:
!array.APPEND(값)
예시:
!array = OBJECT ARRAY()
!array.APPEND('Element1')
!array.APPEND('Element2')
q var !array결과:
<ARRAY>
[1] <STRING> 'Element1'
[2] <STRING> 'Element2'3.2 SIZE()
- 기능: 배열에 있는 Element의 개수를 반환합니다.
- 사용법:
!size = !array.SIZE()
예시:
!array = OBJECT ARRAY()
!array.APPEND('Element1')
!array[2] = 'Element2'
!array.APPEND('Element3')
!size = !array.SIZE()
Q VAR !size결과:
<REAL> 33.3 FIND()
- 기능: 배열 내에서 특정 값을 찾아 그 값의 인덱스를 반환합니다. 값이 없을 경우 빈 값을 반환합니다.
- 사용법:
!index = !array.FIND(값)
예시:
!array = OBJECT ARRAY()
!array.APPEND('Apple')
!array[2] = 'Banana'
!array.APPEND('Cherry')
!array[4] = 'Banana'
!result = !array.FIND('Banana')
Q VAR !result 결과:
<ARRAY>
[1] <REAL> 2
[2] <REAL> 43.3 FINDFIRST()
- 기능: 배열 내에서 특정 값과 일치하는 첫 번째 값을 찾아 그 값의 인덱스를 반환합니다. 값이 없을 경우 빈 값을 반환합니다.
- 사용법:
!index = !array.FINDFIRST(값)
예시:
!array = OBJECT ARRAY()
!array.APPEND('Apple')
!array[2] = 'Banana'
!array.APPEND('Cherry')
!array[4] = 'Banana'
!result = !array.FINDFIRST('Banana')
Q VAR !result 결과:
<REAL> 23.4 JOIN()
- 기능: 배열의 모든 Element를 특정 구분자로 결합하여 하나의 문자열로 반환합니다.
- 사용법:
!joinedString = !array.JOIN(', ')
예시:
!array = OBJECT ARRAY()
!array.APPEND('Apple')
!array[2] = 'Banana'
!array.APPEND('Cherry')
!result = !array.JOIN(', ')
q var !result 결과:
<STRING> 'Apple, Banana, Cherry'3.5 CLEAR()
- 기능: 배열 내 모든 Element를 제거하여 배열을 초기화합니다.
- 사용법:
!array.CLEAR()
예시:
!array = OBJECT ARRAY()
!array.APPEND('Element1')
!array[2] = 'Element2'
q var !array
!array.CLEAR()
q var !array결과:
<ARRAY>
[1] <STRING> 'Element1'
[2] <STRING> 'Element2'
<ARRAY> - Unset and Empty3.6 SORT()
- 기능: 배열을 오름차순으로 정렬합니다. 숫자나 문자열을 기준으로 정렬이 가능합니다.
- 사용법:
!array.SORT()
예시:
!array = OBJECT ARRAY()
!array.APPEND('Cherry')
!array[2] = 'Apple'
!array.APPEND('Banana')
!array.SORT()
q var !array결과:
<ARRAY>
[1] <STRING> 'Apple'
[2] <STRING> 'Banana'
[3] <STRING> 'Cherry'3.7 UNIQUE()
- 기능: 배열 내 중복된 Element를 제거하고, 배열을 재정렬합니다.
- 사용법:
!array.UNIQUE()
예시:
!array = OBJECT ARRAY()
!array.APPEND('Apple')
!array.APPEND('Banana')
!array[3] = 'Apple'
q var !array
!array.UNIQUE()
q var !array결과:
<ARRAY>
[1] <STRING> 'Apple'
[2] <STRING> 'Banana'
[3] <STRING> 'Apple'
<ARRAY>
[1] <STRING> 'Apple'
[2] <STRING> 'Banana'3.8 DIFFERENCE()
- 기능: 두 배열 간의 차집합을 반환합니다. 첫 번째 배열에 존재하지만 두 번째 배열에 없는 Element들로 구성된 새로운 배열을 반환합니다.
- 사용법:
!differenceArray = !array1.DIFFERENCE(!array2)
예시:
!array1 = OBJECT ARRAY()
!array1.APPEND('a')
!array1.APPEND('b')
!array1.APPEND('c')
!array2 = OBJECT ARRAY()
!array2[1] = 'b'
!array2.APPEND('c')
!difference = !array1.DIFFERENCE(!array2)
q var !array1
q var !array2
q var !difference결과:
<ARRAY>
[1] <STRING> 'a'
[2] <STRING> 'b'
[3] <STRING> 'c'
<ARRAY>
[1] <STRING> 'b'
[2] <STRING> 'c'
<ARRAY>
[1] <STRING> 'a'3.9 COMPRESS()
- 기능: 배열에서 빈 Element(정의되지 않은 Element)를 제거하고 배열을 재정렬합니다.
- 사용법:
!array.COMPRESS()
예시:
!array = OBJECT ARRAY()
!array.APPEND('Element1')
!array[3] = 'Element3'
q var !array
!array.COMPRESS()
q var !array결과:
<ARRAY>
[1] <STRING> 'Element1'
[3] <STRING> 'Element3'
<ARRAY>
[1] <STRING> 'Element1'
[2] <STRING> 'Element3'3.10 LAST()
- 기능: 배열의 마지막 Element를 반환합니다.
- 사용법:
!lastElement = !array.LAST()
예시:
!array = OBJECT ARRAY()
!array.APPEND('Element1')
!array[2] = 'Element2'
!lastElement = !array.LAST()
q var !lastElement결과:
<STRING> 'Element2'3.11 FIRST()
- 기능: 배열의 첫 번째 Element를 반환합니다.
- 사용법:
!firstElement = !array.FIRST()
예시:
!array = OBJECT ARRAY()
!array.APPEND('Element1')
!array[2] = 'Element2'
!firstElement = !array.FIRST()
q var !firstElement결과:
<STRING> 'Element1'3.12 SPLIT()
- 기능: 문자열을 주어진 구분자를 기준으로 분리하여 배열(Array)로 반환합니다.
- 사용법:
!LIST = !TEXT.SPLIT('구분자')
예시
!TEXT = |AA BB CC DD EE| $* 공백으로 구분된 문자열
!LIST = !TEXT.SPLIT(' ') $* 공백을 기준으로 문자열을 나누어 배열로 변환
q var !LIST결과:
<ARRAY>
[1] <STRING> 'AA'
[2] <STRING> 'BB'
[3] <STRING> 'CC'
[4] <STRING> 'DD'
[5] <STRING> 'EE'3.13 APPENDARRAY(ARRAY values)
- 기능:
APPENDARRAY는 하나의 배열에 다른 배열의 요소들을 모두 추가합니다. 병합된 배열의 상태를 확인할 수 있습니다.
예시:
!array1 = OBJECT ARRAY()
!array2 = OBJECT ARRAY()
!array1[1] = |test1|
!array1[2] = |test2|
!array2.APPEND('apple')
!array2.APPEND('banana')
Q VAR !array1
Q VAR !array2
!array1.APPENDARRAY(!array2)
Q VAR !array1결과:
<ARRAY>
[1] <STRING> 'test1'
[2] <STRING> 'test2'
[3] <STRING> 'apple'
[4] <STRING> 'banana'3.14 EVALUATE(BLOCK command)
- 설명:
Evaluate메서드는 배열의 각 요소에 대해 주어진 명령 블록을 실행하고 그 결과를 새로운 배열로 반환합니다. 각 요소에 연산이 적용된 후 배열의 상태를 확인할 수 있습니다. - Block의 경우 추가적으로 설명할게 많기에 Block Object 관련 글 별도로 올리겠습니다.
예시:
!array = OBJECT ARRAY()
!array.APPEND(1)
!array.APPEND(2)
!block = OBJECT BLOCK('!array[!EvalIndex] + 1')
!newArray = !array.EVALUATE(!block)
Q VAR !newArray결과:
<ARRAY>
[1] <REAL> 2
[2] <REAL> 33.15 REMOVE(REAL index)
- 설명:
Remove메서드는 배열에서 특정 인덱스의 요소를 제거하고, 배열의 나머지 요소를 재정렬합니다. 제거된 요소와 배열의 상태를 확인할 수 있습니다.
예시:
!array = OBJECT ARRAY()
!array.APPEND('apple')
!array.APPEND('banana')
!array.APPEND('cherry')
Q VAR !array
!removed = !array.REMOVE(2)
Q VAR !removed
Q VAR !array결과:
!array = OBJECT ARRAY()
!array.APPEND('apple')
!array.APPEND('banana')
!array.APPEND('cherry')
Q VAR !array
!removed = !array.REMOVE(2)
Q VAR !removed
Q VAR !array3.16 UNION(ARRAY values)
- 기능:
UNION은 AppendArray와 비슷하지만 중복을 제거한 채로 합쳐집니다..
예시:
!array1 = OBJECT ARRAY()
!array2 = OBJECT ARRAY()
!array1[1] = |apple|
!array1[2] = |test2|
!array1[3] = |test3|
!array2.APPEND('apple')
!array2.APPEND('banana')
!array2.APPEND('banana')
!union = !array1.Union(!array2)
q var !array1
q var !array2
q var !union 결과:
<ARRAY>
[1] <STRING> 'apple'
[2] <STRING> 'test2'
[3] <STRING> 'test3'
<ARRAY>
[1] <STRING> 'apple'
[2] <STRING> 'banana'
[3] <STRING> 'banana'
<ARRAY>
[1] <STRING> 'apple'
[2] <STRING> 'test2'
[3] <STRING> 'test3'
[4] <STRING> 'banana'3.17 MAXINDEX()
- 기능:
SIZE는 개수를 가져오고MAXINDEX는 마지막 값을 가져옵니다
예시:
!array[1] = |test2|
!array[2] = |test2|
!array[3] = |test3|
!array[5] = |test4|
!array[9] = |test5|
!array.append(|test6|)
q var !array.MaxIndex()
q var !array.SIZE()결과:
<REAL> 10
<REAL> 63.18 MININDEX()
- 기능: 첫번째 인덱스를 가져옵니다
예시:
!array[2] = |test2|
!array[3] = |test3|
!array[5] = |test4|
!array[9] = |test5|
!array.append(|test6|)
q var !array.MinIndex()결과:
<REAL> 23.19 Intersect()
- 기능: Difference와는 다르게 두 배열에 모두 존재하는 요소를 반환합니다
예시:
!array1 = OBJECT ARRAY()
!array2 = OBJECT ARRAY()
!array1[1] = |test1|
!array1[2] = |test2|
!array1[3] = |test3|
!array1[4] = |test4|
!array1[5] = |test5|
!array2.APPEND('test1')
!array2.APPEND('banana')
!array2.APPEND('test5')
!array2.APPEND('apple')
Q VAR !array1
Q VAR !array2
!result = !array1.Intersect(!array2)
Q VAR !result결과:
<ARRAY>
[1] <STRING> 'test1'
[2] <STRING> 'test2'
[3] <STRING> 'test3'
[4] <STRING> 'test4'
[5] <STRING> 'test5'
<ARRAY>
[1] <STRING> 'test1'
[2] <STRING> 'banana'
[3] <STRING> 'test5'
[4] <STRING> 'apple'
<ARRAY>
[1] <STRING> 'test1'
[2] <STRING> 'test5'3.20 InsertArray(REAL, ARRAY)
- 기능: ARRAY를 삽입해서 새로운 ARRAY를 만듭니다.
예시:
!array1 = OBJECT ARRAY()
!array2 = OBJECT ARRAY()
!array1[1] = |test1|
!array1[2] = |test2|
!array2.APPEND('apple')
!array2.APPEND('banana')
Q VAR !array1
Q VAR !array2
!array1.InsertArray(2, !array2)
Q VAR !array1결과:
<ARRAY>
[1] <STRING> 'test1'
[2] <STRING> 'test2'
<ARRAY>
[1] <STRING> 'apple'
[2] <STRING> 'banana'
<ARRAY>
[1] <STRING> 'test1'
[2] <STRING> 'apple'
[3] <STRING> 'banana'
[4] <STRING> 'test2'3.21 WIDTH()
- 기능: 문자열 요소의 최대 너비(길이)를 반환
예시:
!array[1] = |test1|
!array[2] = |test22|
!array[3] = |test333|
!array[5] = |test|
Q VAR !array.WIDTH()결과:
<REAL> 73.22 Indices()
- 기능: 배열의 인덱스를 포함하는 배열을 반환
예시:
!array[1] = |test1|
!array[2] = |test22|
!array[3] = |test333|
!array[5] = |test|
Q VAR !array.Indices()결과:
<ARRAY>
[1] <REAL> 1
[2] <REAL> 2
[3] <REAL> 3
[4] <REAL> 53.23 FROM(REAL)
- 기능: 해당 index부터 array를 복사
예시:
!array[1] = |test1|
!array[2] = |test2|
!array[3] = |test3|
!array[4] = |test4|
!array[5] = |test5|
!result = !array.from(3)
q var !array
q var !result결과:
<ARRAY>
[1] <STRING> 'test1'
[2] <STRING> 'test2'
[3] <STRING> 'test3'
[4] <STRING> 'test4'
[5] <STRING> 'test5'
<ARRAY>
[1] <STRING> 'test3'
[2] <STRING> 'test4'
[3] <STRING> 'test5'3.24 Invert()
- 기능: 배열을 역순으로 변경
예시:
!array[1] = |test1|
!array[2] = |test2|
!array[3] = |test3|
!array[4] = |test4|
!array[5] = |test5|
q var !array
!array.Invert()
q var !array결과:
<ARRAY>
[1] <STRING> 'test1'
[2] <STRING> 'test2'
[3] <STRING> 'test3'
[4] <STRING> 'test4'
[5] <STRING> 'test5'
<ARRAY>
[1] <STRING> 'test5'
[2] <STRING> 'test4'
[3] <STRING> 'test3'
[4] <STRING> 'test2'
[5] <STRING> 'test1'3.25 RemoveFrom(REAL1, REAL2) or RemoveFrom(REAL)
- 기능: INDEX의 REAL1부터 REAL2개수만큼 삭제 REAL2생략시 REAL1이후 전체삭제
예시:
!array[1] = |test1|
!array[2] = |test2|
!array[3] = |test3|
!array[4] = |test4|
!array[5] = |test5|
q var !array
!array.RemoveFrom(3, 1)
q var !array
!array.RemoveFrom(3)
q var !array결과:
<ARRAY>
[1] <STRING> 'test1'
[2] <STRING> 'test2'
[3] <STRING> 'test3'
[4] <STRING> 'test4'
[5] <STRING> 'test5'
<ARRAY>
[1] <STRING> 'test1'
[2] <STRING> 'test2'
[3] <STRING> 'test4'
[4] <STRING> 'test5'
<ARRAY>
[1] <STRING> 'test1'
[2] <STRING> 'test2'3.25 Removeto(REAL1, REAL2) or Removeto(REAL)
- 기능: RemoveFrom은 Real값으로부터 뒤로 삭제했다면 RemoveTo는 앞으로 삭제
예시:
!array[1] = |test1|
!array[2] = |test2|
!array[3] = |test3|
!array[4] = |test4|
!array[5] = |test5|
q var !array
!array.Removeto(3, 2)
q var !array
!array.Removeto(2)
q var !array결과:
<ARRAY>
[1] <STRING> 'test1'
[2] <STRING> 'test2'
[3] <STRING> 'test3'
[4] <STRING> 'test4'
[5] <STRING> 'test5'
<ARRAY>
[1] <STRING> 'test1'
[2] <STRING> 'test4'
[3] <STRING> 'test5'
<ARRAY>
[1] <STRING> 'test5'