여기 볼랜드 포럼, 델파이 채널, 큐앤에이 게시판에 질문을 올려두었는데 다들 바쁘신지
묵묵부답 이시네요. ^^
혹시 아시는 내용 이라면 도움좀 부탁 드리겠습니다.
http://www.borlandforum.com/impboard/impboard.dll?action=read&db=del_qna&no=9713
읽어 주셔서 감사감사...
주정섭 님이 쓰신 글 :
: 여러 사람이 참여할 수 있는 강좌 게시판 문화를 만들기 위해, 매우 간단하지만, 다소 알송달송한 델파이 관련 문제를 제출해 보려한다.
:
: 이 문제들의 정답은 매우 간단하다. 만일 정답 문장이 두 문장 이상을 초과한다면 정답이 아닐 가능성이 크다. 다음 모든 문제의 답들은 한 문장으로 답변할 수 있어야 한다.
:
: [문제에 대한 전제 조건]
:
: 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.
:
: 만일 이 문제 모두를 보는 즉시 답할 수 있었다면, 즉 예제를 컴파일하고 실행해 보지 않고도 즉시 풀었다면 당신은 엄청난 오브젝트 파스칼 고수임에 틀림없으므로 삼가 경의를 표하는 바입니다.
:
: 만일 그러한 분이라면 즉시 댓글을 남겨서 자신의 이름을 공표해주기 바랍니다.
: