델파이 TStringList 설명 및 예시
TStringList
는 델파이(Delphi)에서 문자열 목록(List of Strings)을 효율적으로 관리하기 위해 제공하는 매우 유용한 클래스입니다. Classes
유닛에 정의되어 있으며, TStrings
추상 클래스를 상속받아 구현되었습니다.
파일 입출력, 문자열 처리, 데이터 임시 저장 등 다양한 용도로 활용됩니다.
TStringList란?
- 문자열의 동적 배열처럼 작동하여, 필요에 따라 크기가 자동으로 조절됩니다.
- 각 문자열에 연관된 객체(Object)를 저장할 수 있는 기능을 제공합니다 (
Objects
속성). - 리스트를 정렬하거나(
Sort
,Sorted
), 구분자(Delimiter)를 이용해 문자열을 합치거나 분리할 수 있습니다(CommaText
,DelimitedText
). - 텍스트 파일에서 내용을 쉽게 읽어오거나(
LoadFromFile
), 파일로 저장할 수 있습니다(SaveToFile
). - ListBox나 ComboBox 같은 컴포넌트의
Items
속성으로 자주 사용됩니다.
주요 속성(Properties)
Count
: 리스트에 저장된 문자열의 개수를 반환합니다.Strings[Index]
: 지정된 인덱스(0부터 시작)에 있는 문자열에 접근합니다. (읽기/쓰기)Objects[Index]
: 지정된 인덱스의 문자열과 연관된 객체에 접근합니다. (읽기/쓰기)Text
: 리스트의 모든 문자열을 줄바꿈 문자(CRLF
)로 구분된 하나의 큰 문자열로 반환하거나 설정합니다.CommaText
: 리스트의 모든 문자열을 쉼표(,
)로 구분된 하나의 문자열로 반환하거나 설정합니다. 공백이나 쉼표가 포함된 문자열은 자동으로 큰따옴표로 묶입니다.Delimiter
:DelimitedText
속성에서 사용할 구분 문자를 지정합니다. (기본값:,
)DelimitedText
: 지정된Delimiter
로 구분된 하나의 문자열로 리스트를 반환하거나 설정합니다.Sorted
:True
로 설정하면 문자열이 추가될 때마다 자동으로 오름차순으로 정렬됩니다.CaseSensitive
: 문자열 비교 시 대소문자 구분 여부를 설정합니다. (기본값:True
)Duplicates
: 중복된 문자열의 허용 여부를 설정합니다. (Sorted
가True
일 때 주로 사용)
주요 메서드(Methods)
Add(const S: string): Integer;
: 리스트 끝에 새 문자열을 추가하고, 추가된 인덱스를 반환합니다.AddObject(const S: string; AObject: TObject): Integer;
: 문자열과 연관된 객체를 함께 추가합니다.Insert(Index: Integer; const S: string);
: 지정된 인덱스에 문자열을 삽입합니다.Delete(Index: Integer);
: 지정된 인덱스의 문자열 (및 연관 객체)를 삭제합니다.Clear;
: 리스트의 모든 항목을 삭제합니다.IndexOf(const S: string): Integer;
: 지정된 문자열의 인덱스를 찾아 반환합니다. 찾지 못하면 -1을 반환합니다.Find(const S: string; var Index: Integer): Boolean;
:Sorted = True
일 때 효율적으로 문자열을 찾습니다. 찾으면True
와 해당 인덱스를 반환합니다.LoadFromFile(const FileName: string);
: 텍스트 파일의 내용을 읽어 리스트에 추가합니다. (기존 내용은 지워짐)SaveToFile(const FileName: string);
: 리스트의 내용을 텍스트 파일로 저장합니다.Sort;
:Sorted = False
일 때 리스트를 정렬합니다.Exchange(Index1, Index2: Integer);
: 두 인덱스의 항목 위치를 맞바꿉니다.Move(CurIndex, NewIndex: Integer);
: 항목을 다른 위치로 이동시킵니다.
사용 예시
1. 기본적인 추가, 접근, 삭제
문자열을 추가하고, 특정 인덱스의 문자열에 접근하며, 삭제하는 기본 예제입니다.
uses
System.Classes; // TStringList 사용을 위해 필요
procedure BasicStringListOperations;
var
MyList: TStringList;
i: Integer;
begin
MyList := TStringList.Create; // TStringList 객체 생성
try
// 문자열 추가
MyList.Add('Apple');
MyList.Add('Banana');
MyList.Add('Orange');
// 특정 위치에 삽입
MyList.Insert(1, 'Mango'); // 인덱스 1에 'Mango' 삽입
// 개수 확인
ShowMessage('리스트 항목 개수: ' + IntToStr(MyList.Count)); // 결과: 4
// 특정 인덱스 접근
ShowMessage('인덱스 0 항목: ' + MyList.Strings[0]); // 결과: Apple
ShowMessage('인덱스 1 항목: ' + MyList[1]); // .Strings 생략 가능
// 전체 항목 출력 (for 루프 사용)
for i := 0 to MyList.Count - 1 do
begin
Memo1.Lines.Add(Format('항목 %d: %s', [i, MyList[i]]));
end;
// 특정 항목 삭제
MyList.Delete(2); // 인덱스 2의 'Banana' 삭제
// 특정 문자열의 인덱스 찾기
i := MyList.IndexOf('Orange');
if i >= 0 then
ShowMessage('Orange의 인덱스: ' + IntToStr(i)); // 결과: 2 (Banana 삭제 후)
else
ShowMessage('Orange를 찾을 수 없습니다.');
// 리스트 비우기
MyList.Clear;
ShowMessage('리스트 비우기 후 개수: ' + IntToStr(MyList.Count)); // 결과: 0
finally
MyList.Free; // 메모리 해제 (중요!)
end;
end;
2. Text 및 CommaText 속성 사용
Text
속성은 여러 줄 문자열로, CommaText
속성은 쉼표로 구분된 한 줄 문자열로 리스트를 다룹니다.
procedure TextAndCommaTextExample;
var
MyList: TStringList;
MyText: string;
begin
MyList := TStringList.Create;
try
// Text 속성으로 여러 줄 설정
MyList.Text := 'Line 1' + #13#10 + 'Line 2' + #13#10 + 'Line 3';
ShowMessage('Text 속성 설정 후 개수: ' + IntToStr(MyList.Count)); // 결과: 3
ShowMessage('Text 속성 값:' + #13#10 + MyList.Text);
// CommaText 속성으로 설정 (쉼표, 공백 포함 주의)
MyList.Clear;
MyList.CommaText := 'One,Two,"Three, Four",Five'; // 쉼표/공백 있으면 따옴표로 묶임
ShowMessage('CommaText 설정 후 개수: ' + IntToStr(MyList.Count)); // 결과: 4
ShowMessage('항목 2: ' + MyList[2]); // 결과: Three, Four
// CommaText 속성으로 가져오기
MyText := MyList.CommaText;
ShowMessage('CommaText 값: ' + MyText); // 결과: One,Two,"Three, Four",Five
finally
MyList.Free;
end;
end;
3. 파일 입출력 (LoadFromFile, SaveToFile)
텍스트 파일의 내용을 TStringList
로 읽어오거나, 리스트의 내용을 파일로 저장합니다.
procedure FileIOExample;
var
MyList: TStringList;
FilePath: string;
begin
MyList := TStringList.Create;
FilePath := 'C:\Temp\MyListFile.txt'; // 예시 경로 (실제 경로로 변경 필요)
try
// 리스트 내용 준비
MyList.Add('델파이');
MyList.Add('TStringList 예제');
MyList.Add('파일 저장하기');
// 파일로 저장 (UTF8 인코딩 지정 가능)
// MyList.SaveToFile(FilePath, TEncoding.UTF8);
MyList.SaveToFile(FilePath); // 기본 인코딩 사용
ShowMessage(FilePath + ' 파일 저장 완료');
// 리스트 비우고 파일에서 읽어오기
MyList.Clear;
if FileExists(FilePath) then
begin
// MyList.LoadFromFile(FilePath, TEncoding.UTF8);
MyList.LoadFromFile(FilePath);
ShowMessage(FilePath + ' 파일 읽기 완료. 항목 수: ' + IntToStr(MyList.Count));
// 읽어온 내용 사용 (예: Memo 컴포넌트에 표시)
// Memo1.Lines.Assign(MyList);
end
else
begin
ShowMessage(FilePath + ' 파일이 존재하지 않습니다.');
end;
finally
MyList.Free;
end;
end;
주의: 실제 파일 경로(FilePath
)는 사용자의 환경에 맞게 수정해야 하며, 파일 접근 권한이 필요할 수 있습니다.
4. 객체 연관시키기 (Objects 속성)
문자열 리스트의 각 항목에 관련된 객체(데이터)를 함께 저장하는 예제입니다. 예를 들어, 사용자 이름(문자열)과 사용자 정보 객체를 연결할 수 있습니다.
// 간단한 데이터 저장을 위한 레코드 또는 클래스 정의
type
TPerson = class
public
Name: string;
Age: Integer;
constructor Create(AName: string; AAge: Integer);
end;
constructor TPerson.Create(AName: string; AAge: Integer);
begin
inherited Create;
Name := AName;
Age := AAge;
end;
procedure ObjectAssociationExample;
var
MyList: TStringList;
Person: TPerson;
i, FoundIndex: Integer;
begin
MyList := TStringList.Create;
MyList.OwnsObjects := True; // 중요: 리스트 해제 시 연관 객체도 자동으로 해제하도록 설정
try
// 문자열과 함께 TPerson 객체 추가
MyList.AddObject('Alice', TPerson.Create('Alice Smith', 30));
MyList.AddObject('Bob', TPerson.Create('Bob Johnson', 25));
MyList.AddObject('Charlie', TPerson.Create('Charlie Brown', 35));
// 특정 문자열을 찾아 연관된 객체 접근
FoundIndex := MyList.IndexOf('Bob');
if FoundIndex >= 0 then
begin
Person := TPerson(MyList.Objects[FoundIndex]); // 형변환 필요
ShowMessage(Format('%s의 나이: %d', [Person.Name, Person.Age])); // 결과: Bob의 나이: 25
end;
// 모든 항목 순회하며 객체 데이터 접근
for i := 0 to MyList.Count - 1 do
begin
Person := TPerson(MyList.Objects[i]);
Memo1.Lines.Add(Format('이름: %s, 나이: %d', [MyList.Strings[i], Person.Age]));
end;
finally
MyList.Free; // OwnsObjects = True 이므로, TPerson 객체들도 여기서 해제됨
end;
end;
주의: OwnsObjects
속성을 True
로 설정하면 TStringList
가 해제될 때 연결된 객체들의 메모리도 자동으로 해제해줍니다. 만약 False
(기본값)로 두면, 객체 메모리는 개발자가 직접 관리(해제)해야 합니다.
5. 정렬 (Sort, Sorted)
Sorted
속성을 이용한 자동 정렬과 Sort
메서드를 이용한 수동 정렬 예제입니다.
procedure SortingExample;
var
MyListSort: TStringList;
MyListNoSort: TStringList;
i: Integer;
begin
// 1. Sorted 속성 사용 (자동 정렬)
MyListSort := TStringList.Create;
try
MyListSort.Sorted := True;
MyListSort.Add('Zebra');
MyListSort.Add('Apple');
MyListSort.Add('Monkey');
// 추가 시점에 자동으로 정렬됨
ShowMessage('자동 정렬된 리스트:');
for i := 0 to MyListSort.Count - 1 do
Memo1.Lines.Add(MyListSort[i]); // 결과: Apple, Monkey, Zebra 순서
finally
MyListSort.Free;
end;
// 2. Sort 메서드 사용 (수동 정렬)
MyListNoSort := TStringList.Create;
try
MyListNoSort.Add('Zebra');
MyListNoSort.Add('Apple');
MyListNoSort.Add('Monkey');
ShowMessage('정렬 전 리스트:');
for i := 0 to MyListNoSort.Count - 1 do
Memo1.Lines.Add(MyListNoSort[i]); // 결과: Zebra, Apple, Monkey 순서
MyListNoSort.Sort; // 수동으로 정렬 실행
ShowMessage('정렬 후 리스트:');
for i := 0 to MyListNoSort.Count - 1 do
Memo1.Lines.Add(MyListNoSort[i]); // 결과: Apple, Monkey, Zebra 순서
finally
MyListNoSort.Free;
end;
end;
결론
TStringList
는 델파이에서 문자열 목록을 다루는 데 있어 매우 강력하고 유연한 도구입니다. 기본적인 추가/삭제부터 파일 처리, 객체 연동, 정렬 기능까지 다양한 기능을 제공하므로, 델파이 개발 시 적극적으로 활용하면 코드의 효율성과 가독성을 높일 수 있습니다.
'코딩 이야기 > 델파이 코딩' 카테고리의 다른 글
델파이 배열(Array) 종류별 설명 및 예시 (0) | 2025.04.28 |
---|---|
델파이 스트림(TStream) 종류별 설명 및 예시 (0) | 2025.04.28 |
델파이 함수 및 프로시저 만들기 (0) | 2025.04.23 |
델파이 Private, Public 접근 지정자 설명 및 예시 (0) | 2025.04.22 |
델파이 구조체(Record) 설명 및 예시 (0) | 2025.04.22 |