티스토리 뷰

728x90

배열은 프로그래밍 과정에서 없어서는 안 될 핵심 요소이다. 다른 프로그래밍 언어와 아주 다른 점이 하나 있는데, 대부분의 언어는 배열의 요소들은 동일한 데이터 타입만 허용한다. 그러나, 고도 스크립트에서는 배열의 요소들 간에 데이터 타입이 서로 달라도 된다는 점이다. 첫 번째 요소는 스트링, 두 번째 요소는 정수 타입, 세 번째 요소는 실수 타입으로 저장할 수도 있다.  

 

배열 선언은 위 예제처럼 []로 빈 배열을 선언할 수 있다. 배열 크기가 고정된 것이 아니므로 배열 크기를 지정할 필요가 없다. 예제처럼 배열. 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 )
   ☞ 문자열 배열의 항목들을 인수로 전달한 접합자를 항목 사이에 두어 하나의 문자열로 리턴한다.

 

728x90
댓글
글 보관함
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31