C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[9738] 함께 풀어봅시다. 오브젝트 파스칼 관련 간단한 문제 몇개
주정섭 [jjsverylong] 1336 읽음    2004-07-12 15:26
여러 사람이 참여할 수 있는 강좌 게시판 문화를 만들기 위해, 매우 간단하지만, 다소 알송달송한 델파이 관련 문제를 제출해 보려한다.

이 문제들의 정답은 매우 간단하다. 만일 정답 문장이 두 문장 이상을 초과한다면 정답이 아닐 가능성이 크다. 다음 모든 문제의 답들은 한 문장으로 답변할 수 있어야 한다. 

[문제에 대한 전제 조건]

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.

만일 이 문제 모두를 보는 즉시 답할 수 있었다면, 즉 예제를 컴파일하고 실행해 보지 않고도 즉시 풀었다면 당신은 엄청난 오브젝트 파스칼 고수임에 틀림없으므로 삼가 경의를 표하는 바입니다.

만일 그러한 분이라면 즉시 댓글을 남겨서 자신의 이름을 공표해주기 바랍니다.
류종택 [ryujt]   2004-07-13 08:54 X
델파이 튜토리얼에서 옮겨왔습니다.
아무리 생각해봐도 성격에 맞는 게시판이 없어서,
자유게시판으로 옮겼습니다.
주정섭 [jjsverylong]   2004-07-14 00:20 X
음.. 글이 옮겨지는 바람에 한참 동안 헤매었는데, 이글을 왜 자유게시판으로 옮겼는지 좀 그렇군요. 충분히 여러 사람이 같이 공부할 수 있는글이라고 생각해서 올렸는데.

강좌란에 반드시 프로그램 설명서 같은 내용만 있으람 법은 없지 않습니까.. 여러 방식의 글도 강좌란에 있었으면 하는 바램입니다.

이번 문제가 너무 쉬웠다는 의견이 있는데, 좀더 난해한 문제들로 다시 한번 도전해 보겠습니다. 문제의 함정 난이도를 더 올려야 겠군요
김준엽 [corba]   2004-07-14 10:42 X
자유게시판이 더 눈에 띄므로 오히려 더 많은 사람들이 볼 수 있다는 잇점도 있다고 생각합니다 ^-^

+ -

관련 글 리스트
9738 함께 풀어봅시다. 오브젝트 파스칼 관련 간단한 문제 몇개 주정섭 1336 2004/07/12
9746     저기... 주정섭님... 미안한 부탁인데 이것좀 해결해 주시면 안될까요? 어떤게좋을까요? 1397 2004/07/14
9739     문제가 너무 쉬웠다는... ㅠ.ㅠ 어떤게좋을까요? 1112 2004/07/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.