<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://trans.onionmixer.net/wiki/index.php?action=history&amp;feed=atom&amp;title=StartprogrammingusingObjectPascal%3AQueueApplication</id>
	<title>StartprogrammingusingObjectPascal:QueueApplication - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://trans.onionmixer.net/wiki/index.php?action=history&amp;feed=atom&amp;title=StartprogrammingusingObjectPascal%3AQueueApplication"/>
	<link rel="alternate" type="text/html" href="https://trans.onionmixer.net/wiki/index.php?title=StartprogrammingusingObjectPascal:QueueApplication&amp;action=history"/>
	<updated>2026-05-01T11:39:56Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://trans.onionmixer.net/wiki/index.php?title=StartprogrammingusingObjectPascal:QueueApplication&amp;diff=394&amp;oldid=prev</id>
		<title>Onionmixer: 원본소스코드 오류 및 번역수정</title>
		<link rel="alternate" type="text/html" href="https://trans.onionmixer.net/wiki/index.php?title=StartprogrammingusingObjectPascal:QueueApplication&amp;diff=394&amp;oldid=prev"/>
		<updated>2013-04-04T11:29:58Z</updated>

		<summary type="html">&lt;p&gt;원본소스코드 오류 및 번역수정&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Queue 프로그램==&lt;br /&gt;
