티스토리 뷰
배열은 프로그래밍 과정에서 없어서는 안 될 핵심 요소이다. 다른 프로그래밍 언어와 아주 다른 점이 하나 있는데, 대부분의 언어는 배열의 요소들은 동일한 데이터 타입만 허용한다. 그러나, 고도 스크립트에서는 배열의 요소들 간에 데이터 타입이 서로 달라도 된다는 점이다. 첫 번째 요소는 스트링, 두 번째 요소는 정수 타입, 세 번째 요소는 실수 타입으로 저장할 수도 있다.
배열 선언은 위 예제처럼 []로 빈 배열을 선언할 수 있다. 배열 크기가 고정된 것이 아니므로 배열 크기를 지정할 필요가 없다. 예제처럼 배열. append()로 배열 끝에 항목을 추가할 수 있다. 배열.insert()로 특정 위치를 지정하여 항목을 삽입할 수도 있다. 배열. size()로 확인할 수 있는 배열 크기 내에서 배열 첨자를 활용하여 개별 항목을 접근하면 된다. 첨자는 0부터 시작하고 첨자를 -1로 지정하면 맨 끝 요소를 지정하는 것으로 음수를 통해서 끝에서부터 N번째 요소를 지정할 수 있다.
func get_description() -> String:
var desc_list : PoolStringArray = PoolStringArray()
if shader_model.has("shortdesc"):
desc_list.push_back(TranslationServer.translate(shader_model.shortdesc))
if shader_model.has("longdesc"):
desc_list.push_back(TranslationServer.translate(shader_model.longdesc))
return desc_list.join("\n")
고도 스크립트에서는 참조 형태로 인수가 전달되는 기본 배열 외에 PoolByteArray, PoolIntArray, PoolRealArray, PoolStringArray, PoolVector2Array, PoolVector3Array, PoolColorArray라는 특별한 배열을 제공하는데 이 타입들은 참조를 통해서 값을 공유하는 것이 아니라 값이 직접 전달되는 방식임에 주의해야 한다. 위의 예제 코드를 보면 문자열 배열에서만 제공하는 .join() 메서드의 활용 사례를 확인할 수 있다. 문자열 배열에 저장한 N개의 항목들을 join()의 인수로 전달한 접합자를 항목 사이에 두어 하나의 문자열로 만드는 과정이다.
var lines = text.split("\n")
var line_number := 0
var palette_name := path.get_basename().get_file()
var comments := ""
var colors := PoolColorArray()
for line in lines:
if line.begins_with("#"):
comments += line.trim_prefix("#") + "\n"
if line.begins_with("#Palette Name: "):
palette_name = line.replace("#Palette Name: ", "")
elif line.begins_with("Name: "):
palette_name = line.replace("Name: ", "")
elif line.begins_with("Columns: "):
continue
elif line_number > 0 && line.length() >= 9:
line = line.replace("\t", " ")
var color_data: PoolStringArray = line.split(" ", false, 4)
var red: float = color_data[0].to_float() / 255.0
var green: float = color_data[1].to_float() / 255.0
var blue: float = color_data[2].to_float() / 255.0
var color = Color(red, green, blue)
if color_data.size() >= 4:
colors.append(color)
else:
colors.append(color)
line_number += 1
위의 예제 코드는 배열의 다양한 사용 사례를 보여주는 것으로 첫 라인의 문자열.split() 메서드는 문자열을 인수로 지정한 구분자로 잘라서 문자열 배열인 PoolStringArray 타입으로 리턴한다. "for 항목 in 배열" 형태로 배열의 각 항목을 추출할 수 있다. 작업 후에는 배열.append()로 새로운 항목을 추가하는 과정도 살펴볼 수 있다. 다음 배열 타입의 주요 메서드를 정리한 것이다.
■ 배열 생성 메서드
Array Array ( PoolColorArray from ), Array Array ( PoolVector3Array from ), Array Array ( PoolVector2 Array from ), Array Array ( PoolStringArray from ), Array Array ( PoolRealArray from ), Array Array ( PoolIntArray from ), Array Array ( PoolByteArray from )
☞ 전용 타입 배열로부터 배열 생성. "배열 A + 배열 B"처럼 두 가지 배열을 합친 새로운 배열을 생성할 수 있고, "배열 A+=배열 B"는 배열 A에 배열 B를 추가하는 동작을 수행한다.
Array duplicate ( bool deep=false )
☞ 현재 배열을 복사해서 새로운 배열 리턴. deep를 true로 설정하면 내부에 포함하고 있는 배열이나 사전 타입도 새롭게 복사하고, false면 내부 배열이나 사전은 기존 배열의 것을 참조한다.
Array slice ( int begin, int end, int step=1, bool deep=false )
☞ 배열을 범위와 증분으로 나누어 새로운 배열을 복사해서 리턴. deep은 duplicate와 동일.
■ 변경 및 추출 메서드
void append ( Variant value ), void push_back ( Variant value )
☞ 배열 끝에 항목 추가
void append_array ( Array array )
☞ 배열 끝에 다른 배열의 항목들을 추가
void insert ( int position, Variant value ), void push_front ( Variant value )
☞ 위치를 지정하여 항목 삽입. 뒤에 추가하는 것보다 느리므로 주의
Variant pop_at ( int position ), Variant pop_back ( ), Variant pop_front ( )
☞ 위치를 지정하여 항목을 추출하고 해당 항목은 제거(remove), 추출 불가시 null 리턴
Variant back ( ), Variant front ( )
☞ 마지막/첫 항목 추출. 없으면 null 리턴. 빈 배열에 첨자로 [0][-1]로 접근하면 비정상 수행
Variant max ( ), Variant min ( )
☞ 제일 큰/작은 값 추출, 비교 불가시 null 리턴
void invert ( )
☞ 항목들의 순서를 뒤집는다
void shuffle ( )
☞ 항목들의 순서를 무작위로 조정
void clear ( )
☞ 항목을 전부 제거, 크기 0
void erase ( Variant value )
☞ 지정한 값과 동일한 첫 항목을 제거(erase)
void remove ( int position )
☞ 지정한 위치의 항목을 제거
void resize ( int size )
☞ 배열 크기 재조정, 기존 크기보다 작으면 나머지는 제거하고, 크면 항목을 null로 추가
void sort ( )
☞ 항목 순서를 알파벳순으로 조정
void sort_custom ( Object obj, String func )
☞ 항목 순서를 지정한 클래스 오브젝트와 사용자 함수로 조정
■ 검색 및 검사
int size ( )
☞ 항목 개수 리턴
bool empty ( )
☞ 빈 배열이면 true
bool has ( Variant value )
☞ 지정한 값이 존재하면(타입도 동일) true. in 연산자 사용도 가능
int count ( Variant value )
☞ 지정한 값과 동일한 항목수 리턴
int find ( Variant what, int from=0 ), int find_last ( Variant value ), int rfind ( Variant what, int from=-1 )
☞ 지정한 항목을 처음이나 끝부터 찾아 해당 첨자 리턴. 없으면 -1 리턴
int bsearch ( Variant value, bool before=true ),
☞이진 검색으로 해당 값의 위치 추출. 비정렬 배열은 예상치 못한 결과 추출
int bsearch_custom ( Variant value, Object obj, String func, bool before=true )
☞ 지정한 클래스 오브젝트와 사용자 함수로 이진 검색하여 해당 값의 위치 추출
int hash ( )
☞ 배열의 32비트 해시 추출
■ PoolStringArray
PoolStringArray PoolStringArray ( Array from )
void append ( String string )
void append_array ( PoolStringArray array )
bool empty ( )
int insert ( int idx, String string )
void invert ( )
void push_back ( String string )
void remove ( int idx )
void resize ( int idx )
int size ( )
위의 메서드들은 기본 배열 타입의 메서드와 유사하게 동작한다. 다음은 문자열 배열에서만 추가로 제공하는 메서드다.
void set ( int idx, String string )
☞ 지정한 항목 수정
String join ( String delimiter )
☞ 문자열 배열의 항목들을 인수로 전달한 접합자를 항목 사이에 두어 하나의 문자열로 리턴한다.
'게임개발과 무료게임' 카테고리의 다른 글
고도 엔진 소스 빌드하기 - 고도 배우기, Godot (0) | 2024.02.01 |
---|---|
사전, Dictionary 클래스 정리 - 고도 배우기, Godot (0) | 2024.02.01 |
파일, File 클래스 정리 - 고도 배우기, Godot (0) | 2024.02.01 |
오픈 소스 고도 프로젝트 모음 - 고도 배우기, Godot (0) | 2024.02.01 |
리듬 게임의 기술적 요소3, AnimationPlayer와 Tween - 고도 배우기, Godot (0) | 2022.11.02 |