오브젝트 파스칼에서 오브젝트는 레코드형 변수와 마찬가지로 여러 개의 요소들로 이루어진 자료들의 모음이다. 레코드에서 각각의 변수 요소들을 필드라고 하듯이 오브젝트에 대해서도 각각의 변수 요소들을 필드라고 한다. 오브젝트의 필드들은 적절하게 외부에 가려져 있으며, 보통 이들을 직접 참조하는 대신 오브젝트에서 제공하는 프로시저를 호출하여 작업을 처리한다. 이런 프로시저들을 메소드라 하고, 오브젝트는 이와 같이 상태를 보존하는 필드와 동작을 행하는 메소드로 구성된다. 또한 필드에 대한 무책임한 참조로부터 보호하기 위해 적절한 참조 방법을 제공하기도 하는데, 이를 프로퍼티라고 하고, 클래스에 속한 필드, 메소드, 프로퍼티 등을 클래스의 멤버라고 한다.

 

클래스는 레코드형과 마찬가지로 일종의 자료형이다. 클래스형으로 정의된 변수는 자체로 아직 오브젝트가 되는 것은 아니다. 오브젝트가 되어 메모리에 자리잡기 위해서는 인스턴스화하는 작업이 필요한데, 이를 생성(Create)이라고 한다. 이렇게 생성된 오브젝트를 오브젝트 또는 인스턴스라고 부른다. 오브젝트는 클래스에서 정의한 필드, 프로퍼티, 메소드를 가지고 있게 된다. 오브젝트의 사용이 끝나면 메모리에서 삭제하는 것을 파괴(Destroy)한다고 한다.

 

클래스를 선언할 항상 클래스의 모든 멤버들을 선언해야 하는 것은 아니다.

기존에 선언된 클래스를 계승받아 새로운 클래스에 필요한 멤버들만 선택해서 선언하면 된다. 이때, 새로 선언된 클래스를 후손(Descendant)이라 하고, 계승받은 기존의 클래스를 조상(Ancestor)이라고 부른다. 모든 클래스의 선언시에 항상 계승받을 선조 클래스를 지정하게 되어 있으면 생략하면 기본적으로 Tobject 클래스로부터 직접 계승받는 것으로 된다. Tobject 클래스는 모든 클래스의 가장 높은 조상이 되며, 모든 오브젝트가 갖춰야 기본적인 기능들을 구현해 놓은 클래스이다. 후손 클래스는 새로운 멤버를 계속 추가할 수만 있고 제거할 수는 없다.

 

클래스의 선언은 다른 선언과는 달리 유닛이나 프로그램의 가장 바깥에서만 행할 있다. 보통 유닛의 인터페이스 절에 선언하게 된다.


Type

   TMyClass = class(TObject)          // TMyClass 클래스의 선언-----------------(1)

   

end;

var

   MyObject : TMyClass;                 // TMyClass형의 변수 MyObject선언------(2)

 

 MyObject := TMyClass.Create;     // MyObject 생성-------------------------(3)

MyObject.Free;                             // MyObject 파괴--------------------------(4)


TMyClass TObject 부터 계승받았다.

(1) 그러므로 선조는 TObject 되고 후손은 TMyClass 된다

그리고 (2)에서 TmyClass형으로 변수 MyObject 선언하였다. 아직까지 오브젝트가 생성된 것은 아니다. 단지 선언만 했을 뿐이다

(3)에서 마침내 생성을 시켜 주었다

그리고 필요가 없게 되면 (4)에서처럼 파괴를 시켜주어야 한다.

TMyClass형의 Create라는 메소드는 위에서 만들어 주지 않았다. 그러면 어떻게 사용할 있었을까?

바로 TObject 기본적으로 정의되어 있으므로 TMyClass TObject에서 상속받기만 하면 TObject 메소드를 마치 자신의 것인양 있게 되는 것이다

'공부방 > Delphi' 카테고리의 다른 글

[델파이] 폼 생성과 해제  (0) 2010.07.15
[델파이] 클래스의 가시성  (0) 2010.07.15
[델파이] 프로시저와 함수  (1) 2010.07.14
[델파이] Case 문법  (0) 2010.07.14
[델파이] 기본 컴포넌트  (0) 2010.07.14

프로시저는
결과를 돌려주지 않고, 함수의 결과를 돌려준다

프로시저와 함수의 정의는 크게 부분으로 나누어 진다. 한가지는 프로그램의 다른 부분에서 해당 프로시저와 함수의 선언을 정의하는 부분이고, 다른 부분은 실제 프로시저나 함수의 내용을 적는 부분( 개의 문장들로 이루어진 블록)이다

Procedure <프로시저 이름>(매개변수목록);

[선언부]

begin

   [문장들]

end;


예) 

Procedure ReverseStr(s: String);

Var

   r: String;

   i: Byte;