&lt;br /&gt;
큐&amp;lt;sup&amp;gt;Queue&amp;lt;/sup&amp;gt; 는 자료구조 형식의 한 예입니다. 요소를 순서대로 삽입하고 저장하기 위해 사용하며, 삽입한 순서대로 삭제합니다. 이러한 규칙을 선입선출(&amp;#039;&amp;#039;First-In-First-Out&amp;#039;&amp;#039;) 이라고 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 예제에서는 &amp;#039;&amp;#039;TQueue&amp;#039;&amp;#039; 클래스가 있는 &amp;#039;&amp;#039;Queue&amp;#039;&amp;#039;라고 하는 Unit을 작성합니다. &amp;#039;&amp;#039;TQueue&amp;#039;&amp;#039; 클래스는 이름과 같은 데이터를 저장하는데 사용할 수 있으며, 순서대로 데이터를 가져올 수 있습니다. 큐로부터 데이터를 가져오면 큐에서 데이터를 삭제합니다. 예를 들어 큐에 10개의 항목이 들어있고, 3개의 항목을 가져올 때, 큐에는 7개의 항목이 남아있을 것입니다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Queue&amp;#039;&amp;#039; 유닛입니다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
unit queue;&lt;br /&gt;
// This unit contains TQueue class,&lt;br /&gt;
// which is suitable for any string queue&lt;br /&gt;
&lt;br /&gt;
{$mode objfpc}{$H+}&lt;br /&gt;
&lt;br /&gt;
interface&lt;br /&gt;
uses&lt;br /&gt;
    Classes, SysUtils;&lt;br /&gt;
&lt;br /&gt;
type&lt;br /&gt;
&lt;br /&gt;
    { TQueue }&lt;br /&gt;
&lt;br /&gt;
    TQueue = class&lt;br /&gt;
    private&lt;br /&gt;
        fArray: array of string;&lt;br /&gt;
        fTop: Integer;&lt;br /&gt;
    public&lt;br /&gt;
        constructor Create;&lt;br /&gt;
        destructor Destroy; override;&lt;br /&gt;
        function Put(AValue: string): Integer;&lt;br /&gt;
        function Get(var AValue: string): Boolean;&lt;br /&gt;
        function Count: Integer;&lt;br /&gt;
        function ReOrganize: Boolean;&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
implementation&lt;br /&gt;
&lt;br /&gt;
{ TQueue }&lt;br /&gt;
&lt;br /&gt;
constructor Tqueue.create;&lt;br /&gt;
begin&lt;br /&gt;
    fTop:= 0;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
destructor TQueue.destroy;&lt;br /&gt;
begin&lt;br /&gt;
    SetLength(fArray, 0); // Erase queue array from memory&lt;br /&gt;
    inherited destroy;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TQueue.Put(AValue: string): Integer;&lt;br /&gt;
begin&lt;br /&gt;
    if fTop &amp;gt;= 100 then&lt;br /&gt;
        ReOrganize;&lt;br /&gt;
    SetLength(fArray, Length(fArray) + 1);&lt;br /&gt;
    fArray[High(fArray)]:= AValue;&lt;br /&gt;
    Result:= High(fArray) - fTop;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TQueue.Get(var AValue: string): Boolean;&lt;br /&gt;
begin&lt;br /&gt;
    AValue:= &amp;#039;&amp;#039;;&lt;br /&gt;
    if fTop &amp;lt;= High(fArray) then&lt;br /&gt;
    begin&lt;br /&gt;
        AValue:= fArray[fTop];&lt;br /&gt;
        Inc(fTop);&lt;br /&gt;
        Result:= True;&lt;br /&gt;
    end&lt;br /&gt;
    else // empty&lt;br /&gt;
    begin&lt;br /&gt;
        Result:= False;&lt;br /&gt;
        // Erase array&lt;br /&gt;
        SetLength(fArray, 0);&lt;br /&gt;
        fTop:= 0;&lt;br /&gt;
    end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TQueue.Count: Integer;&lt;br /&gt;
begin&lt;br /&gt;
    Result:= Length(fArray) - fTop;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TQueue.ReOrganize: Boolean;&lt;br /&gt;
var&lt;br /&gt;
    i: Integer;&lt;br /&gt;
    PCount: Integer;&lt;br /&gt;
begin&lt;br /&gt;
    if fTop &amp;gt; 0 then&lt;br /&gt;
    begin&lt;br /&gt;
        PCount:= Count;&lt;br /&gt;
        for i:= fTop to High(fArray) do&lt;br /&gt;
            fArray[i - fTop]:= fArray[i];&lt;br /&gt;
        // Truncate unused data&lt;br /&gt;
        setLength(fArray, PCount);&lt;br /&gt;
        fTop:= 0;&lt;br /&gt;
        Result:= True; // Re Organize is done&lt;br /&gt;
    end&lt;br /&gt;
    else&lt;br /&gt;
        Result:= False; // nothing done;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
큐 프로그램의 메인 폼입니다.&lt;br /&gt;
&lt;br /&gt;
[[image:lazarus_12.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
메인 Unit의 코드입니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
unit main;&lt;br /&gt;
&lt;br /&gt;
{$mode objfpc}{$H+}&lt;br /&gt;
&lt;br /&gt;
interface&lt;br /&gt;
&lt;br /&gt;
uses&lt;br /&gt;
    Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics,&lt;br /&gt;
    Dialogs, Queue, StdCtrls;&lt;br /&gt;
&lt;br /&gt;
type&lt;br /&gt;
&lt;br /&gt;
    { TfmMain }&lt;br /&gt;
&lt;br /&gt;
    TfmMain = class(TForm)&lt;br /&gt;
        bbAdd: TButton;&lt;br /&gt;
        bbCount: TButton;&lt;br /&gt;
        bbGet: TButton;&lt;br /&gt;
        edCustomer: TEdit;&lt;br /&gt;
        Label1: TLabel;&lt;br /&gt;
        Memo1: TMemo;&lt;br /&gt;
        procedure bbAddClick(Sender: TObject);&lt;br /&gt;
        procedure bbCountClick(Sender: TObject);&lt;br /&gt;
        procedure bbGetClick(Sender: TObject);&lt;br /&gt;
        procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);&lt;br /&gt;
        procedure FormCreate(Sender: TObject);&lt;br /&gt;
    private&lt;br /&gt;
        { private declarations }&lt;br /&gt;
    public&lt;br /&gt;
        MyQueue: TQueue;&lt;br /&gt;
        { public declarations }&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
    fmMain: TfmMain;&lt;br /&gt;
&lt;br /&gt;
implementation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{ TfmMain }&lt;br /&gt;
&lt;br /&gt;
procedure TfmMain.FormCreate(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
    MyQueue:= TQueue.Create;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure TfmMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);&lt;br /&gt;
begin&lt;br /&gt;
    MyQueue.Free;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure TfmMain.bbCountClick(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
    Memo1.Lines.Add(&amp;#039;Queue length is: &amp;#039; + IntToStr(MyQueue.Count));&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure TfmMain.bbAddClick(Sender: TObject);&lt;br /&gt;
var&lt;br /&gt;
    APosition: Integer;&lt;br /&gt;
begin&lt;br /&gt;
    APosition:= MyQueue.Put(edCustomer.Text);&lt;br /&gt;
    Memo1.Lines.Add(edCustomer.Text + &amp;#039; has been added as # &amp;#039; +&lt;br /&gt;
    IntToStr(APosition + 1));&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure TfmMain.bbGetClick(Sender: TObject);&lt;br /&gt;
var&lt;br /&gt;
    ACustomer: string;&lt;br /&gt;
begin&lt;br /&gt;
    if MyQueue.Get(ACustomer) then&lt;br /&gt;
    begin&lt;br /&gt;
        Memo1.Lines.Add(&amp;#039;Got: &amp;#039; + ACustomer + &amp;#039; from the queue&amp;#039;);&lt;br /&gt;
    end&lt;br /&gt;
    else&lt;br /&gt;
        Memo1.Lines.Add(&amp;#039;Queue is empty&amp;#039;);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
initialization&lt;br /&gt;
    {$I main.lrs}&lt;br /&gt;
&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;TQueue&amp;#039;&amp;#039; 클래스에서 동적 배열을 확장하여 새로운 항목을 추가하기 위해 &amp;#039;&amp;#039;Put&amp;#039;&amp;#039; 메서드를 사용했고, 배열의 마지막 요소에 새로운 항목을 삽입했습니다.&lt;br /&gt;
&lt;br /&gt;
큐의 위 꼭대기에서 항목을 제거하기 위해 &amp;#039;&amp;#039;Get&amp;#039;&amp;#039; 메서드를 호출할 때, &amp;#039;&amp;#039;fTop&amp;#039;&amp;#039; 포인터는 큐의 다음 항목으로 이동할 것입니다.&lt;br /&gt;
&lt;br /&gt;
동적 배열의 꼭대기에서 항목을 제거하는 동작은 &amp;#039;&amp;#039;fTop&amp;#039;&amp;#039; 포인터가 이동하는 결과를 가져다주지만, 동적 배열의 항목은 메모리에 그대로 남아 있을 것이고, 공간을 차지할 것입니다. 왜냐하면, 동적 배열의 바닥부터만 지울 수 있기 때문에, 항목 갯수가 100개에 도달하면 동적 배열의 꼭대기에 있는 큐 요소를 이동하기 위해 &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;ReOrganize&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; 메서드를 호출할 것이며, 이렇게 하여 배열의 사용하지 않는 요소를 삭제하기 때문입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
동적 배열의 꼭대기 방향으로 큐의 요소들을 이동하는 코드입니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
   for i:= fTop to High(fArray) do&lt;br /&gt;
      fArray[i - fTop]:= fArray[i];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그리고 바닥으로부터 동적 배열을 자르는 코드입니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
    // Truncate unused data&lt;br /&gt;
    setLength(fArray, PCount);&lt;br /&gt;
    fTop:= 0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 예제에서 정보 은닉을 도입한 객체지향 프로그래밍을 알았습니다.  변수로의 접근과 같은 민감한 데이터로의 접근을 거부할 것입니다. 대신 객체에 대한 이상한 동작을 하지 않을 특정 메서드를 사용할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
민감한 데이터나 메서드는 클래스 선언의 private 섹션에 위치할 것입니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
    private&lt;br /&gt;
        fArray: array of string;&lt;br /&gt;
        fTop: Integer;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 클래스를 사용하는 프로그래머는 이 변수들에 직접 접근할 수 없습니다. 만약 이 변수에 접근할 수 있었다면, 고의적으로 &amp;#039;&amp;#039;fTop&amp;#039;&amp;#039; 이나 &amp;#039;&amp;#039;fArray&amp;#039;&amp;#039; 를 수정하여 큐를 깨뜨릴 수 있습니다. 예를 들어 큐에 고작 10개의 요소를 가지고 있었는데 &amp;#039;&amp;#039;fTop&amp;#039;&amp;#039;을 1000으로 수정했다면, 실행 도중에 접근 위반(Access violation) 오류가 발생할 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
직접 변수 사용의 대안으로서, 배열로부터 안전하게 항목을 추가하고 제거하기 위한 메서드 &amp;#039;&amp;#039;Put&amp;#039;&amp;#039;과 &amp;#039;&amp;#039;Get&amp;#039;&amp;#039;을 구현했습니다. 이 메서드는 요소들 내부를 제어하기 위한 게이트를 사용하는 것과 같습니다. OOP의 이러한 특징을 &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;캡슐화(encapsulation)&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;라고 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:StartprogrammingusingObjectPascal]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
	</entry>
	<entry>
		<id>https://trans.onionmixer.net/wiki/index.php?title=StartprogrammingusingObjectPascal:QueueApplication&amp;diff=392&amp;oldid=prev</id>
		<title>Onionmixer: SPOP 큐프로그램 페이지 추가</title>
		<link rel="alternate" type="text/html" href="https://trans.onionmixer.net/wiki/index.php?title=StartprogrammingusingObjectPascal:QueueApplication&amp;diff=392&amp;oldid=prev"/>
		<updated>2012-07-26T11:51:13Z</updated>

		<summary type="html">&lt;p&gt;SPOP 큐프로그램 페이지 추가&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;===큐 프로그램===&lt;br /&gt;
&lt;br /&gt;
큐는 자료구조 형식의 한 예입니다. 요소를 순서대로 삽입하고 저장하기 위해 사용하며, 삽입한 순서대로 삭제합니다. 이러한 규칙을 선입선출(&amp;#039;&amp;#039;First-In-First-Out&amp;#039;&amp;#039;) 이라고 합니다.&lt;br /&gt;
&lt;br /&gt;
이 예제에서는 &amp;#039;&amp;#039;TQueue&amp;#039;&amp;#039; 클래스가 있는 &amp;#039;&amp;#039;Queue&amp;#039;&amp;#039;라고 하는 유닛을 작성합니다. &amp;#039;&amp;#039;TQueue&amp;#039;&amp;#039; 클래스는 이름과 같은 데이터를 저장하는데 사용할 수 있으며, 순서대로 데이터를 가져올 수 있습니다. 큐로부터 데이터를 가져오면 큐에서 데이터를 삭제합니다. 예를 들어 큐에 10개의 항목이 들어있고, 3개의 항목을 가져올 때, 큐에는 7개의 항목이 남아있게 될 것입니다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Queue&amp;#039;&amp;#039; 유닛입니다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
unit queue;&lt;br /&gt;
// This unit contains TQueue class,&lt;br /&gt;
// which is suitable for any string queue&lt;br /&gt;
&lt;br /&gt;
{$mode objfpc}{$H+}&lt;br /&gt;
&lt;br /&gt;
interface&lt;br /&gt;
uses&lt;br /&gt;
    Classes, SysUtils;&lt;br /&gt;
&lt;br /&gt;
type&lt;br /&gt;
&lt;br /&gt;
    { TQueue }&lt;br /&gt;
&lt;br /&gt;
    TQueue = class&lt;br /&gt;
    private&lt;br /&gt;
        fArray: array of string;&lt;br /&gt;
        fTop: Integer;&lt;br /&gt;
    public&lt;br /&gt;
        constructor Create;&lt;br /&gt;
        destructor Destroy; override;&lt;br /&gt;
        function Put(AValue: string): Integer;&lt;br /&gt;
        function Get(var AValue: string): Boolean;&lt;br /&gt;
        function Count: Integer;&lt;br /&gt;
        function ReOrganize: Boolean;&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
implementation&lt;br /&gt;
&lt;br /&gt;
{ TQueue }&lt;br /&gt;
&lt;br /&gt;
constructor Tqueue.create;&lt;br /&gt;
begin&lt;br /&gt;
    fTop:= 0;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
destructor TQueue.destroy;&lt;br /&gt;
begin&lt;br /&gt;
    SetLength(fArray, 0); // Erase queue array from memory&lt;br /&gt;
    inherited destroy;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TQueue.Put(AValue: string): Integer;&lt;br /&gt;
begin&lt;br /&gt;
    if fTop &amp;gt;= 100 then&lt;br /&gt;
        ReOrganize;&lt;br /&gt;
    SetLength(fArray, Length(fArray) + 1);&lt;br /&gt;
    fArray[High(fArray)]:= AValue;&lt;br /&gt;
    Result:= High(fArray) - fTop;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TQueue.Get(var AValue: string): Boolean;&lt;br /&gt;
begin&lt;br /&gt;
    AValue:= &amp;#039;&amp;#039;;&lt;br /&gt;
    if fTop &amp;lt;= High(fArray) then&lt;br /&gt;
    begin&lt;br /&gt;
        AValue:= fArray[fTop];&lt;br /&gt;
        Inc(fTop);&lt;br /&gt;
        Result:= True;&lt;br /&gt;
    end&lt;br /&gt;
    else // empty&lt;br /&gt;
    begin&lt;br /&gt;
        Result:= False;&lt;br /&gt;
        // Erase array&lt;br /&gt;
        SetLength(fArray, 0);&lt;br /&gt;
        fTop:= 0;&lt;br /&gt;
    end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TQueue.Count: Integer;&lt;br /&gt;
begin&lt;br /&gt;
    Result:= Length(fArray) - fTop;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TQueue.ReOrganize: Boolean;&lt;br /&gt;
var&lt;br /&gt;
    i: Integer;&lt;br /&gt;
    PCount: Integer;&lt;br /&gt;
begin&lt;br /&gt;
    if fTop &amp;gt; 0 then&lt;br /&gt;
    begin&lt;br /&gt;
        PCount:= Count;&lt;br /&gt;
        for i:= fTop to High(fArray) do&lt;br /&gt;
            fArray[i - fTop]:= fArray[i];&lt;br /&gt;
        // Truncate unused data&lt;br /&gt;
        setLength(fArray, PCount);&lt;br /&gt;
        fTop:= 0;&lt;br /&gt;
        Result:= True; // Re Organize is done&lt;br /&gt;
    end&lt;br /&gt;
    else&lt;br /&gt;
        Result:= False; // nothing done&lt;br /&gt;
    end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
큐 프로그램의 메인 폼입니다.&lt;br /&gt;
&lt;br /&gt;
[[image:lazarus_12.png]]&lt;br /&gt;
&lt;br /&gt;
메인 유닛의 코드입니다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
unit main;&lt;br /&gt;
&lt;br /&gt;
{$mode objfpc}{$H+}&lt;br /&gt;
&lt;br /&gt;
interface&lt;br /&gt;
&lt;br /&gt;
uses&lt;br /&gt;
    Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics,&lt;br /&gt;
    Dialogs, Queue, StdCtrls;&lt;br /&gt;
&lt;br /&gt;
type&lt;br /&gt;
&lt;br /&gt;
    { TfmMain }&lt;br /&gt;
&lt;br /&gt;
    TfmMain = class(TForm)&lt;br /&gt;
        bbAdd: TButton;&lt;br /&gt;
        bbCount: TButton;&lt;br /&gt;
        bbGet: TButton;&lt;br /&gt;
        edCustomer: TEdit;&lt;br /&gt;
        Label1: TLabel;&lt;br /&gt;
        Memo1: TMemo;&lt;br /&gt;
        procedure bbAddClick(Sender: TObject);&lt;br /&gt;
        procedure bbCountClick(Sender: TObject);&lt;br /&gt;
        procedure bbGetClick(Sender: TObject);&lt;br /&gt;
        procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);&lt;br /&gt;
        procedure FormCreate(Sender: TObject);&lt;br /&gt;
    private&lt;br /&gt;
        { private declarations }&lt;br /&gt;
    public&lt;br /&gt;
        MyQueue: TQueue;&lt;br /&gt;
        { public declarations }&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
    fmMain: TfmMain;&lt;br /&gt;
&lt;br /&gt;
implementation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{ TfmMain }&lt;br /&gt;
&lt;br /&gt;
procedure TfmMain.FormCreate(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
    MyQueue:= TQueue.Create;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure TfmMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);&lt;br /&gt;
begin&lt;br /&gt;
    MyQueue.Free;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure TfmMain.bbCountClick(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
    Memo1.Lines.Add(&amp;#039;Queue length is: &amp;#039; + IntToStr(MyQueue.Count));&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure TfmMain.bbAddClick(Sender: TObject);&lt;br /&gt;
var&lt;br /&gt;
    APosition: Integer;&lt;br /&gt;
begin&lt;br /&gt;
    APosition:= MyQueue.Put(edCustomer.Text);&lt;br /&gt;
    Memo1.Lines.Add(edCustomer.Text + &amp;#039; has been added as # &amp;#039; +&lt;br /&gt;
    IntToStr(APosition + 1));&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure TfmMain.bbGetClick(Sender: TObject);&lt;br /&gt;
var&lt;br /&gt;
    ACustomer: string;&lt;br /&gt;
begin&lt;br /&gt;
    if MyQueue.Get(ACustomer) then&lt;br /&gt;
    begin&lt;br /&gt;
        Memo1.Lines.Add(&amp;#039;Got: &amp;#039; + ACustomer + &amp;#039; from the queue&amp;#039;);&lt;br /&gt;
    end&lt;br /&gt;
    else&lt;br /&gt;
        Memo1.Lines.Add(&amp;#039;Queue is empty&amp;#039;);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
initialization&lt;br /&gt;
    {$I main.lrs}&lt;br /&gt;
&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;TQueue&amp;#039;&amp;#039; 클래스에서 동적 배열을 확장하여 새로운 항목을 추가하기 위해 &amp;#039;&amp;#039;Put&amp;#039;&amp;#039; 메서드를 사용했고, 배열의 마지막 요소에 새로운 항목을 삽입했습니다.&lt;br /&gt;
&lt;br /&gt;
큐의 위 꼭대기에서 항목을 제거하기 위해 &amp;#039;&amp;#039;Get&amp;#039;&amp;#039; 메서드를 호출할 때, &amp;#039;&amp;#039;fTop&amp;#039;&amp;#039; 포인터는 큐의 다음 항목으로 이동할 것입니다.&lt;br /&gt;
&lt;br /&gt;
동적 배열의 꼭대기에서 항목을 제거하는 동작은 &amp;#039;&amp;#039;fTop&amp;#039;&amp;#039; 포인터가 이동하는 결과를 가져다주지만, 동적 배열의 항목은 메모리에 그대로 남아 있을 것이고, 공간을 차지할 것입니다. 왜냐하면, 동적 배열의 바닥부터만 지울 수 있기 때문에, 항목 갯수가 100개에 도달하면 동적 배열의 꼭대기에 있는 큐 요소를 이동하기 위해 &amp;#039;&amp;#039;ReOrganize&amp;#039;&amp;#039; 메서드를 호출할 것이며, 이렇게 하여 배열의 사용하지 않는 요소를 삭제하기 때문입니다.&lt;br /&gt;
&lt;br /&gt;
동적 배열의 꼭대기 방향으로 큐의 요소들을 이동하는 코드입니다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
   for i:= fTop to High(fArray) do&lt;br /&gt;
      fArray[i - fTop]:= fArray[i];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
그리고 바닥으로부터 동적 배열을 자르는 코드입니다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
    // Truncate unused data&lt;br /&gt;
    setLength(fArray, PCount);&lt;br /&gt;
    fTop:= 0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이 예제에서 정보 은닉을 도입한 객체 지향 프로그래밍을 알았습니다.  변수로의 접근과 같은 민감한 데이터로의 접근을 거부할 것입니다. 대신 객체에 대한 이상한 동작을 하지 않을 특정 메서드를 사용할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
민감한 데이터나 메서드는 클래스 선언의 private 섹션에 위치할 것입니다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
    private&lt;br /&gt;
        fArray: array of string;&lt;br /&gt;
        fTop: Integer;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이 클래스를 사용하는 프로그래머는 이 변수들에 직접 접근할 수 없습니다. 만약 이 변수에 접근할 수 있었다면, 고의적으로 &amp;#039;&amp;#039;fTop&amp;#039;&amp;#039; 이나 &amp;#039;&amp;#039;fArray&amp;#039;&amp;#039; 를 수정하여 큐를 깨뜨릴 수 있습니다. 예를 들어 큐에 고작 10개의 요소를 가지고 있었는데 &amp;#039;&amp;#039;fTop&amp;#039;&amp;#039;을 1000으로 수정했다면, 실행 시간에 접근 위반 오류 결과를 가져올 것입니다.&lt;br /&gt;
&lt;br /&gt;
직접 변수 사용의 대안으로서, 배열로부터 안전하게 항목을 추가하고 제거하기 위한 메서드 &amp;#039;&amp;#039;Put&amp;#039;&amp;#039;과 &amp;#039;&amp;#039;Get&amp;#039;&amp;#039;을 구현했습니다. 이 메서드는 요소들 내부를 제어하기 위한 게이트를 사용하는 것과 같습니다. OOP의 이러한 특징을 &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;캡슐화(encapsulation)&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;라고 합니다.&lt;br /&gt;
[[Category:StartprogrammingusingObjectPascal]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
	</entry>
</feed>