배열
배열(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}}
가 출력됨.
물론 배열 안에 배열, 그 배열 안의 또 배열 이러한 식으로 배열 안에 배열을 무한대로 넣을 수 있습니다.
물론 그렇게 배열의 차원이 높아질 수록 코드도 복잡해 지기 때문에 처리에 유의하시는 것이 좋습니다.