여러 사람이 참여할 수 있는 강좌 게시판 문화를 만들기 위해, 매우 간단하지만, 다소 알송달송한 델파이 관련 문제를 제출해 보려한다.
이 문제들의 정답은 매우 간단하다. 만일 정답 문장이 두 문장 이상을 초과한다면 정답이 아닐 가능성이 크다. 다음 모든 문제의 답들은 한 문장으로 답변할 수 있어야 한다.
[문제에 대한 전제 조건]
1. 모든 문제에서 TMyClass은 클래스 혹은 사용자 정의 데이타형 이라고 가정
2. Method1...MethodN은 해당 클래스의 메서드명이라고 가정
3. Field1...FieldN은 해당 클래스의 필드멤버라고 가정
자 문제를 본격적으로 풀어 보자.
[문제1] 다음과 같은 표현식이 가능하려면 어떻게 해야 하는가? 이 문제의 핵심은, 메서드끼리 연속하여 호출할 수 있게 하려면 어떤 방식으로 Method1,Method2, Method3을 정의해야 하는가이다.
var
obj : TMyClass;
begin
obj := TMyClass.Create();
obj.Method1().Method2().Method3();
end
[문제2] 일반적으로 오브젝트는 반드시 생성자를 호출해야만 사용이 가능하다. 생성자를 호출하지 않고서도 사용가능한 오브젝트를 정의하려면 어떻게 해야 하는가? 즉 다음과 같은 문법이 가능하려면, TMyClass를 어떻게 정의해야 하는가?
var
obj : TMyClass;
begin
// obj := TMyClass.Create; 생성자를 호출하지 않았음
obj.Field1 := 100;
obj.Method1(1000);
obj.Method2(2000);
end
[문제3] SomeFunc()가 함수라고 가정했을 때, 다음과 같은 표현이 델파이에서 가능한가? 이 문제의 핵심은 델파이에서 lvalue로 함수를 사용할 수 있는가이다.
var
...
begin
SomeFunc() := 'afadsfas';
end
[문제4] const로 정의된 변수 값을 변경하려 하면 컴파일 에러가 발생한다. 다음 소스는 그런 예제이다. 어떻게 하면 const 변수의 값을 변경해도 컴파일러가 에러를 발생하지 않게 할 수 있는가? 즉, const 변수 값을 실행시 수정할 수 있도록 하려면 어떻게 해야 하는가? 그리고 이 편법(?)적인 방법을 어떤 경우에 사용하면 좋은가?
...
implementation
{$R *.dfm}
const ConstValue : integer = 20;
procedure TForm1.FormCreate(Sender: TObject);
begin
ConstValue := 30; // Compile Error
end;
end.
[문제 5] 다음과 같이 TMyClass를 정의했다고 가정하자. 그리고 MethodX를 다음과 같이 정의했다고 가정하자. field1과 filed2를 참조하는 라인에서 컴파일 에러가 발생하는 이유는 무엇인가?
type
TMyClass = class(TObject)
private
field1, field2: integer;
public
class procedure MethodX;
end;
implementation
class procedure TMyClass.MethodX;
begin
field1 := 20; // compile error
field2 := 30; // compile error
end;
[문제6] 다음과 같은 Unit1, Unit2라는 두 유닛이 있다고 가정하자. Unit1에서는, Unit2에 정의 되어 있는 TTest 클래스 field1 멤버 참조문에서 컴파일 에러가 발생한다. 그런데 Unit2의 TTest2 클래스는 TTest1의 private 멤버인 field1을 참조하는데 아무런 문제가 없다. 그 이유는 무엇인가?
// ----------------Unit1.pas의 내용 -------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses Unit2;
procedure TForm1.FormCreate(Sender: TObject);
var
tt : TTest1;
begin
tt := TTest1.Create;
tt.field1 := 20; // Compiler Error!
end;
end.
//---------------------------- Unit2.pas의 내용 ----------------------------------------
unit Unit2;
interface
type
TTest1 = class(TObject)
private
field1 : integer;
end;
TTest2 = class(TObject)
public
procedure Method1;
end;
implementation
{ TTest2 }
procedure TTest2.Method1;
var
tt : TTest1;
begin
tt := TTest1.Create;
tt.field1 := 20; // 컴파일 에러 발생하지 않음. 컴파일 OK
end;
end.
만일 이 문제 모두를 보는 즉시 답할 수 있었다면, 즉 예제를 컴파일하고 실행해 보지 않고도 즉시 풀었다면 당신은 엄청난 오브젝트 파스칼 고수임에 틀림없으므로 삼가 경의를 표하는 바입니다.
만일 그러한 분이라면 즉시 댓글을 남겨서 자신의 이름을 공표해주기 바랍니다.
|
아무리 생각해봐도 성격에 맞는 게시판이 없어서,
자유게시판으로 옮겼습니다.