배열

배열(Array) 란?

배열은 어떠한 정보들을 나열한 것을 뜻합니다. 예를 들면 서버에 접속한 모든 플레이어들의 목록은 하나의 배열이라고 할 수 있습니다.

또한, 1부터 5까지의 숫자를 나열한 것도 배열이라고 할 수 있습니다.

{'Player1', 'Player2', 'Player3'} // 배열

{1, 2, 3, 4, 5} // 배열

이 배열에 값을 추가하고, 제거하고, 순서를 바꾸는 등의 작업을 통해서 작업을 더욱 효율적으로 할 수 있습니다.

커맨드헬퍼에서는 배열을 이용하여 다양한 값(위치, 이벤트) 등을 처리하기 때문에, 몇가지 고급 펑션들을 이용하시려면 알아야 하는 것이 바로 배열입니다.

배열 만들기

커맨드헬퍼에서는 array() 라는 펑션을 통해서 배열을 만들 수 있습니다.

msg(array(1, 2, 3, 4, 5))

결과: {1, 2, 3, 4, 5}

배열을 메시지로 출력하면 {1, 2, 3, 4, 5} 의 형태로 나오게 됩니다.

물론 이는 배열을 문자열로 변환한 것으로 {1, 2, 3, 4, 5} 가 배열이라는 뜻은 아닙니다!

배열의 값 가져오기

msg(array('a', 'b', 'c', 'd', 'e')[1])

결과: b

배열 옆에 [가져올 값의 위치] 를 적으면 배열 속의 해당 값을 반환하게 됩니다.

여기서 가져올 값의 위치 부분을 인덱스 혹은 라고 부릅니다.

또한 위치의 번호는 0부터 시작한다는 점 을 잊지 마세요.

배열 수정하기

배열의 장점은 이미 배열이 선언된 이후에도 그 배열 속의 값을 추가/제거/수정/재배열 등이 가능하다는 점입니다.

그 외에도 배열을 이용하면 다양한 작업들을 할 수 있습니다. 커맨드헬퍼에서 배열을 통해 할 수 있는 모든 것은 API 문서 - 배열 관리 에서 확인하실 수 있습니다.

배열의 값 수정하기

배열 안의 어떠한 값을 수정하는 방법은 array_set() 을 이용하는 방법이 있습니다.

또한 이 array_set()@array[인덱스] = '값' 형태의 연산자 구문으로도 이용할 수 있습니다.

array_set() 펑션을 이용하여 인덱스를 배열의 크기보다 크게 하여 배열에 새로운 값을 추가할 수도 있지만, 기본적으로 뒤에서 언급할 키가 정해진 배열이 아닌 경우에는 array_push() 를 더 자주 이용합니다.

예제 1.

@array = array(1, 2, 3, 4)
msg(@array)
@array[0] = 999
msg(@array)
@array = array(1, 2, 3, 4)
msg(@array)
array_set(@array, 0, 999)
msg(@array)

결과: 두 예제 모두 {1, 2, 3, 4} 라는 메시지가 출력된 후, {999, 2, 3, 4} 라는 메시지가 출력됩니다.

배열에 값 추가하기

일반적인 배열에 값을 추가하고 싶다면 array_push() 라는 펑션을 이용하면 됩니다.

array_push() 펑션 또한 @array[] = '값' 이란 연산자 구문을 이용할 수 있습니다.

@array = array(1, 2, 3, 4)
msg(@array)
@array[] = 5
msg(@array)
@array = array(1, 2, 3, 4)
msg(@array)
array_push(@array, 5)
msg(@array)

결과: 두 예제 모두 {1, 2, 3, 4} 가 출력된 뒤 {1, 2, 3, 4, 5} 가 출력됨.

배열의 값 삭제하기

배열의 값을 삭제하려면 array_remove() 라는 펑션과 array_remove_values() 라는 펑션 두가지를 사용할 수 있습니다.

두 펑션의 차이점은 array_remove() 라는 펑션은 배열의 인덱스를 가지고 배열의 값을 제거할 수 있는 펑션이고, array_remove_value() 라는 펑션은 배열의 값을 가지고 배열의 값을 제거할 수 있는 펑션입니다.

일반적인 배열의 경우 배열의 중간에 있는 값(예를 들어 3번째(인덱스가 2인) 값) 을 없앨 경우 다음 인덱스의 값이 없어진 인덱스가 있는 곳으로 한칸씩 당겨진다고 생각하시면 됩니다.

예제 1.(array_remove())

@array = array(1, 2, 3, 4, 5)
msg(@array)
msg(@array[2])
array_remove(@array, 2)
msg(@array)
msg(@array[2])

결과: {1, 2, 3, 4, 5}, 3 이 출력된 후 {1, 2, 4, 5}, 4 가 출력됨

예제 2.(array_remove_values)

@array = array(2, 3, 4, 5, 1, 1)
msg(@array)
array_remove_values(@array, 1)
msg(@array)

결과: {2, 3, 4, 5, 1, 1} 이 출력된 후 {2, 3, 4, 5} 가 출력됨

배열의 정보 가져오기

만약 서버에 접속한 모든 플레이어의 닉네임이 적혀 있는 배열이 있다고 가정합시다.

그렇다면 이 배열을 이용하여 서버에 접속한 사람 수를 구하거나, ITSTAKE 라는 플레이어가 접속해 있는지 확인하고 싶다면 어떻게 해야 할까요?