Begin

   // 문자열 변수 r (null) 설정한다.

   r := ' ';

   // 문자열을 마지막 문자부터 첫번째 문자까지 반복한다.

   for i := length(s) downto 1 do

      // s내의 문자를 r 끝에 연결한다.

      r := r + s[i];

   // Memo객체를 비우고 결과를 나타낸다.

   Form1.Memo1.Lines.Clear;

   Form1.Memo1.Lines.Add(r);

End;


Procedure 프로시저의 시작임을 알리는 예약어 이며, <프로시저 이름> 프로시저를 호출할 사용되는 이름이다. (매개변수목록) 프로시저를 호출한 쪽에서 프로시저에게 넘겨주는 입력값들의 목록이고, [선언부] 프로시저에서 사용할 변수나, 상수, 레이블들을 선언하는 곳이다. 만약 사용되는 변수나 상수들이 없다면 생략가능하다. 마지막 [문장들] 실제 프로시저의 행위를 정의하는 문장들이다



Function <함수 이름>(매개변수목록):<리턴타입>;

[선언부]

begin

   [문장들]

end;


예) 

Function Reverse(s: String) : String;

Var

   r: String;

   i: Byte;

Begin

   r := ' ';

   For i := length(s) downto 1 do

      r := r + s[i];

   Reverse := r;   // Result := r 같은 결과를 얻을 있다.

End;



함수와 프로시저를 호출

Procedure Tform1.Button1Click(Sender: Tobject);

Begin

   ReverseStr(Edit1.text);                     // 프로시저를 호출하는 경우

   Memo1.Lines.Add(Reverse (Edit1.Text));      // 함수를 호출하는 경우

End;


매개변수 전달방법

Call by value

방법에서는 변수를 값으로 전달하는 방식으로 컴파일러는 변수의 값을 복사하여 원래 값이 아니라 복사한 값이 전달된다. 그러니까 윈도우 탐색기에서 파일을 복사하여 다른 디렉토리에 붙여쓰기를 하는 것처럼, 변수의 내용을 복사하여 프로시저의 매개변수로 붙여쓰기하는 것과 마찬가지라고 생각하면 좋을 싶다.

그러면 프로시저내에서 매개변수를 지지고 볶든 간에, 원래 변수에 저장되어 있던 값들은 그대로이다.

Procedure add(x,y : integer);

 

Call by Reference

방법은 변수의 값을 복사하여 쓰는 것과는 달리, 방번호는 같은데 변수와 매개변수의 사용하는 이름이 다르다고 생각하자. 100 방에 있는 값을, 호출할 때는 A(변수)라고 부르고 프로시저에서는 A1(매개변수)이라고 부른다고 가정하면 같은 방에 있는 값이므로 A1 바뀌면 A 자연히 따라 바뀌게 되는 것이다.

Procedure ReadData(Var rec : string);


Call by Const

상수로 매개변수를 전달하는 것은 프로시저 내에서 값을 변경하지 못하도록 컴파일러에 알린다.

아래의 예처럼 매개변수 s const 전달하는 경우는 WriteData라는 프로시저 안에서 s 값을 바꿀 수가 없다. Read Only 변수라고 생각하면 되겠다.

 

Procedure WriteData(const s : string);



출처 : 델파이 4 中 발췌

'공부방 > Delphi' 카테고리의 다른 글

[델파이] 클래스의 가시성  (0) 2010.07.15
[델파이] 오브젝트, 인스턴스, 클래스  (0) 2010.07.14
[델파이] Case 문법  (0) 2010.07.14
[델파이] 기본 컴포넌트  (0) 2010.07.14
[델파이] 문자열 관련 함수  (0) 2010.05.18

Case <variable> of

   <value> : <하나 또는 하나 이상의 문장>;

   <value> : <하나 또는 하나 이상의 문장>;

Else

   <하나 또는 하나 이상의 문장>

   //Case값의 어느 경우에도 해당되지 않는 모든 값에 대해 적용된다.

End;


<variable> Ordinal타입이다(String타입은 유효하지 않다.)

<value> 나타나는 값은 case 문에서 유일해야 한다.

<value> 중에 <variable> 같은 값을 갖는 것이 없다면 else절에 있는 statement 실행된다.


EX )

Case I of

   1..5 : Caption := 'Low';

   6..9 : Caption := 'High';

   0, 10..99 : Caption := 'Out of range';

Else

   Caption := ' ';

End;

'공부방 > Delphi' 카테고리의 다른 글

[델파이] 오브젝트, 인스턴스, 클래스  (0) 2010.07.14
[델파이] 프로시저와 함수  (1) 2010.07.14
[델파이] 기본 컴포넌트  (0) 2010.07.14
[델파이] 문자열 관련 함수  (0) 2010.05.18
[델파이] POS  (0) 2010.05.13

+ Recent posts