본문 바로가기

Delphi/문법92

TObjectList<T>를 활용한 안전한 객체 리스트 관리 TObjectList를 활용한 안전한 객체 리스트 관리 Delphi에서는 객체 리스트를 관리할 때 TObjectList를 사용하면 메모리 관리를 자동으로 처리할 수 있어 매우 유용합니다. OwnsObjects 속성이 True로 설정되면 리스트에서 객체를 제거하거나 리스트를 해제할 때 해당 객체들도 자동으로 해제됩니다. TObjectList는 제너릭 리스트 클래스이며, 객체의 소유권을 갖고 있어, 직접 Free하지 않아도 됩니다. 이를 통해 메모리 누수를 방지할 수 있습니다. uses System.Generics.Collections, System.SysUtils; type TPerson = class Name: string; constructor Create(const A.. 2025. 7. 9.
레코드(Record)에서 메서드 활용하기 레코드(Record)에서 메서드 활용하기 Delphi의 Record는 단순 데이터 저장 구조로 알려져 있지만, 메서드와 연산자 오버로드도 지원합니다. 이를 활용하면 클래스보다 가볍지만 구조화된 동작을 구현할 수 있어 성능과 구조를 모두 챙길 수 있습니다. type TPointRec = record X, Y: Integer; procedure Offset(DX, DY: Integer); function ToString: string; end; procedure TPointRec.Offset(DX, DY: Integer); begin Inc(X, DX); Inc(Y, DY); end; function TPointRec.ToString: string; begin R.. 2025. 7. 4.
TList<T> 제네릭 리스트 사용법 TList 제네릭 리스트 사용법TList는 Delphi에서 제네릭 타입을 사용해 타입 안정성을 보장하는 리스트입니다. 고정된 타입의 데이터를 리스트에 담고 처리할 수 있어 컴파일 타임에 타입 체크가 가능하며, 코드의 안정성과 가독성을 높일 수 있습니다. uses System.Generics.Collections, System.SysUtils; procedure TestGenericList; var Numbers: TList; I: Integer; begin Numbers := TList.Create; try Numbers.Add(10); Numbers.Add(20); Numbers.Add(30); for I in Numbers do Writ.. 2025. 6. 30.
Interface를 이용한 유연한 코드 설계 Interface를 이용한 유연한 코드 설계 Delphi에서 Interface는 객체 간의 결합도를 낮추고 코드 재사용성과 확장성을 높이기 위해 매우 유용한 구조입니다. 특히 큰 프로젝트에서 모듈 간의 독립성을 유지하며 기능을 구현할 수 있도록 도와줍니다. type IGreeter = interface ['{B9C1E68F-8B3F-43F7-B8E7-CF234DE6E3AD}'] procedure Greet; end; TEnglishGreeter = class(TInterfacedObject, IGreeter) public procedure Greet; end; TKoreanGreeter = class(TInterfacedObject, IGreeter) .. 2025. 6. 26.
Exit으로 코드 흐름을 깔끔하게 정리하기 Exit으로 코드 흐름을 깔끔하게 정리하기델파이에서 조건 분기나 예외 처리를 효율적으로 제어하고 싶을 때 Exit 명령을 활용하면 코드 가독성이 높아집니다. 불필요한 중첩을 피하고 빠르게 함수 종료를 유도할 수 있습니다. function IsPositive(Value: Integer): Boolean; begin if Value Exit(False); // 이후 코드: Value > 0인 경우만 실행 Result := True; end; procedure Test; begin ShowMessage(BoolToStr(IsPositive(5), True)); // 출력: TRUE ShowMessage(BoolToStr(IsPositive(-2), True)); //.. 2025. 6. 24.
익명 메서드(Anonymous Method)로 유연한 이벤트 처리 구현하기 익명 메서드(Anonymous Method)로 유연한 이벤트 처리 구현하기 Delphi에서는 익명 메서드를 사용해 이벤트 처리나 콜백 기능을 보다 간결하게 작성할 수 있습니다. 특히 VCL에서는 TThread, TTask, TTimer 등에서 익명 메서드를 많이 활용합니다. uses System.SysUtils, System.Classes, Vcl.ExtCtrls; procedure UseAnonymousMethod; var Timer: TTimer; begin Timer := TTimer.Create(nil); Timer.Interval := 1000; Timer.OnTimer := procedure(Sender: TObject) begin ShowMessage('1초.. 2025. 6. 23.
in 연산자를 사용한 가독성 높은 조건 비교 in 연산자를 사용한 가독성 높은 조건 비교Delphi에서는 특정 값이 여러 값 중 하나인지 확인할 때 in 연산자를 사용하면 코드가 훨씬 간결하고 가독성이 높아집니다. 특히 조건이 많아질수록 or를 나열하는 방식보다 in을 사용하는 것이 훨씬 효율적입니다. procedure CheckFruit(const AName: string); begin if AName in ['Apple', 'Banana', 'Orange'] then ShowMessage(AName + ' is a fruit!') else ShowMessage(AName + ' is not a known fruit.'); end; // 호출 예시 CheckFruit('Apple'); // 결과: Apple is a.. 2025. 6. 20.
메모리 누수를 방지하는 try..finally 패턴의 활용 메모리 누수를 방지하는 try..finally 패턴의 활용 Delphi에서 객체를 동적으로 생성할 때, 예외가 발생해도 메모리를 안전하게 해제할 수 있도록 try..finally 패턴을 사용하는 것이 매우 중요합니다. 이 구조는 시스템 안정성을 크게 높이며, 모든 개발자가 반드시 습관화해야 할 필수 패턴입니다. procedure SafeObjectUsage; var SL: TStringList; begin SL := TStringList.Create; try SL.Add('델파이'); SL.Add('코딩'); ShowMessage(SL.Text); finally SL.Free; end; end; try..finally는 리소스를 안전하게 해제할 수 있.. 2025. 6. 19.
TStringList의 Duplicates 속성을 활용한 중복 제거 TStringList의 Duplicates 속성을 활용한 중복 제거 TStringList는 문자열 목록을 다룰 때 매우 유용한 클래스입니다. 특히 Sorted 속성과 Duplicates 속성을 함께 사용하면 중복 데이터를 손쉽게 제거할 수 있습니다. 데이터 정리, 중복 검출 등의 작업에 유용합니다. procedure RemoveDuplicates; var SL: TStringList; begin SL := TStringList.Create; try SL.Sorted := True; SL.Duplicates := dupIgnore; SL.Add('Apple'); SL.Add('Banana'); SL.Add('Apple'); SL.Add('Orang.. 2025. 6. 16.
Record Helper로 레코드에 메서드 추가하기 Record Helper로 레코드에 메서드 추가하기 델파이의 Record Helper 기능을 활용하면 기존 레코드 타입에 메서드를 확장할 수 있습니다. 이를 통해 데이터 중심 구조에 객체지향적인 동작을 부여할 수 있어 코드 재사용성과 가독성이 향상됩니다. type TPoint = record X, Y: Integer; end; TPointHelper = record helper for TPoint function ToString: string; procedure Offset(DX, DY: Integer); end; function TPointHelper.ToString: string; begin Result := Format('(%d, %d)', [X, Y]).. 2025. 6. 11.
인터페이스(Interface) 활용으로 메모리 자동 관리 구현하기 인터페이스(Interface) 활용으로 메모리 자동 관리 구현하기 델파이에서 인터페이스를 활용하면 참조 카운트를 기반으로 객체의 생명주기를 자동으로 관리할 수 있습니다. 이를 통해 try..finally 없이도 안전하게 객체를 해제할 수 있어 메모리 누수 방지와 코드 간결성에서 매우 유용합니다. type IMyWorker = interface ['{A1B2C3D4-E5F6-1234-5678-90ABCDEF1234}'] procedure DoWork; end; TMyWorker = class(TInterfacedObject, IMyWorker) public procedure DoWork; end; procedure TMyWorker.DoWork; begin .. 2025. 6. 4.
SetLength로 동적 배열 크기 안전하게 조절하기 SetLength로 동적 배열 크기 안전하게 조절하기 델파이에서 동적 배열은 고정 크기의 정적 배열과 달리 런타임에 크기를 자유롭게 바꿀 수 있습니다. 이때 SetLength 함수를 사용하면 요소 수를 설정하거나 확장할 수 있습니다. 배열 크기를 변경할 때 기존 데이터가 유지되므로 반복적 추가나 삭제 시 유용합니다. procedure ManageDynamicArray; var Numbers: array of Integer; I: Integer; begin SetLength(Numbers, 3); Numbers[0] := 10; Numbers[1] := 20; Numbers[2] := 30; SetLength(Numbers, 5); // 배열 확장 Numbers[3] :.. 2025. 6. 3.
TDictionary를 이용한 키-값 쌍 데이터 관리 TDictionary를 이용한 키-값 쌍 데이터 관리TDictionary는 키-값 쌍을 저장하고 검색하는 데 매우 유용한 제네릭 컬렉션입니다. 빠른 조회, 중복 키 방지, 유연한 자료 관리가 가능하며, 다양한 타입을 키와 값으로 지정할 수 있어 실제 프로그램 개발에서 매우 자주 쓰입니다. uses System.Generics.Collections, System.SysUtils; procedure UseDictionary; var Dict: TDictionary; begin Dict := TDictionary.Create; try Dict.Add('Apple', 100); Dict.Add('Banana', 80); if Dict.ContainsKey('Apple'.. 2025. 6. 2.
ParamStr와 ParamCount를 이용한 명령줄 인자 처리 ParamStr와 ParamCount를 이용한 명령줄 인자 처리델파이 애플리케이션에서 외부 명령줄 인자를 받아야 할 경우 ParamCount와 ParamStr를 사용하면 간단히 해결할 수 있습니다. 자동화 처리, 스크립트 실행, 배치 명령 연동 등에 널리 활용됩니다. uses System.SysUtils; procedure ProcessCommandLine; var I: Integer; begin if ParamCount = 0 then ShowMessage('입력된 명령 인자가 없습니다.') else for I := 1 to ParamCount do ShowMessage(Format('인자 %d: %s', [I, ParamStr(I)])); end; Param.. 2025. 5. 27.
VarToStr를 이용한 안전한 Variant → 문자열 변환 VarToStr를 이용한 안전한 Variant → 문자열 변환 델파이에서 Variant 타입은 다양한 형식을 담을 수 있어 유연하지만, 직접 문자열로 변환할 경우 오류가 발생할 수 있습니다. 이럴 때 VarToStr 함수를 사용하면 어떤 값이든 안정적으로 문자열로 바꿀 수 있습니다. 특히 DB에서 불러온 값 처리에 유용합니다. uses System.Variants, System.SysUtils; procedure ConvertVariantToString; var V: Variant; S: string; begin V := Null; S := VarToStr(V); // 결과: 빈 문자열 '' ShowMessage('변환 결과: [' + S + ']'); V := 123; .. 2025. 5. 23.
Inc와 Dec를 사용한 간단한 정수 증감 처리 Inc와 Dec를 사용한 간단한 정수 증감 처리 델파이에서 정수 값을 증가시키거나 감소시킬 때 Inc와 Dec 프로시저를 사용하면 코드가 간결해지고 가독성도 좋아집니다. 연산자를 직접 사용하는 것보다 의도가 명확하게 드러나는 장점이 있습니다. procedure CountExample; var Counter: Integer; begin Counter := 10; Inc(Counter); // 1 증가 → 11 Inc(Counter, 5); // 5 증가 → 16 Dec(Counter, 3); // 3 감소 → 13 ShowMessage('현재 값: ' + IntToStr(Counter)); end; Inc(변수) → 1 증가 Inc(변수, 값) → 해당 값만큼 증가.. 2025. 5. 19.
Now와 DateToStr, TimeToStr로 현재 날짜와 시간 구분 출력하기 Now와 DateToStr, TimeToStr로 현재 날짜와 시간 구분 출력하기델파이에서는 Now를 통해 현재 시스템의 날짜와 시간을 동시에 얻을 수 있습니다. 이 값을 DateToStr 또는 TimeToStr 함수와 함께 사용하면 날짜와 시간을 분리하여 명확하게 출력할 수 있습니다. uses System.SysUtils; procedure ShowCurrentDateTime; var Today: string; CurrentTime: string; begin Today := DateToStr(Now); CurrentTime := TimeToStr(Now); ShowMessage('오늘 날짜: ' + Today); // 예: 2025-05-15 ShowMessa.. 2025. 5. 15.
TryStrToInt를 이용한 안전한 문자열 → 정수 변환 TryStrToInt를 이용한 안전한 문자열 → 정수 변환 델파이에서 문자열을 정수로 변환할 때 StrToInt를 사용하면 변환 실패 시 예외가 발생합니다. 반면, TryStrToInt는 예외 없이 실패 여부를 확인하며 변환 결과를 안전하게 처리할 수 있어 사용자 입력 검증에 매우 유용합니다. uses System.SysUtils; procedure TryStrToIntExample; var Input: string; Number: Integer; begin Input := '1234'; if TryStrToInt(Input, Number) then ShowMessage('변환된 숫자: ' + IntToStr(Number)) else ShowMessage('유효.. 2025. 5. 13.
RandomRange를 사용한 범위 내 난수 생성 RandomRange를 사용한 범위 내 난수 생성 델파이에서는 Random 함수를 통해 난수를 생성할 수 있지만, 특정 범위의 정수를 얻고 싶을 때는 RandomRange가 더 간편하고 직관적입니다. 이 함수는 Math 유닛에 포함되어 있으며, 시작값과 끝값 사이의 정수 난수를 반환합니다. uses System.SysUtils, System.Math; procedure ShowRandomNumber; var R: Integer; begin Randomize; R := RandomRange(10, 21); // 10 이상 20 이하 ShowMessage('랜덤 숫자: ' + IntToStr(R)); end; RandomRange(A, B)는 A 이상 B 미만의 정수를 반환 Rand.. 2025. 5. 9.
for..in 반복문을 사용한 컬렉션 순회 for..in 반복문을 사용한 컬렉션 순회 델파이의 for..in 구문은 배열이나 리스트, 문자열, 컬렉션 등을 간단하게 순회할 수 있게 해주는 문법입니다. 기존의 인덱스 기반 반복문보다 가독성이 좋고, 실수 가능성이 적어 더욱 안전합니다. uses System.SysUtils, System.Classes; procedure ForInExample; var List: TStringList; S: string; begin List := TStringList.Create; try List.Add('Delphi'); List.Add('개발'); List.Add('재미있어요'); for S in List do ShowMessage(S); fina.. 2025. 5. 5.