배열(Array)
같은 자료형의 데이터들을 순차적으로 담는 데이터 구조.
배열 데이터 구조 예시
정수 배열 - array[0..9] of Integer
문자열 배열 - array[0..6] of string
다차원 배열 - array[0..2] of array[0..8] of Integer;
배열 길이 지정 방식
- 정적배열 - 선언 시 배열의 범위(길이) 지정
- 동적배열 - 사용 시 배열의 길이 지정 및 변경
정적 배열
범위(길이)가 정해진 배열
문법
array[시작인덱스..끝인덱스] of 자료형;
선언
var IntArray: array[0..9] of Integer; StrArray: array[1..10] of string; EditArray: array[0..1] of TEdit;
배열의 시작인덱스는 끝인덱스보다 작아야 한다.
시작인덱스는 어떤 수로도 시작할 수 있다.
배열의 자료형으로 숫자, 문자, 구조체 등의 기본자료형 및 컴포넌트, 폼 등의 클래스 타입도 사용할 수 있다.
사용
IntArray[0] := 10; IntArray[1] := 20; for I := 0 to Length(IntArray) - 1 do IntArray[I] := I; for I := Low(StrArray) to High(StrArray) do StrArray[I] := IntToStr(I); EditArray[0] := Edit1; EditArray[1] := Edit2; for Edit in EditArray do Memo1.Lines.Add(Edit.Text);
배열의 길이는 Length() 함수로 알수 있으며, 길이는 (끝인덱스 - 시작인덱스 + 1)이다.
배열은 시작인덱스는 Low() 함수로, 끝인덱스는 High() 함수로 알수있다.
배열의 각요소는 배열 변수에 대괄호([]) 인덱스로 접근할 수 있다.
다차원 배열은 대괄호의 반복해 접근할 수 있다.
다차원 배열
문법
array[시작..끝] of 자료형; array[시작..끝] of array [시작..끝] of 자료형; array[시작..끝, 시작..끝] of 자료형;
사용
var Matrix: array[0..2] of array[0..9] of Integer; Matrix2: array[0..2, 0..9] of Integer; begin // 1차원 반복[0..2] for I := Low(Matrix) to High(Matrix) do begin // 2차원 반복[0..9] for J := Low(Matrix[I]) to High(Matrix[I]) do Matrix[I][J] := Random(100); end; end;
동적배열
길이가 정해지지 않은 배열, 상황에 맞게 배열의 길이 설정 후 사용
문법
array of 자료형; array of array of 자료형; TArray<자료형>; // TArray<T> = array of T
제너릭 배열(TArray<자료형>) 사용 시 System.Generics.Collections 유즈절에 추가 필요(델파이 2009 이상)
선언
var IntArray: array of Integer; StrArray: TArray<string>; // array of string; Matrix: array of array of Integer;
다차원 배열 선언 시 array of 반복
사용
SetLength(IntArray, 5); // [0..4] SetLength(StrArray, Length(IntArray)); for I := Low(IntArray) to High(IntArray) do StrArray[I] := IntToStr(IntArray[I]); SetLength(Matrix, 2); for I := Low(Matrix) to High(Matrix) do begin SetLength(Matrix[I], I+1); for J := Low(Matrix[J]) to High(Matrix[I]) do Matrix[I][J] := Random(100); end; // string = array of Char; S := 'Hi Delphi'; for I := 1 to Length(S) do // 0번째는 문자열의 길이 Memo1.Line.Add(S[I]); // 배열 직접연산: 델파이 XE7부터 지원 IntArray2 := [1, 2, 3, 4, 5]; // 1,2,3,4,5 IntArray2 := IntArray2 + [8, 9]; // 1,2,3,4,5,8,9 Insert([6, 7], IntArray2, 5); // 1,2,3,4,5,6,7,8,9 Delete(IntArray2, 3, 2); // 1,2,3,6,7,8,9
SetLength() 함수로 동적배열 길이 설정, 이후 사용법은 정적배열과 동일
동적 다차원 배열은 행마다 다른 크기의 열 개수를 지정 가능
XE7 버전 이후, 동적배열 직접 연산(초기화, + 연산자) 지원, Insert/Delete/Concat 함수 지원 추가됨
문자열 - string(array of Char)
배열 상수
배열을 상수로 선언 후 초기값 설정 가능
const Numbers: array[0..9] of Integer = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9); Digits1: array[0..9] of Char = ('0','1','2','3','4','5','6','7','8','9'); DIgits2: array[0..9] of Char = '0123456789'; Matrix: array[0..1, 0..2] of Integer = ((0, 1, 2), (1, 2, 3));
배열 타입
배열 타입을 선언 후 변수, 상수의 자료형으로 사용
type TIntDynamicArray = array of Integer; TNumbers = array[0..9] of Integer; TIntMatrix = array of array of Integer; var Int1, Int2: TIntDynamicArray; Matrix: TIntMatrix; const NUMS: TNumbers = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
TStringList
문자열 목록을 관리하는 객체
TStrings 클래스 계승해 구현 됨
사용
uses System.Classes; var I: Integer; StrList: TStringList; begin StrList := TStringList.Create; // (*) 객체 생성 try // StrList 사용 StrList.Add('항목1'); StrList.Add('항목2'); StrList.Add('항목3'); ShowMessage(StrList[0]); for I := 0 to StrList.Count - 1 do Memo1.Lines.Add(StrList[I]); finally StrList.Free; // (*) 객체 해제 end; end;
'System.Classes'에 구현되어 있음(uses 절에 추가)
객체 생성(.Create)해 사용 후 반드시 해제(.Free)할 것.
try...finally 문법: try..finally 사이의 코드에서 오류가 발생해도 finally...end 사이의 코드가 실행 됨
(즉, 생성한 객체를 해제하지 않으면 메모리 누수 발생)
for-in 문법 지원
주요 기능
- Add(const S: string) - 문자열 S를 목록에 추가
- Delete(Index: Integer) - 목록의 Index번째 문자열 삭제
- Clear - 모든 문자열 삭제
- Count: Integer - 문자열 갯수 반환
- IndexOf(S: string): Integer - S 문자열의 인덱스 반환. 없으면 -1 반환
- Strings[Index: Integer]: string - Index 번째 문자열 반환(Strings 생략 가능)
- Values[const Name: string]: string - 속성, Key=Value 형식으로 저장 및 조회
- Text: string - 전체 문자열 반환, 줄바꿈 문자(#13#10)로 구분
- CommaText: string - 콤마(,)로 구분된 전체 문자열 반환
- Delimiter, DelimitedText - 구분자 설정, 구분자로 구분된 전체 문자열 반환
TList<T>
제너릭 기반 콜렉션 객체. 어떤 자료형이라도 담을 수 있는 추상화된 목록 객체
(델파이 2009 이후 버전 부터 사용 가능)
사용
uses System.Generics.Collections; var Num: Integer; IntList: TList<Integer>; StrList: TList<string>; BtnList: TList<TButton>; RecList: TList<TUserRec>; begin IntList := TList<Integer>.Create; try IntList.Add(10); IntList.Add(20); IntList.Add(30); Num := IntnList[1]; for Num in IntList do Memo1.Lines.Add(IntToStr(Num)); finally IntList.Free; end; end;
'System.Generics.Collections' uses 절 추가
담고 싶은 자료형을 <> 사이에 선언해 목록으로 사용
객체 생성해 사용 후 반드시 해제할 것
for-in 문법 지원
주요 기능
- Add(Value: T) - 지정한 자료형의 데이터를 목록에 추가
- AddRange(Value: array of T) - 여러건의 데이터를 목록에 추가(배열로 전달)
- Insert(Index: Integer; Value: T) - Index 번째 데이터 추가
- InsertRange(Index: Integer: array of T) - Index 번째 여러건의 데이터 추가
- IndexOf(const Value: T): Integer - 목록에서 Value 인덱스 반환(없으면 -1)
- LastIndexof(const Value: T): Integer - 목록에서 Value 인덱스 반환, 뒤에서 부터 탐색
- Delete(Index: Integer) - 목록에서 Index 번째 데이터 제거
- DeleteRange(Index, Count: Integer) - 목록에서 Index 번째 부터 Count 개의 데이터 제거
- Remove(const Value: T): Integer - 목록에서 Value 제거 후 인덱스 반환(없으면 -1)
- Extract(const Value: T): T - 목록에서 Value 제거 후 해당 값 반환(추출)
- Sort - 목록 정렬
- Reverse - 목록 전체의 순서를 바꿈