커맨드헬퍼에서는 다양한 펑션을 활용하여 이러한 문제를 해결할 수 있게 해 줍니다.

이 문단에서는 여러 펑션을 사용하여 배열, 배열 내부의 정보를 확인하는 방법을 알아봅니다.

배열의 크기 가져오기

배열의 크기를 가져오는 방법은 정말 간단합니다.

array_size(@array) 를 실행하게 되면 배열의 크기를 얻어올 수 있습니다.

참고 일반 배열의 경우 배열의 크기는 (배열의 마지막 인덱스 + 1) 입니다.

예제 1.

@array = array('Player1', 'Player2', 'Player3', 'Player4')
msg(array_size(@array))

결과: 4 가 출력됨.

배열에서 어떠한 값이 존재하는지 확인하기

array_contains() 펑션은 배열에서 인수로 주어진 값이 존재하는지 확인합니다.

몇 개가 있든 존재하기만 하면 참을 반환하게 됩니다.

예제 1.

@array = array('Player1', 'Player2', 'Player3', 'Player4')
msg(array_contains(@array, 'ITSTAKE'))
msg(array_contains(@array, 'Player4'))

결과: false 가 출력된 후 true 가 출력됩니다.

키가 주어진 배열(키가 있는 배열)

커맨드헬퍼에서는 위에서 배운 배열 말고도 또 다른 형식의 배열을 지원합니다. 바로 키가 주어진 배열(Associative Array)입니다.

일반 배열의 경우 {1, 2, 3, 4} 처럼 인덱스가 따로 주어지지 않고 그 값의 인덱스는 그 값이 있는 순서인 반면에,

키가 주어진 배열은 {'one': 1, 'two': 2, 'three': 3, 'four': 4} 처럼 인덱스를 값과 함께 설정하는 배열입니다.

키가 주어진 배열의 장점은 인덱스에 그 인덱스에 해당하는 값의 설명 등을 할 수 있으며, 배열 중간의 값을 삭제해도 인덱스가 바뀌지 않는다는 장점을 가지고 있습니다. 즉, 어떠한 인덱스를 가진 값을 직접 수정하지 않는 한 그 값의 인덱스는 절대 바뀌지 않는 것입니다.

키가 주어진 배열 만들기

키가 주어진 배열을 만드는 것은 간단합니다. 일반 array() 펑션을 이용해서 만들되, 만들 때 인덱스를 같이 지정해 주면 됩니다.

@array = array('one': 1, 'two': 2)
msg(@array)

결과: {one: 1, two: 2} 가 출력됨.

위 예제를 통해 키가 있는 배열을 만들고 싶을 땐 인덱스: 값, 인덱스: 값... 의 형태로 배열 안에 써 주면 된다는 것을 알 수 있습니다.

하지만 빈 배열을 array() 펑션을 통해서 만들면 일반 배열이 생성되기 때문에, 이 경우에만 associative_array() 펑션을 통해 따로 키가 주어진 배열을 만들 수도 있습니다.

@array = array()
msg(is_associative(@array)) # 주어진 값이 키가 있는 배열인지 확인하는 함수
@aarray = associative_array()
msg(is_associative(@aarray))

결과: false, true 가 출력됨.

키가 주어진 배열 수정하기

키가 주어진 배열을 수정하는 것은 일반 배열과 비슷합니다.

다른 점은 인덱스가 숫자 뿐만 아니라 문자열도 가능하며, 배열의 순서가 없어지기 때문에 array_push() 의 사용이 불가능합니다.

@array = array('one': 1, 'two': 2, 3: 'three', 4: 'four') # 인덱스는 숫자 또는 문자열만 가능
msg(@array['one']) # array_get(@array, 'one') 와 동일
@array['two'] = 'two' # array_set(@array, 'two', 'two') 와 동일
@array['9'] = 'nine'
# 배열에 순서가 없어졌기 때문에 배열의 크기보다 훨씬 큰 인덱스도 array_set 으로 지정 및 추가 가능
msg(@array)

결과: 1 이 출력되고 {one: 1, two: two, 3: three, 4: four, 9: nine} 이 출력됨.

뿐만 아니라 array_size() 등등 일반 배열 전용을 제외한 모든 배열 관련 펑션들을 사용할 수 있습니다.

주의점

다차원 배열

만약 배열 안에 배열을 넣게 된다면 어떻게 될까요?

물론 그 경우도 처리 가능합니다.

예제를 통해 배열 안의 배열을 처리하는 방법을 알아보겠습니다.

@array = array(array(1, 2, 3), array('a', 'b', 'c'), array('one': 1, 'two': 2, 'three': 3))
msg(@array[0][0]) # array_get(array_get(@array, 0), 0) 과 같음
@array[2]['one'] = 'one' # array_set(@array[2], 'one', 'one) 과 같음
@array[1][] = 'd' # array_push(@array[1], 'd') 와 같음
msg(@array)

결과: 1 출력 후 {{1, 2, 3}, {a, b, c, d}, {one: one, two: 2, three: 3}} 가 출력됨.

물론 배열 안에 배열, 그 배열 안의 또 배열 이러한 식으로 배열 안에 배열을 무한대로 넣을 수 있습니다.

물론 그렇게 배열의 차원이 높아질 수록 코드도 복잡해 지기 때문에 처리에 유의하시는 것이 좋습니다.