델파이 기초 다지기

데이터 컬렉션

여러개의 데이터를 담는 데이터 컬렉션를 학습합니다. 배열과 컬렉션 객체(TStringList, TList)를 학습할 수 있습니다.

배열(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 - 목록 전체의 순서를 바꿈

기타 컬렉션

댓글

댓글 본문
버전 관리
험프리
현재 버전
선택 버전
graphittie 자세히 보기