<4D F736F F D20C5D7C6AEB8AEBDBA20B0D4C0D320B8B8B5E9B1E22E646F63>
|
|
- 자현 주
- 5 years ago
- Views:
Transcription
1 Chapter 0 테트리스게임만들기 본강좌의목적은테트리스게임자체보다는사용자인터페이스와논리구조를분리하여분석 / 설계하고코딩하는과정을설명하기위한것이다. 특히 BDS 2006에서새로추가된 Together for Delphi를이용하여보다쉽게객체지향적설계를실제업무에도입하는과정을설명하고자한다.
2 1 단계 UI 와 Logic 의분리 이번강좌에서는필자가원래사용하던문서작성법이아닌클래스다이어그램만으로기능설계와구조설계를병행하도록하겠다. User-Interface 의기능분석 [ 그림 1] UI 와 Logic 의분리 [ 그림 1] 에서우선우측의 UI_Interface.TUI 클래스를주목하자. 해당클래스의멤버들에서사용된작명규칙을보면, Public 메쏘드앞에는아무런접두어가붙지않지만, 이벤트에해당하는메소드앞에는 on_ 을붙여놨다. 이것은필자만의습관으로, 이름만으로해당메쏘드의역할을쉽게구별하기위해서이다. 추후내부처리용으로사용되는 Private 메쏘드는 do_ 를앞에붙이게된다. [ 그림 1] 의 UI_Interface.TUI 클래스는아래와같은기능을가져야한다. 기능 - GameEnd : 게임종료처리 이벤트 - on_start : 사용자가게임을시작하도록하였음 - on_keydown : 사용자가키보드를클릭하였음
3 Logic-Interface의기능분석이어서 [ 그림 1] 의좌측 Logic_Interface.TLI 클래스는테트리스게임의논리계층의최상의클래스이며, 해당클래스는다음과같은기능을가져야한다. 기능 - StartGame - Process_KeyDown - Draw 이벤트 - on_tick - on_gameend
4 동적분석 UI Logoic on_start StartGame while GameStarted = True on_tick on_keydown Draw MoveDown GameStarted? Yes Process_KeyDown GameEnd? Yes GameEnd on_gameend [ 그림 2] Job Flow [ 그림 2] 에서는 UI 와 Logic 이서로호출하는순서와이벤트의흐름을설명하고있다. on_start이벤트가발생하면 Logic의 GameStarted 속성을 True로변경한다. GameStarted 속성이 True로변경되면내부타이머가작동하면서주기적으로 on_tick 이벤트를발생한다. On_Tick 이벤트는블록을한칸씩밑으로이동하는메소드를호출한다. 이동을담당하고있는 Process_KeyDown 메소드는더이상블록을내려놓을수없을때, GameStarted 속성을 False로변경시키면서 on_gameend 이벤트를발생시킨다. 사용자가키를누르게되면 on_keydown 이벤트가발생하게되고, 게임중일경우에만 Logic에게이메시지를전달하게된다. 사실기능분석이분석의가장기본이되기는하지만, 업무분석에는동적분석이더욱효율적일때가많다. 어느분석을먼저하더라도분석은단일프로세스로끝나는경우는거의없다. 즉, 기능분석을마치고동적분석을하는동안필요한기능이분석되지않은것을발견했을경우다시기능분석을변경하고, 동적분석후에도기능분석을통해서동적분석의오류를발견할수도있다.
5 기능분석과구조분석그리고동적분석은진행하는동안서로보완될경우가많다. 그리고, 반드시 어느것을먼저해야한다 라는규칙은없다.
6 [ 소스 1] UI_Interface Unit 의소스 1 : unit UI_Interface; 2 : 3 : interface 4 : 5 : uses 6 : Classes, SysUtils; 7 : 8 : type 9 : TUI = class 10 : protected 11 : procedure on_keydown(key:word); 12 : procedure on_start; 13 : public 14 : class function GetObject:TUI; 15 : procedure GameEnd; 16 : end; 17 : 18 : implementation 19 : 20 : uses 21 : Logic_Interface; 22 : 23 : var 24 : MyObject : TUI = Nil; 25 : 26 : { TUI } 27 : 28 : class function TUI.GetObject: TUI; 29 : begin 30 : if MyObject = Nil then MyObject:= TUI.Create; 31 : Result:= MyObject; 32 : end; 33 :
7 34 : procedure TUI.on_Start; 35 : begin 36 : TLI.GetObject.StartGame; 37 : end; 38 : 39 : procedure TUI.on_KeyDown(Key:Word); 40 : begin 41 : if TLI.GetObject.GameStarted = True then TLI.GetObject.Process_KeyDown(Key); 42 : end; 43 : 44 : procedure TUI.GameEnd; 45 : begin 46 : {ToDo : } 47 : end; 48 : 49 : end.
8 [ 소스 2] Logic_Interface Unit 의소스 1 : unit Logic_Interface; 2 : 3 : interface 4 : 5 : uses 6 : BlockShape, BlockCell, GameTimer, Windows, Classes, SysUtils; 7 : 8 : type 9 : TLI = class 10 : private 11 : FGameStarted: Boolean; 12 : procedure SetGameStarted(const Value: Boolean); 13 : protected 14 : procedure on_gameend; 15 : procedure on_tick; 16 : public 17 : GameTimer : TGameTimer; 18 : BlockCell : TBlockCell; 19 : BlockShape : TBlockShape; 20 : class function GetObject:TLI; 21 : procedure StartGame; 22 : procedure Draw; 23 : procedure Process_KeyDown(Key:Word); 24 : published 25 : property GameStarted : Boolean read FGameStarted write SetGameStarted; 26 : end; 27 : 28 : implementation 29 : 30 : uses 31 : UI_Interface; 32 : 33 : var
9 34 : MyObject : TLI = Nil; 35 : 36 : { TLI } 37 : 38 : class function TLI.GetObject: TLI; 39 : begin 40 : if MyObject = Nil then MyObject:= TLI.Create; 41 : Result:= MyObject; 42 : end; 43 : 44 : procedure TLI.SetGameStarted(const Value: Boolean); 45 : begin 46 : FGameStarted := Value; 47 : 48 : if Value = True then Self.StartGame 49 : else Self.on_GameEnd; 50 : end; 51 : 52 : procedure TLI.StartGame; 53 : begin 54 : {ToDo : } 55 : end; 56 : 57 : procedure TLI.on_GameEnd; 58 : begin 59 : TUI.GetObject.GameEnd; 60 : end; 61 : 62 : procedure TLI.on_Tick; 63 : begin 64 : Self.Process_KeyDown(VK_Down); 65 : end; 66 : 67 : procedure TLI.Draw; 68 : begin 69 : {ToDo : }
10 70 : end; 71 : 72 : procedure TLI.Process_KeyDown(Key:Word); 73 : begin 74 : case Key of 75 : VK_Left : {ToDo : }; 76 : VK_Right : {ToDo : }; 77 : VK_Up : {ToDo : }; 78 : VK_Down : {ToDo : if 게임종료 then GameStarted:= False}; 79 : VK_Space : {ToDo : 바닥까지 VK_Down 처리 }; 80 : end; 81 : 82 : Self.Draw; 83 : end; 84 : 85 : end.
11 2 단계 Logic 설계 기능분석 [ 그림 3] Logic Interface Class Diagram 우선 Logic을구성하는각클래스의역할분담에대해서설명하도록하겠다. TGameTimer 는주기적으로이벤트를발생하여테트리스의블록들이바닥으로떨어지게하는역할을담당한다. TBlockCell은테트리스의블록이쌓여있는정보를간직하기위해서작성되었다. ( 복수형태인 TBlockCells라고이름을지어야할것을나중에발견했다. 일단넘어가자.)
12 TBlockShape 는현재떨어지고있는블록들의묶음에대한정보를관리한다. [ 화면 1] PDA 용으로작성된프로그램의실행화면 [ 화면 1] 은이강좌를진행하기위해만들어진데모프로그램의실행화면이다. [ 화면 1] 에서보듯이현재떨어지고있는블록모양 (TBlcokShape) 은총 4개의단위블록으로구성되어있다. 이것을표현하기위해서 TShapeBlock이라는클래스를생성하였다. 또한바닥에이미쌓여있는블록은 TBlockCell 클래스가그정보를관리하게된다. TGameTimer의기능목록 기능 - 없음 이벤트 - on_timerfired TBlockShape의기능목록 기능 - CreateNext - Draw - Process_KeyDown
13 이벤트 - 없음 TBlockCell의기능목록 기능 - Clear - Draw - BlockLanding - Checkcollision 이벤트 - 없음
14 동적분석 TLI TGameTimer TBlockShape TBlockCell StartGame Clear Enabled:= True TBlockCell.CheckCollision while Enabled = True False? on_tick VK_Down on_timerfired Yes do_move TBlockShape.IsEmpty? No No Yes True? Yes BlockLanding TBlockShape.CreateNext TBlockCell.CheckCollision 게임종료? No, VK_Down VK_Down Yes VK_Down? Process_KeyDown Process_KeyDown on_gameend Yes Draw Draw Draw [ 그림 4] Job Flow [ 그림 4] 에서는동적분석을통해서 Logic 부분의전반적인흐름을표현하고있다. 여기서는기능분석에서발견하지못했던 do_move 메소드가필요하다는것을발견하였다. 이제기능분석을통해작성한클래스다이어그램을수정하여야한다. 이것은소스상에서만반영하도록하겠다. 현재필자가사용하고있는 BDS 2006에서는소스를변경하면클래스다이어그램이자동으로변경되기때문에변경작업에의한문서작성에대해서는스트레스받을필요가없다. 또한, do_move 는메쏘드이름에서알수있듯이 Private 메쏘드이다. 따라서, 기능분석동안에찾아내기는쉽지않다.
15 [ 소스 3] Logic_Interface Unit 의수정 1 : unit Logic_Interface; 2 : 3 : interface 4 : 5 : uses 6 : BlockShape, BlockCell, GameTimer, Windows, Classes, SysUtils; 7 : 8 : type 9 : TLI = class 10 : private 11 : function GetGameStarted: Boolean; 12 : protected 13 : procedure on_gameend; 14 : procedure on_tick; 15 : public 16 : GameTimer : TGameTimer; 17 : BlockCell : TBlockCell; 18 : BlockShape : TBlockShape; 19 : constructor Create; 20 : destructor Destroy; override; 21 : class function GetObject:TLI; 22 : procedure StartGame; 23 : procedure Draw; 24 : procedure Process_KeyDown(Key:Word); 25 : published 26 : property GameStarted : Boolean read GetGameStarted; 27 : end; 28 : 29 : implementation 30 : 31 : uses 32 : UI_Interface; 33 :
16 34 : var 35 : MyObject : TLI = Nil; 36 : 37 : { TLI } 38 : 39 : function TLI.GetGameStarted: Boolean; 40 : begin 41 : Result:= GameTimer.Enabled; 42 : end; 43 : 44 : class function TLI.GetObject: TLI; 45 : begin 46 : if MyObject = Nil then MyObject:= TLI.Create; 47 : Result:= MyObject; 48 : end; 49 : 50 : procedure TLI.StartGame; 51 : begin 52 : GameTimer.Enabled:= True; 53 : end; 54 : 55 : procedure TLI.on_GameEnd; 56 : begin 57 : GameTimer.Enabled:= False; 58 : TUI.GetObject.GameEnd; 59 : end; 60 : 61 : procedure TLI.on_Tick; 62 : begin 63 : if BlockShape.IsEmpty = True then BlockShape.CreateNext; 64 : Self.Process_KeyDown(VK_Down); 65 : end; 66 : 67 : constructor TLI.Create; 68 : begin 69 : inherited;
17 70 : 71 : GameTimer:= TGameTimer.Create; 72 : BlockCell:= TBlockCell.Create; 73 : BlockShape:= TBlockShape.Create; 74 : end; 75 : 76 : destructor TLI.Destroy; 77 : begin 78 : GameTimer.Free; 79 : BlockCell.Free; 80 : BlockShape.Free; 81 : 82 : inherited; 83 : end; 84 : 85 : procedure TLI.Draw; 86 : begin 87 : TUI.GetObject._fmMain.InitBoardCanvas; 88 : BlockCell.Draw; 89 : BlockShape.Draw; 90 : end; 91 : 92 : procedure TLI.Process_KeyDown(Key:Word); 93 : begin 94 : BlockShape.Process_KeyDown(Key); 95 : Self.Draw; 96 : end; 97 : 98 : end.
18 [ 소스 4] GameTimer Unit 의소스 1 : unit GameTimer; 2 : 3 : interface 4 : 5 : uses 6 : Classes, SysUtils, ExtCtrls; 7 : 8 : type 9 : TGameTimer = class 10 : private 11 : FTimer : TTimer; 12 : function GetEnabled: Boolean; 13 : procedure SetEnabled(const Value: Boolean); 14 : protected 15 : procedure on_timerfired(sender:tobject); 16 : public 17 : constructor Create; 18 : Destructor Destroy; override; 19 : published 20 : property Enabled : Boolean read GetEnabled write SetEnabled; 21 : end; 22 : 23 : implementation 24 : 25 : uses 26 : Logic_Interface; 27 : 28 : type 29 : TFLI = class(tli) 30 : end; 31 : 32 : { TGameTimer } 33 :
19 34 : constructor TGameTimer.Create; 35 : begin 36 : inherited; 37 : 38 : FTimer:= TTimer.Create(Nil); 39 : FTimer.Interval:= 50; 40 : FTimer.OnTimer:= Self.on_TimerFired; 41 : FTimer.Enabled:= False; 42 : end; 43 : 44 : destructor TGameTimer.Destroy; 45 : begin 46 : FTimer.Free; 47 : 48 : inherited; 49 : end; 50 : 51 : procedure TGameTimer.on_TimerFired(Sender: TObject); 52 : begin 53 : TFLI(TFLI.GetObject).on_Tick; 54 : end; 55 : 56 : function TGameTimer.GetEnabled: Boolean; 57 : begin 58 : Result:= FTimer.Enabled; 59 : end; 60 : 61 : procedure TGameTimer.SetEnabled(const Value: Boolean); 62 : begin 63 : FTimer.Enabled:= Value; 64 : end; 65 : 66 : end.
20 [ 소스 5] BlockShape Unit 의소스 1 : unit BlockShape; 2 : 3 : interface 4 : 5 : uses 6 : Classes, SysUtils, Windows; 7 : 8 : type 9 : TBlockShape = class 10 : public 11 : procedure Draw; 12 : procedure Process_KeyDown(Key:Word); 13 : procedure CreateNext; 14 : private 15 : function GetIsEmpty: Boolean; 16 : function do_movedown:boolean; 17 : procedure do_drop; 18 : procedure do_move(key:word); 19 : published 20 : property IsEmpty : Boolean read GetIsEmpty; 21 : end; 22 : 23 : implementation 24 : 25 : uses 26 : Logic_Interface; 27 : 28 : procedure TBlockShape.Draw; 29 : begin 30 : {Todo : } 31 : end; 32 : 33 : function TBlockShape.GetIsEmpty: Boolean;
21 34 : begin 35 : {Todo : } 36 : end; 37 : 38 : procedure TBlockShape.Process_KeyDown(Key:Word); 39 : begin 40 : if Key = VK_Down then do_movedown 41 : else do_move(key); 42 : end; 43 : 44 : function TBlockShape.do_MoveDown:Boolean; 45 : begin 46 : Result:= not TLI.GetObject.BlockCell.CheckCollision(VK_Down); 47 : 48 : if Result = True then 49 : {Todo : } 50 : else 51 : TLI.GetObject.BlockCell.BlockLanding; 52 : end; 53 : 54 : procedure TBlockShape.do_Drop; 55 : var 56 : bmoved : Boolean; 57 : begin 58 : Repeat 59 : bmoved:= do_movedown; 60 : until bmoved = False; 61 : end; 62 : 63 : procedure TBlockShape.do_Move(Key:Word); 64 : begin 65 : if TLI.GetObject.BlockCell.CheckCollision(Key) = True then Exit; 66 : 67 : case Key of 68 : VK_Left : {ToDo : }; 69 : VK_Right : {ToDo : };
22 70 : VK_Up : {ToDo : }; 71 : VK_Space : do_drop; 72 : end; 73 : end; 74 : 75 : procedure TBlockShape.CreateNext; 76 : begin 77 : {Todo : } 78 : end; 79 : 80 : end. [ 그림 4] 의 Job Flow와는달리좀더로직을쉽게접근할수있도록 Private 메쏘드몇개가추가되었다. Flow 자체는동일하다.
23 [ 소스 6] TBlockCell Unit 의소스 1 : unit BlockCell; 2 : 3 : interface 4 : 5 : type 6 : TBlockCell = class 7 : public 8 : procedure Draw; 9 : procedure Clear; 10 : procedure BlockLanding; 11 : function CheckCollision(Key:Word):Boolean; 12 : end; 13 : 14 : implementation 15 : 16 : uses 17 : Logic_Interface; 18 : 19 : procedure TBlockCell.Draw; 20 : begin 21 : {Todo : } 22 : end; 23 : 24 : procedure TBlockCell.Clear; 25 : begin 26 : {Todo : } 27 : end; 28 : 29 : procedure TBlockCell.BlockLanding; 30 : begin 31 : {Todo : } 32 : 33 : {Todo : 종료조건처리 }
24 34 : end; 35 : 36 : function TBlockCell.CheckCollision(Key:Word):Boolean; 37 : begin 38 : {Todo : } 39 : end; 40 : 41 : end.
25 3 단계 User Interface 설계 기능분석 [ 그림 5] User Interface 클래스다이어그램 TUI 클래스는변경된사항이없으니, _fmmain 클래스의기능목록만살펴보자. 기능 - GameEnd - InitBoardCanvas : 실제로는구현과정중에추가된메쏘드이다. 이벤트 - on_keydown - on_start _fmmain은메인폼에대한부모클래스이다. TUI는직접메인폼에대하여의존하지않도록중간에 _fmmain 클래스를생성하고, 메인폼은이것을상속받아서사용하도록한다. 상속받아서처리하는이유는 TUI 자체의논리계층과구현계층을분리하여변경사항이발생하더라도변경사항에대한쇼크를줄이기위해서이다.
26 예를들어 TLI에서게임이종료되었음을알리면 TUI.GameEnd가호출된다. 이때 TUI는 _fmmain.gameend라는 abstract 메쏘드를실행하게된다. 추후메인폼이 _fmmain에서상속을받아서해당메쏘드를 override 하여게임종료처리를완료하게되는것이다. 메인폼이게임종료처리를어떠한방식으로진행하던지이제 TUI는알필요가없는것이다. 그것은 TUI가메인폼이아닌 _fmmain에만의존관계를가지고있기때문이다.
27 동적분석 TUI.GetObject _fmmain on_start on_start on_keydown on_keydown GameEnd GameEnd [ 그림 6] Job Flow 현재의설계는 _fmmain에서 on_start 등의이벤트가발생하면 TUI의같은 on_start가호출되어중복된메쏘드가나오게된다. 이것은 Demeter 법칙을준수하기위한것이다. TLI 가 TUI이너무깊숙한곳까지알게되면소스코드의결합도가높아지기때문이다. 하지만, 필자는 TUI가너무많은메쏘드를처리하게되는시점에서모든메쏘드는 TUI 하위클래스에게위임한다. 하나의클래스에너무많은메쏘드를포함시키면가독성이떨어지기때문이다. 일반적으로는다른클래스의내장을후벼파는것은소스의유연성을떨어트리게된다. 따라서, 우선적으로 Demeter 법칙을준수하다가어느일정수준이넘어서가독성이문제가된다고판단이될때, 필자는메쏘드를하위클래스에서만정의하는방식을채택했다. ( 객체지향적 ) 설계에서는때에따라서그적용방법을달리해야할때가발생한다. 반드시 라는법칙은없다. ( 어쩌면그것이다행일지도모르겠다. 만약 반드시 라는법칙이통한다면사람이아닌기계가대신설계를도맡아할지도모르겠다.)
28 [ 소스 7] UI_Interface Unit 의수정 1 : unit UI_Interface; 2 : 3 : interface 4 : 5 : uses 6 : Classes, SysUtils, _frmmain; 7 : 8 : type 9 : TUI = class 10 : protected 11 : procedure on_keydown(key:word); 12 : procedure on_start; 13 : public 14 : _fmmain : T_fmMain; 15 : class function GetObject:TUI; 16 : procedure GameEnd; 17 : end; 18 : 19 : implementation 20 : 21 : uses 22 : Logic_Interface; 23 : 24 : var 25 : MyObject : TUI = Nil; 26 : 27 : { TUI } 28 : 29 : class function TUI.GetObject: TUI; 30 : begin 31 : if MyObject = Nil then MyObject:= TUI.Create; 32 : Result:= MyObject; 33 : end;
29 34 : 35 : procedure TUI.on_Start; 36 : begin 37 : TLI.GetObject.StartGame; 38 : end; 39 : 40 : procedure TUI.on_KeyDown(Key:Word); 41 : begin 42 : if TLI.GetObject.GameStarted = True then TLI.GetObject.Process_KeyDown(Key); 43 : end; 44 : 45 : procedure TUI.GameEnd; 46 : begin 47 : Self._fmMain.GameEnd; 48 : end; 49 : 50 : end.
30 [ 소스 8] _fmmain Unit 의소스 1 : unit _frmmain; 2 : 3 : interface 4 : uses 5 : Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms; 6 : 7 : type 8 : T_fmMain = class(tform) 9 : private 10 : protected 11 : function GetBoardCanvas: TCanvas; virtual; abstract; 12 : procedure on_keydown(key:word); 13 : procedure on_start; 14 : public 15 : constructor Create(AOwner:TComponent); override; 16 : procedure InitBoardCanvas; 17 : procedure GameEnd; virtual; abstract; 18 : published 19 : property BoardCanvas : TCanvas read GetBoardCanvas; 20 : end; 21 : 22 : implementation 23 : 24 : uses 25 : UI_Interface; 26 : 27 : type 28 : TFUI = class(tui) 29 : end; 30 : 31 : { T_fmMain } 32 : 33 : constructor T_fmMain.Create(AOwner: TComponent);
31 34 : begin 35 : inherited; 36 : 37 : TUI.GetObject._fmMain:= Self; 38 : end; 39 : 40 : procedure T_fmMain.on_KeyDown(Key: Word); 41 : begin 42 : TFUI(TUI.GetObject).on_KeyDown(Key); 43 : end; 44 : 45 : procedure T_fmMain.on_Start; 46 : begin 47 : TFUI(TUI.GetObject).on_Start; 48 : end; 49 : 50 : procedure T_fmMain.InitBoardCanvas; 51 : var 52 : Loop: Integer; 53 : begin 54 : BoardCanvas.Brush.Color:= $004F4F4F; 55 : BoardCanvas.FillRect(Rect(0, 0, 120, 240)); 56 : 57 : // 배경에수직선그리기 58 : for Loop := 1 to 10 do begin 59 : BoardCanvas.Pen.Color:= clwhite; 60 : BoardCanvas.MoveTo((Loop-1)*12, 0); 61 : BoardCanvas.LineTo((Loop-1)*12, 240); 62 : end; 63 : 64 : end; 65 : 66 : end.
32 중간점검필자는하나의프로젝트 ( 델파이에서는 *.dpr) 파일에관련된범위를프로세스모듈이라고부른다. 그리고, 여기까지가프로세스모듈에대한논리계층의설계과정이다. 이제부터는구현계층에대해서설명하고자한다. 만약프로세스모듈에대한논리계층이변경되어야한다면, 그것은업그레이드가아닌버전업의시점이라고필자는생각한다. 구현계층이이루어져있는상황에서논리계층을변경하는것은건물을거의지어놓은상태에서철골구조를새로하려는것과같다. ( 실제프로젝트에서는그것보다더위험하다.)
33 4 단계 Logic 에대한구현계층설계 필자는구현계층에대한분석과설계과정은다소복잡한부분을제외하고는대부분생략하는편이다. User Interface 준비 사용자인터페이스는개발과정에서최대한뒤로미루는것이좋다. 모든것이그러하듯이우선골격을먼저구성하고살을붙여가는것이실수와비용을줄이는지름길이다. 소프트웨어개발에서는 Logic이바로그골격에해당하므로, 이에대한설계와테스트가완료되고난뒤에사용자인터페이스를완성해나가는것이유리하다. 하지만, 테스트를위해서최소한의사용자인터페이스는미리분석과설계를거쳐서작성하는편이좋다. 필자는지금이바로그시점이라고생각한다. [ 화면 2] 메인폼디자인 테스트를위해서 [ 화면 2] 처럼콤포넌트를내려놓고프로퍼티를아래와같이수정한다. TPanel의경우에는 Canvas 속성이 Protected로되어있어접근이불가능하여약간의트릭을이용하였다. 이점은소스를참고하기바란다.
34 1 : object fmmain: TfmMain 2 : Left = 0 3 : Top = 0 4 : Caption = 테트리스 5 : ClientHeight = : ClientWidth = : OnKeyDown = FormKeyDown 8 : object plgameboard: TPanel 9 : Left = 4 10 : Top = 4 11 : Width = : Height = : BevelOuter = bvnone 14 : Color = : end 16 : object MainMenu: TMainMenu 17 : object mistart: TMenuItem 18 : Caption = 'Start' 19 : OnClick = mistartclick 20 : end 21 : end 22 : end
35 [ 소스 9] frmmain Unit 의소스 1 : unit frmmain; 2 : 3 : interface 4 : 5 : uses 6 : Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 7 : Dialogs, Menus, _frmmain, ExtCtrls, CanvasPanel; 8 : 9 : type 10 : TfmMain = class(t_fmmain) 11 : MainMenu: TMainMenu; 12 : mistart: TMenuItem; 13 : plgameboard: TPanel; 14 : procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); 15 : procedure mistartclick(sender: TObject); 16 : private 17 : { Private declarations } 18 : function GetBoardCanvas: TCanvas; override; 19 : public 20 : { Public declarations } 21 : procedure GameEnd; override; 22 : end; 23 : 24 : var 25 : fmmain: TfmMain; 26 : 27 : implementation 28 : 29 : {$R *.dfm} 30 : 31 : procedure TfmMain.FormKeyDown(Sender: TObject; var Key: Word; 32 : Shift: TShiftState); 33 : begin
36 34 : Self.on_KeyDown(Key); 35 : end; 36 : 37 : procedure TfmMain.GameEnd; 38 : begin 39 : ShowMessage('Game Over!!!'); 40 : end; 41 : 42 : function TfmMain.GetBoardCanvas: TCanvas; 43 : begin 44 : Result:= plgameboard.canvas; 45 : end; 46 : 47 : procedure TfmMain.miStartClick(Sender: TObject); 48 : begin 49 : Self.on_Start; 50 : end; 51 : 52 : end.
37 테스트시나리오작성테스트를위해서사용자가접근할수있는모든가능성에대한시나리오를찾아내고이를하나씩수행하여본다. 본강좌에서는사용자가게임을시작하기위해서 Start 메뉴를실행하는초기단계부터코딩과테스트를병행하면서설명을하도록하겠다. 시나리오 Step 1 사용자가 Start 메뉴를실행하였음사용자가 Start 메뉴를실행하면우선 [ 소스 9] 의 49: 라인이실행된다. 이것은 TLI.GetObject.GameTimer.Enabled:= True 를실행하게되고, 결과적으로 TLI.on_Tick 이벤트가주기적으로실행된다. 그리고해당이벤트가실행될때마다, TLI.Draw 메쏘드가호출된다. 아래는해당메쏘드의변경내용이다. 1 : procedure TLI.Draw; 2 : begin 3 : TUI.GetObject._fmMain.InitBoardCanvas; 4 : BlockCell.Draw; 5 : BlockShape.Draw; 6 : end; 3: 라인에서게임보드를초기화하는소스는이미작성되어있으니, 4: 라인의 BLockCel.Draw에대해서코딩을하겠다.
38 TBlock 클래스추가 [ 화면 1] 에서보았듯이테트리스에는최소단위의블록을관리하는무엇인가가필요하다. 필자는 TBlock 클래스를추가하여이를해결하도록할것이다. [ 그림 7] TBlockCell 의클래스다이어그램 [ 그림 7] 에서보듯이 TBlockCell은 TBlock 클래스를배열로관리하고있다. 배열의사이즈는 10X20으로현재작성하려고하는테트리스의셀크기이다. TBlock의기능목록은아래와같다. 기능 - Draw : 자기자신을그린다. - DropDown : 바닥으로한칸씩떨어진다. 이벤트 - 없음 TBlock 은단위사이즈를나타내기위해 Read-Only 속성 Width 와 Height 를가지고있다.
39 [ 소스 10] Block Unit 의소스 1 : unit Block; 2 : 3 : interface 4 : 5 : uses 6 : Classes, SysUtils, Graphics; 7 : 8 : type 9 : TBlock = class 10 : private 11 : function GetHeight: Integer; 12 : function GetWidth: Integer; 13 : public 14 : X, Y : Integer; 15 : procedure Draw; 16 : procedure DropDown; 17 : procedure MoveLeft; 18 : procedure MoveRight; 19 : published 20 : property Width : Integer read GetWidth; 21 : property Height : Integer read GetHeight; 22 : end; 23 : 24 : implementation 25 : 26 : uses 27 : UI_Interface; 28 : 29 : { TBlock } 30 : 31 : procedure TBlock.Draw; 32 : begin 33 : TUI.GetObject._fmMain.BoardCanvas.Brush.Color:= cllime;
40 34 : TUI.GetObject._fmMain.BoardCanvas.FillRect(Rect(X*Width, Y*Height, (X+1)*Width, (Y+1) 35 : *Height)); 36 : TUI.GetObject._fmMain.BoardCanvas.Pen.Color:= clred; 37 : TUI.GetObject._fmMain.BoardCanvas.Rectangle(Rect(X*Width, Y*Height, (X+1)*Width, (Y+1) 38 : *Height)); 39 : end; 40 : 41 : procedure TBlock.DropDown; 42 : begin 43 : Y:= Y + 1; 44 : end; 45 : 46 : function TBlock.GetHeight: Integer; 47 : begin 48 : Result:= 12; 49 : end; 50 : 51 : function TBlock.GetWidth: Integer; 52 : begin 53 : Result:= 12; 54 : end; 55 : 56 : procedure TBlock.MoveLeft; 57 : begin 58 : X:= X -1; 59 : end; 60 : 61 : procedure TBlock.MoveRight; 62 : begin 63 : X:= X + 1; 64 : end; 65 : end. 위의소스는메인폼에버턴을올려두고아래와같은소스로제대로블록이그려지는지테스트를진행해보았다. 강좌의특성으로인해자잘한과정을생략하고넘어갈수밖에없
41 음이아쉽다. 1 : implementation 2 : 3 : uses 4 : Block; 5 : 6 : {$R *.dfm} 7 : 8 : procedure TfmMain.Button1Click(Sender: TObject); 9 : var 10 : Block : TBlock; 11 : begin 12 : Block:= TBlock.Create; 13 : Block.Draw; 14 : end;
42 [ 소스 11] BlockCell Unit 의수정 1 : unit BlockCell; 2 : 3 : interface 4 : 5 : uses 6 : Classes, SysUtils, Graphics, Block; 7 : 8 : type 9 : TBlockCell = class 10 : private 11 : FCells : Array [0..9, 0..19] of TBlock; 12 : public 13 : constructor Create; 14 : procedure Draw; 15 : procedure Clear; 16 : procedure BlockLanding; 17 : function CheckCollision(Key:Word):Boolean; 18 : end; 19 : 20 : implementation 21 : 22 : uses 23 : Logic_Interface; 24 : 25 : procedure TBlockCell.Draw; 26 : var 27 : LoopX: Integer; 28 : LoopY: Integer; 29 : begin 30 : for LoopX := 0 to 10-1 do 31 : for LoopY := 0 to 20-1 do 32 : if FCells[LoopX, LoopY] <> Nil then FCells[LoopX, LoopY].Draw; 33 : end;
43 34 : 35 : procedure TBlockCell.Clear; 36 : var 37 : LoopX: Integer; 38 : LoopY: Integer; 39 : begin 40 : for LoopX := 0 to 10-1 do 41 : for LoopY := 0 to 20-1 do 42 : if FCells[LoopX, LoopY] <> Nil then begin 43 : FCells[LoopX, LoopY].Free; 44 : FCells[LoopX, LoopY]:= Nil; 45 : end; 46 : end; 47 : 48 : constructor TBlockCell.Create; 49 : var 50 : LoopX: Integer; 51 : LoopY: Integer; 52 : begin 53 : inherited; 54 : 55 : for LoopX := 0 to 10-1 do 56 : for LoopY := 0 to 20-1 do 57 : FCells[LoopX, LoopY]:= Nil; 58 : end; 59 : 60 : procedure TBlockCell.BlockLanding; 61 : begin 62 : {Todo : } 63 : 64 : {Todo : 종료조건처리 } 65 : if false then TLI.GetObject.GameStarted:= False; 66 : end; 67 : 68 : function TBlockCell.CheckCollision(Key:Word):Boolean; 69 : begin
44 70 : {Todo : } 71 : end; 72 : 73 : end.
45 [ 소스 12] BlockShape Unit 의수정 1 : unit BlockShape; 2 : 3 : interface 4 : 5 : uses 6 : Classes, SysUtils, Windows, Block; 7 : 8 : type 9 : TBlockShape = class 10 : private 11 : FBlockList : TList; 12 : function GetIsEmpty: Boolean; 13 : procedure do_drop; 14 : procedure do_move(key:word); 15 : function do_movedown:boolean; 16 : procedure do_moveleft; 17 : procedure do_moveright; 18 : procedure do_createblockshape1; 19 : procedure do_createblockshape2; 20 : procedure do_createblockshape3; 21 : procedure do_createblockshape4; 22 : procedure do_createblockshape5; 23 : procedure do_createblockshape6; 24 : procedure do_createblockshape7; 25 : public 26 : constructor Create; 27 : destructor Destroy; override; 28 : procedure Draw; 29 : procedure Process_KeyDown(Key:Word); 30 : procedure CreateNext; 31 : published 32 : property IsEmpty : Boolean read GetIsEmpty; 33 : end;
46 34 : 35 : implementation 36 : 37 : uses 38 : Logic_Interface; 39 : 40 : procedure TBlockShape.Draw; 41 : var 42 : Loop: Integer; 43 : begin 44 : for Loop := 0 to FBlockList.Count - 1 do 45 : TBlock(FBlockList.Items[Loop]).Draw; 46 : end; 47 : 48 : function TBlockShape.GetIsEmpty: Boolean; 49 : begin 50 : Result:= FBlockList.Count = 0; 51 : end; 52 : 53 : procedure TBlockShape.Process_KeyDown(Key:Word); 54 : begin 55 : if Key = VK_Down then do_movedown 56 : else do_move(key); 57 : end; 58 : 59 : function TBlockShape.do_MoveDown:Boolean; 60 : var 61 : Loop: Integer; 62 : begin 63 : Result:= not TLI.GetObject.BlockCell.CheckCollision(VK_Down); 64 : 65 : if Result = True then begin 66 : for Loop := 0 to FBlockList.Count - 1 do 67 : TBlock(FBlockList.Items[Loop]).DropDown; 68 : end else 69 : TLI.GetObject.BlockCell.BlockLanding;
47 70 : end; 71 : 72 : procedure TBlockShape.do_MoveLeft; 73 : var 74 : Loop: Integer; 75 : begin 76 : for Loop := 0 to FBlockList.Count - 1 do 77 : TBlock(FBlockList.Items[Loop]).MoveLeft; 78 : end; 79 : 80 : procedure TBlockShape.do_MoveRight; 81 : var 82 : Loop: Integer; 83 : begin 84 : for Loop := 0 to FBlockList.Count - 1 do 85 : TBlock(FBlockList.Items[Loop]).MoveRight; 86 : end; 87 : 88 : destructor TBlockShape.Destroy; 89 : begin 90 : FBlockList.Free; 91 : 92 : inherited; 93 : end; 94 : 95 : procedure TBlockShape.do_CreateBlockShape1; 96 : var 97 : Block : TBlock; 98 : begin 99 : Block:= TBlock.Create; 100 : Block.X:= 4; 101 : Block.Y:= -2; 102 : FBlockList.Add(Block); 103 : 104 : Block:= TBlock.Create; 105 : Block.X:= 5;
48 106 : Block.Y:= -2; 107 : FBlockList.Add(Block); 108 : 109 : Block:= TBlock.Create; 110 : Block.X:= 4; 111 : Block.Y:= -1; 112 : FBlockList.Add(Block); 113 : 114 : Block:= TBlock.Create; 115 : Block.X:= 5; 116 : Block.Y:= -1; 117 : FBlockList.Add(Block); 118 : end; 119 : 120 : procedure TBlockShape.do_CreateBlockShape2; 121 : var 122 : Block : TBlock; 123 : begin 124 : Block:= TBlock.Create; 125 : Block.X:= 4; 126 : Block.Y:= -3; 127 : FBlockList.Add(Block); 128 : 129 : Block:= TBlock.Create; 130 : Block.X:= 4; 131 : Block.Y:= -2; 132 : FBlockList.Add(Block); 133 : 134 : Block:= TBlock.Create; 135 : Block.X:= 5; 136 : Block.Y:= -2; 137 : FBlockList.Add(Block); 138 : 139 : Block:= TBlock.Create; 140 : Block.X:= 5; 141 : Block.Y:= -1;
49 142 : FBlockList.Add(Block); 143 : end; 144 : 145 : procedure TBlockShape.do_CreateBlockShape3; 146 : var 147 : Block : TBlock; 148 : begin 149 : Block:= TBlock.Create; 150 : Block.X:= 5; 151 : Block.Y:= -3; 152 : FBlockList.Add(Block); 153 : 154 : Block:= TBlock.Create; 155 : Block.X:= 4; 156 : Block.Y:= -2; 157 : FBlockList.Add(Block); 158 : 159 : Block:= TBlock.Create; 160 : Block.X:= 5; 161 : Block.Y:= -2; 162 : FBlockList.Add(Block); 163 : 164 : Block:= TBlock.Create; 165 : Block.X:= 4; 166 : Block.Y:= -1; 167 : FBlockList.Add(Block); 168 : end; 169 : 170 : procedure TBlockShape.do_CreateBlockShape4; 171 : var 172 : Block : TBlock; 173 : begin 174 : Block:= TBlock.Create; 175 : Block.X:= 4; 176 : Block.Y:= -3; 177 : FBlockList.Add(Block);
50 178 : 179 : Block:= TBlock.Create; 180 : Block.X:= 4; 181 : Block.Y:= -2; 182 : FBlockList.Add(Block); 183 : 184 : Block:= TBlock.Create; 185 : Block.X:= 5; 186 : Block.Y:= -2; 187 : FBlockList.Add(Block); 188 : 189 : Block:= TBlock.Create; 190 : Block.X:= 4; 191 : Block.Y:= -1; 192 : FBlockList.Add(Block); 193 : end; 194 : 195 : procedure TBlockShape.do_CreateBlockShape5; 196 : var 197 : Block : TBlock; 198 : begin 199 : Block:= TBlock.Create; 200 : Block.X:= 4; 201 : Block.Y:= -4; 202 : FBlockList.Add(Block); 203 : 204 : Block:= TBlock.Create; 205 : Block.X:= 4; 206 : Block.Y:= -3; 207 : FBlockList.Add(Block); 208 : 209 : Block:= TBlock.Create; 210 : Block.X:= 4; 211 : Block.Y:= -2; 212 : FBlockList.Add(Block); 213 :
51 214 : Block:= TBlock.Create; 215 : Block.X:= 4; 216 : Block.Y:= -1; 217 : FBlockList.Add(Block); 218 : end; 219 : 220 : procedure TBlockShape.do_CreateBlockShape6; 221 : var 222 : Block : TBlock; 223 : begin 224 : Block:= TBlock.Create; 225 : Block.X:= 4; 226 : Block.Y:= -3; 227 : FBlockList.Add(Block); 228 : 229 : Block:= TBlock.Create; 230 : Block.X:= 4; 231 : Block.Y:= -2; 232 : FBlockList.Add(Block); 233 : 234 : Block:= TBlock.Create; 235 : Block.X:= 4; 236 : Block.Y:= -1; 237 : FBlockList.Add(Block); 238 : 239 : Block:= TBlock.Create; 240 : Block.X:= 5; 241 : Block.Y:= -1; 242 : FBlockList.Add(Block); 243 : end; 244 : 245 : procedure TBlockShape.do_CreateBlockShape7; 246 : var 247 : Block : TBlock; 248 : begin 249 : Block:= TBlock.Create;
52 250 : Block.X:= 5; 251 : Block.Y:= -3; 252 : FBlockList.Add(Block); 253 : 254 : Block:= TBlock.Create; 255 : Block.X:= 5; 256 : Block.Y:= -2; 257 : FBlockList.Add(Block); 258 : 259 : Block:= TBlock.Create; 260 : Block.X:= 5; 261 : Block.Y:= -1; 262 : FBlockList.Add(Block); 263 : 264 : Block:= TBlock.Create; 265 : Block.X:= 4; 266 : Block.Y:= -1; 267 : FBlockList.Add(Block); 268 : end; 269 : 270 : procedure TBlockShape.do_Drop; 271 : var 272 : bmoved : Boolean; 273 : begin 274 : Repeat 275 : bmoved:= do_movedown; 276 : until bmoved = False; 277 : end; 278 : 279 : procedure TBlockShape.do_Move(Key:Word); 280 : begin 281 : if TLI.GetObject.BlockCell.CheckCollision(Key) = True then Exit; 282 : 283 : case Key of 284 : VK_Left : do_moveleft; 285 : VK_Right : do_moveright;
53 286 : VK_Up : {ToDo : }; 287 : VK_Space : do_drop; 288 : end; 289 : end; 290 : 291 : constructor TBlockShape.Create; 292 : begin 293 : inherited; 294 : 295 : Randomize; 296 : 297 : FBlockList:= TList.Create; 298 : end; 299 : 300 : procedure TBlockShape.CreateNext; 301 : begin 302 : FBlockList.Clear; 303 : 304 : case Round(Random(7)) of 305 : 0 : do_createblockshape1; 306 : 1 : do_createblockshape2; 307 : 2 : do_createblockshape3; 308 : 3 : do_createblockshape4; 309 : 4 : do_createblockshape5; 310 : 5 : do_createblockshape6; 311 : 6 : do_createblockshape7; 312 : end; 313 : end; 314 : 315 : end.
54 블록쌓기이번에는블록이바닥에떨어지면쌓이도록소스를변경하도록하겠다. 바닥이나이미쌓여있는블록에닿으면멈추기위해서는우선충돌테스트를위한메쏘드를완성해야한다. 해당메쏘드는블록을현재진행방향으로한칸움직여봐서바닥이나벽또는다른블록에부디치는지를검사하여결과값을알려주게된다. 지금은밑으로떨어지는방향이기때문에양쪽벽에부딪치는것은일단무시하도록하겠다. 우선현재의 BlockShape를진행방향으로한칸움직이고이것이충돌하는지를검사하게되면화면에검사하는과정이표시될뿐아니라, 현재의위치정보를모두저장하고다시복원하는등의문제가복잡해질수있다. 따라서, 필자는현재의 BlockShape에대한클론을만들고클론을통해서충돌테스트를대신하도록진행하기로한다. 클론을만들기위해서 TBlockShape 클래스에 private 메소드를하나더추가하도록하겠다. 그리고, 클론의경우에는충돌테스트없이이동하여야하기때문에자신이클론인지의여부를확인하는플래그 FIsClone을추가하도록하겠다. 상속을통해서삭제할수도있으나, 우선은플래그변수를이용하도록하겠다. 1 : type 2 : TBlockShape = class 3 : private 4 : FIsClone : Boolean; 1 : constructor TBlockShape.Create; 2 : begin 3 : inherited; 4 : 5 : FIsClone:= False; 1 : function TBlockShape.Clone: TBlockShape; 2 : var 3 : Loop: Integer; 4 : Block : TBlock; 5 : begin 6 : Result:= TBlockShape.Create;
55 7 : Result.FIsClone:= True; 8 : for Loop := 0 to FBlockList.Count - 1 do begin 9 : Block:= TBlock.Create; 10 : Block.X:= TBlock(FBlockList.Items[Loop]).X; 11 : Block.Y:= TBlock(FBlockList.Items[Loop]).Y; 12 : Result.FBlockList.Add(Block); 13 : end; 14 : end; 아래의소스에서는 BlockShape를밑으로떨어트리는메소드를변경한내용이다. BlockShape의클론을전달하기위해서 CheckCollision 메쏘드에파라메터를추가하였다. 또한, do_checkcollision 메쏘드를추가하여클론을통한충돌테스트루틴을이용하는것을간략화하였다. 1 : function TBlockShape.do_CheckCollision(Key:Word):Boolean; 2 : var 3 : CloneShape : TBlockShape; 4 : begin 5 : if FIsClone = False then begin 6 : CloneShape:= Self.Clone; 7 : try 8 : CloneShape.Process_KeyDown(Key); 9 : Result:= TLI.GetObject.BlockCell.CheckCollision(CloneShape.FBlockList, Key); 10 : finally 11 : CloneShape.Free; 12 : end; 13 : end else 14 : Result:= False; 15 : end; 16 : 17 : function TBlockShape.do_MoveDown:Boolean; 18 : var 19 : Loop: Integer; 20 : begin 21 : Result:= not Self.do_CheckCollision(VK_Down);
56 22 : 23 : if Result = True then begin 24 : for Loop := 0 to FBlockList.Count - 1 do 25 : TBlock(FBlockList.Items[Loop]).DropDown; 26 : end else 27 : TLI.GetObject.BlockCell.BlockLanding; 28 : end; 또한, 내부에 TBlock으로생성된객체가미아가되면서메모리누수가발생할수가있기때문에, TBlockShape의소멸자에서 TBlock의객체들을메모리에서삭제하도록소스를추가하였다. 1 : destructor TBlockShape.Destroy; 2 : var 3 : Loop : Integer; 4 : begin 5 : for Loop := 0 to FBlockList.Count - 1 do 6 : TBlock(FBlockList.Items[Loop]).Free; 7 : 8 : FBlockList.Free; 9 : 10 : inherited; 11 : end; 1 : procedure TBlockShape.do_Move(Key:Word); 2 : begin 3 : if Self.do_CheckCollision(Key) = True then Exit; 다음으로는충돌여부를점검하는 TBlockCell.CheckCollision 메쏘드의소스를아래와같이작성한다. 이미놓여진블록과의충돌을검사하는 do_checkblocksincells 메쏘드가추가되었다. 1 : function TBlockCell.do_CheckBlocksInCells(List: TList): Boolean; 2 : var 3 : Loop: Integer; 4 : Block : TBlock;
57 5 : begin 6 : Result:= False; 7 : for Loop := 0 to List.Count - 1 do begin 8 : Block:= TBlock(List.Items[Loop]); 9 : if (Block.X in [0..9]) and (Block.Y in [0..19]) then 10 : if FCells[Block.X, Block.Y] <> Nil then begin 11 : Result:= True; 12 : Break; 13 : end; 14 : end; 15 : end; 16 : 17 : function TBlockCell.CheckCollision(List:TList; Key:Word):Boolean; 18 : var 19 : Loop: Integer; 20 : Block : TBlock; 21 : bcondition1, bcondition2, bcondition3 : Boolean; 22 : begin 23 : Result:= False; 24 : 25 : for Loop := 0 to List.Count - 1 do begin 26 : Block:= Pointer(List.Items[Loop]); 27 : 28 : bcondition1:= (Block.X < 0) or (Block.X > 9); 29 : bcondition2:= (Block.Y > 19); 30 : bcondition3:= do_checkblocksincells(list); 31 : if bcondition1 or bcondition2 or bcondition3 then begin 32 : Result:= True; 33 : Break; 34 : end; 35 : end; 36 : end; 이제는바닥에충돌된이후블록을쌓이도록하는 TBlockCell.BlockLanding 메쏘드를작성하도록하겠다.
58 1 : implementation 2 : 3 : uses 4 : Logic_Interface; 5 : 6 : type 7 : TFLI = class(tli) 8 : end; 45 : procedure TBlockCell.BlockLanding(List:TList); 46 : var 47 : Loop: Integer; 48 : Block : TBlock; 49 : bgameended : Boolean; 50 : begin 51 : bgameended:= False; 52 : for Loop := 0 to List.Count - 1 do begin 53 : Block:= Pointer(List.Items[Loop]); 54 : if (Block.X in [0..9]) and (Block.Y in [0..19]) then 55 : FCells[Block.X, Block.Y]:= Block 56 : else 57 : bgameended:= True; 58 : end; 59 : List.Clear; 60 : 61 : if bgameended = True then TFLI(TLI.GetObject).on_GameEnd; 62 : end;
59 BlockShape 의회전 [ 그림 8] 블록들을회전하고난뒤의좌표변환 위의그림을참고로해서각블록의좌표 (x,y) 를알고있을때, 회전후의좌표 (x,y ) 를구하는식은다음과같다. ( 아래식은필자가전철안에서노트를통해서구한것이므로최선의방법이라고할수없을지도모른다. 여러분들의보다기발한아이디어를기대하겠다.) x' = StartX + (EndY - Y) y = EndY + (X EndX) 여기서 (StartX, StartY) 는도형이차지하고있는최소한의사각형의좌측상단모서리의좌표이며, (EndX, EndY) 는해당사각형의우측하단모서리의좌표이다.
60 TRotateBlocks 클래스추가 [ 그림 9] 블록회전을위해서 TRotateBlocks 클래스를추가한다어이그램 아래소스는 BlockShape 유닛에서회전을위해변경된부분이다. 1 : procedure TBlockShape.do_Move(Key:Word); 2 : begin 3 : case Key of 4 : VK_Left : do_moveleft; 5 : VK_Right : do_moveright; 6 : VK_Down : do_movedown;
61 7 : VK_Up : TRotateBlocks.Rotate(FBlockList); 8 : VK_Space : do_drop; 9 : end; 10 : end;
62 [ 소스 13] RotateBlocks Unit 의소스 1 : unit RotateBlocks; 2 : 3 : interface 4 : 5 : uses 6 : Classes, SysUtils, Block, Dialogs; 7 : 8 : type 9 : TRotateBlocks = class 10 : private 11 : FBlockList : TList; 12 : function do_getstartx:integer; 13 : function do_getendx:integer; 14 : function do_getendy:integer; 15 : public 16 : constructor Create; 17 : destructor Destroy; override; 18 : class procedure Rotate(List:TList); 19 : end; 20 : 21 : implementation 22 : 23 : { TRotateBlocks } 24 : 25 : constructor TRotateBlocks.Create; 26 : begin 27 : inherited; 28 : 29 : FBlockList:= TList.Create; 30 : end; 31 : 32 : destructor TRotateBlocks.Destroy; 33 : begin
63 34 : FBlockList.Free; 35 : 36 : inherited; 37 : end; 38 : 39 : function TRotateBlocks.do_GetEndX: Integer; 40 : var 41 : Loop, X : Integer; 42 : begin 43 : Result:= -100; 44 : 45 : for Loop := 0 to FBlockList.Count - 1 do begin 46 : X:= TBlock(FBlockList.Items[Loop]).X; 47 : if X > Result then Result:= X; 48 : end; 49 : 50 : if Result < 0 then Result:= 0; 51 : end; 52 : 53 : function TRotateBlocks.do_GetEndY: Integer; 54 : var 55 : Loop, Y : Integer; 56 : begin 57 : Result:= -100; 58 : 59 : for Loop := 0 to FBlockList.Count - 1 do begin 60 : Y:= TBlock(FBlockList.Items[Loop]).Y; 61 : if Y > Result then Result:= Y; 62 : end; 63 : 64 : if Result < 0 then Result:= 0; 65 : end; 66 : 67 : function TRotateBlocks.do_GetStartX: Integer; 68 : var 69 : Loop, X : Integer;
64 70 : begin 71 : Result:= 100; 72 : 73 : for Loop := 0 to FBlockList.Count - 1 do begin 74 : X:= TBlock(FBlockList.Items[Loop]).X; 75 : if X < Result then Result:= X; 76 : end; 77 : 78 : if Result > 9 then Result:= 9; 79 : end; 80 : 81 : class procedure TRotateBlocks.Rotate(List: TList); 82 : var 83 : Loop, X, Y, StartX, EndX, EndY : Integer; 84 : Block : TBlock; 85 : RotateBlocks : TRotateBlocks; 86 : begin 87 : RotateBlocks:= TRotateBlocks.Create; 88 : try 89 : RotateBlocks.FBlockList.Assign(List); 90 : 91 : StartX:= RotateBlocks.do_GetStartX; 92 : EndX:= RotateBlocks.do_GetEndX; 93 : EndY:= RotateBlocks.do_GetEndY; 94 : 95 : for Loop := 0 to List.Count - 1 do begin 96 : Block:= Pointer(List.Items[Loop]); 97 : X:= Block.X; 98 : Y:= Block.Y; 99 : Block.X:= StartX + (EndY - Y); 100 : Block.Y:= EndY + (X - EndX); 101 : end; 102 : finally 103 : RotateBlocks.Free; 104 : end; 105 : end;
65 106 : 107 : end. 끝으로 블록이짜맞춰졌을때해당라인을삭제하는것은숙제로남겨두겠다. ( 참고자료 /2410)
歯MDI.PDF
E08 MDI SDI(Single Document Interface) MDI(Multiple Document Interface) MDI (Client Window) (Child) MDI 1 MDI MDI MDI - File New Other Projects MDI Application - MDI - OK [ 1] MDI MDI MDI MDI Child MDI
More informationPowerPoint 프레젠테이션
@ Lesson 2... ( ). ( ). @ vs. logic data method variable behavior attribute method field Flow (Type), ( ) member @ () : C program Method A ( ) Method B ( ) Method C () program : Java, C++, C# data @ Program
More informationMicrosoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx
2018 학년도 1 학기 JAVA 프로그래밍 II 514760-1 2018 년봄학기 5/10/2018 박경신 Lab#1 (ImageTest) Lab#1 은영상파일 (Image) 을읽어서정보를출력 Java Tutorials Lesson: Working with Images https://docs.oracle.com/javase/tutorial/2d/images/index.html
More informationgnu-lee-oop-kor-lec06-3-chap7
어서와 Java 는처음이지! 제 7 장상속 Super 키워드 상속과생성자 상속과다형성 서브클래스의객체가생성될때, 서브클래스의생성자만호출될까? 아니면수퍼클래스의생성자도호출되는가? class Base{ public Base(String msg) { System.out.println("Base() 생성자 "); ; class Derived extends Base
More information제11장 프로세스와 쓰레드
제9장자바쓰레드 9.1 Thread 기초 (1/5) 프로그램 명령어들의연속 (a sequence of instruction) 프로세스 / Thread 실행중인프로그램 (program in execution) 프로세스생성과실행을위한함수들 자바 Thread 2 9.1 Thread 기초 (2/5) 프로세스단위작업의문제점 프로세스생성시오버헤드 컨텍스트스위치오버헤드
More information제8장 자바 GUI 프로그래밍 II
제8장 MVC Model 8.1 MVC 모델 (1/7) MVC (Model, View, Controller) 모델 스윙은 MVC 모델에기초를두고있다. MVC란 Xerox의연구소에서 Smalltalk 언어를바탕으로사용자인터페이스를개발하기위한방법 MVC는 3개의구성요소로구성 Model : 응용프로그램의자료를표현하기위한모델 View : 자료를시각적으로 (GUI 방식으로
More information歯처리.PDF
E06 (Exception) 1 (Report) : { $I- } { I/O } Assign(InFile, InputName); Reset(InFile); { $I+ } { I/O } if IOResult 0 then { }; (Exception) 2 2 (Settling State) Post OnValidate BeforePost Post Settling
More informationJUNIT 실습및발표
JUNIT 실습및발표 JUNIT 접속 www.junit.org DownLoad JUnit JavaDoc API Document 를참조 JUNIT 4.8.1 다운로드 설치파일 (jar 파일 ) 을다운로드 CLASSPATH 를설정 환경변수에서설정 실행할클래스에서 import JUnit 설치하기 테스트실행주석 @Test Test 를실행할 method 앞에붙임 expected
More informationPowerPoint Presentation
객체지향프로그래밍 인터페이스, 람다식, 패키지 ( 실습 ) 손시운 ssw5176@kangwon.ac.kr 예제 1. 홈네트워킹 public interface RemoteControl { public void turnon(); // 가전제품을켠다. public void turnoff(); // 가전제품을끈다. 인터페이스를구현 public class Television
More informationCluster management software
자바네트워크프로그래밍 (OCJP 국제공인자격취득중심 ) 충북대학교 최민 기본예제 예외클래스를정의하고사용하는예제 class NewException extends Exception { public class ExceptionTest { static void methoda() throws NewException { System.out.println("NewException
More informationuntitled
- -, (insert) (delete) - - (insert) (delete) (top ) - - (insert) (rear) (delete) (front) A A B top A B C top push(a) push(b) push(c) A B top pop() top A B D push(d) top #define MAX_STACK_SIZE 100 int
More informationPowerPoint Presentation
Class - Property Jo, Heeseung 목차 section 1 클래스의일반구조 section 2 클래스선언 section 3 객체의생성 section 4 멤버변수 4-1 객체변수 4-2 클래스변수 4-3 종단 (final) 변수 4-4 멤버변수접근방법 section 5 멤버변수접근한정자 5-1 public 5-2 private 5-3 한정자없음
More informationq 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2
객체지향프로그래밍 IT CookBook, 자바로배우는쉬운자료구조 q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2 q 객체지향프로그래밍의이해 v 프로그래밍기법의발달 A 군의사업발전 1 단계 구조적프로그래밍방식 3 q 객체지향프로그래밍의이해 A 군의사업발전 2 단계 객체지향프로그래밍방식 4 q 객체지향프로그래밍의이해 v 객체란무엇인가
More informationC# Programming Guide - Types
C# Programming Guide - Types 최도경 lifeisforu@wemade.com 이문서는 MSDN 의 Types 를요약하고보충한것입니다. http://msdn.microsoft.com/enus/library/ms173104(v=vs.100).aspx Types, Variables, and Values C# 은 type 에민감한언어이다. 모든
More informationPowerPoint Presentation
객체지향프로그래밍 클래스, 객체, 메소드 ( 실습 ) 손시운 ssw5176@kangwon.ac.kr 예제 1. 필드만있는클래스 텔레비젼 2 예제 1. 필드만있는클래스 3 예제 2. 여러개의객체생성하기 4 5 예제 3. 메소드가추가된클래스 public class Television { int channel; // 채널번호 int volume; // 볼륨 boolean
More informationJAVA PROGRAMMING 실습 08.다형성
2015 학년도 2 학기 1. 추상메소드 선언은되어있으나코드구현되어있지않은메소드 abstract 키워드사용 메소드타입, 이름, 매개변수리스트만선언 public abstract String getname(); public abstract void setname(string s); 2. 추상클래스 abstract 키워드로선언한클래스 종류 추상메소드를포함하는클래스
More informationDesign Issues
11 COMPUTER PROGRAMMING INHERIATANCE CONTENTS OVERVIEW OF INHERITANCE INHERITANCE OF MEMBER VARIABLE RESERVED WORD SUPER METHOD INHERITANCE and OVERRIDING INHERITANCE and CONSTRUCTOR 2 Overview of Inheritance
More informationJAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각
JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( http://java.sun.com/javase/6/docs/api ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각선의길이를계산하는메소드들을작성하라. 직사각형의가로와세로의길이는주어진다. 대각선의길이는 Math클래스의적절한메소드를이용하여구하라.
More information<30342DBCF6C3B3B8AEBDC3BCB33228C3D6C1BE292E687770>
질산화침전지 유입수 일 차 침전지 질산화 반응조 유출수 반송슬러지 일차슬러지 잉여슬러지 (a) 질산화침전지 유입수 일 차 침전지 포기조 이 차 침전지 질산화조 유출수 반송슬러지 반송슬러지 일차슬러지 잉여슬러지 잉여슬러지 (b) (수산화나트륨) 유입수 일차침전지 반 응 조 이차침전지 처리수 일차침전지슬러지 반송슬러지 잉여슬러지 (a) 순환식질산화탈질법의
More informationUI TASK & KEY EVENT
2007. 2. 5 PLATFORM TEAM 정용학 차례 CONTAINER & WIDGET SPECIAL WIDGET 질의응답및토의 2 Container LCD에보여지는화면한개 1개이상의 Widget을가짐 3 Container 초기화과정 ui_init UMP_F_CONTAINERMGR_Initialize UMP_H_CONTAINERMGR_Initialize
More informationPowerPoint 프레젠테이션
@ Lesson 3 if, if else, if else if, switch case for, while, do while break, continue : System.in, args, JOptionPane for (,, ) @ vs. logic data method variable Data Data Flow (Type), ( ) @ Member field
More informationPowerPoint Template
JavaScript 회원정보 입력양식만들기 HTML & JavaScript Contents 1. Form 객체 2. 일반적인입력양식 3. 선택입력양식 4. 회원정보입력양식만들기 2 Form 객체 Form 객체 입력양식의틀이되는 태그에접근할수있도록지원 Document 객체의하위에위치 속성들은모두 태그의속성들의정보에관련된것
More information2 단계 : 추상화 class 오리 { class 청둥오리 extends 오리 { class 물오리 extends 오리 { 청둥오리 mallardduck = new 청둥오리 (); 물오리 redheadduck = new 물오리 (); mallardduck.swim();
인터페이스적용 오리객체설계하기 ) 청둥오리, 물오리를설계하세요. 1 단계 : 필요한객체설계 class 청둥오리 { class 물오리 { 청둥오리 mallardduck = new 청둥오리 (); 물오리 redheadduck = new 물오리 (); mallardduck.swim(); mallardduck.fly(); mallardduck.quack(); redheadduck.swim();
More information쉽게 풀어쓴 C 프로그래밍
제 5 장생성자와접근제어 1. 객체지향기법을이해한다. 2. 클래스를작성할수있다. 3. 클래스에서객체를생성할수있다. 4. 생성자를이용하여객체를초기화할수 있다. 5. 접근자와설정자를사용할수있다. 이번장에서만들어볼프로그램 생성자 생성자 (constructor) 는초기화를담당하는함수 생성자가필요한이유 #include using namespace
More information(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])
클래스의응용 클래스를자유자재로사용하자. 이장에서다룰내용 1 객체의치환 2 함수와클래스의상관관계 01_ 객체의치환 객체도변수와마찬가지로치환이가능하다. 기본예제 [7-1] 객체도일반변수와마찬가지로대입이가능하다. 기본예제 [7-2] 객체의치환시에는조심해야할점이있다. 복사생성자의필요성에대하여알아보자. [ 기본예제 7-1] 클래스의치환 01 #include
More information제목
Object-Oriented Design Agile for Software Development Story 7. 작 성 자 : 고형호 메 일 : hyungho.ko@gmail.com 홈페이지 : 최초작성일 : 2007.08.10 최종작성일 : 2007.09.05 1 Goal A Set of Contained Responsibilities 2 Content 1.
More information. 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요
. 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요소로써안드로이드시스템에서는 Activities, Services, Content Providers,
More informationMVVM 패턴의 이해
Seo Hero 요약 joshua227.tistory. 2014 년 5 월 13 일 이문서는 WPF 어플리케이션개발에필요한 MVVM 패턴에대한내용을담고있다. 1. Model-View-ViewModel 1.1 기본개념 MVVM 모델은 MVC(Model-View-Contorl) 패턴에서출발했다. MVC 패턴은전체 project 를 model, view 로나누어
More informationNo Slide Title
상속 이충기 명지대학교컴퓨터공학과 상속 Q: 건설회사는기존아파트와조금다르거나추가적인특징들을가진새아파트를지을때어떻게하는가? A: 2 상속 상속 (inheritance) 은클래스들을연관시키는자연스럽고계층적인방법이다. 상속은객체지향프로그래밍의가장중요한개념중의하나이다. 상속은 은 이다 라는관계 (is-a relationship) 를나타낸다. 이관계를적용하여클래스들을상하관계로연결하는것이상속이다.
More informationPowerPoint 프레젠테이션
실습 1 배효철 th1g@nate.com 1 목차 조건문 반복문 System.out 구구단 모양만들기 Up & Down 2 조건문 조건문의종류 If, switch If 문 조건식결과따라중괄호 { 블록을실행할지여부결정할때사용 조건식 true 또는 false값을산출할수있는연산식 boolean 변수 조건식이 true이면블록실행하고 false 이면블록실행하지않음 3
More informationRVC Robot Vaccum Cleaner
RVC Robot Vacuum 200810048 정재근 200811445 이성현 200811414 김연준 200812423 김준식 Statement of purpose Robot Vacuum (RVC) - An RVC automatically cleans and mops household surface. - It goes straight forward while
More information(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public
Chapter 9 Lab 문제정답 1. public class Circle private double radius; static final double PI=3.141592; // PI 이름으로 3.141592 로초기화된정적상수 (1) public Circle(double r) radius = r; (2) public double getradius() return
More informationVisual Basic 반복문
학습목표 반복문 For Next문, For Each Next문 Do Loop문, While End While문 구구단작성기로익히는반복문 2 5.1 반복문 5.2 구구단작성기로익히는반복문 3 반복문 주어진조건이만족하는동안또는주어진조건이만족할때까지일정구간의실행문을반복하기위해사용 For Next For Each Next Do Loop While Wend 4 For
More informationExt JS À¥¾ÖÇø®ÄÉÀ̼ǰ³¹ß-³¹Àå.PDF
CHAPTER 2 (interaction) Ext JS., HTML, onready, MessageBox get.. Ext JS HTML CSS Ext JS.1. Ext JS. Ext.Msg: : Ext Ext.get: DOM 22 CHAPTER 2 (config). Ext JS.... var test = new TestFunction( 'three', 'fixed',
More informationMicrosoft PowerPoint - 6-PythonGUI-sprite
(Computer Science with Python and Pygame, Ch.14 introduction to Sprites) 순천향대학교컴퓨터공학과이상정 순천향대학교컴퓨터공학과 1 학습내용 스프라이트클래스 그룹클래스 스프라이트충돌 블록수집게임예 게임레벨증가및점수표시 스프라이트이동 순천향대학교컴퓨터공학과 2 (1) 스프라이트 (sprite) 큰그래픽장면의부분으로사용되는단일
More information<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>
객체지향프로그램밍 (Object-Oriented Programming) 1 C++ popular C 객체지향 (object oriented) C++ C : 상위계층언어특징 + 어셈블리언어특징 C++ : 소프트웨어개발플랫폼에객체지향개념제공 객체지향 : 자료와이들자료를어떻게다룰것인지따로생각하지않고단지하나의사물로생각 형 변수가사용하는메모리크기 변수가가질수있는정보
More informationAPI - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어
메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어서가장중요한부분이라고도할수있기때문입니다. 1. 새로운메크로생성 새메크로만들기버튺을클릭하여파일을생성합니다. 2. 메크로저장 -
More information 메소드 오버로딩
객체지향언어로서의오브젝트파스칼 (Object Pascal As A OOP) 오브젝트파스칼의객체지향성을몰라도델파이어플리케이션을쉽게만들수있다. 단순히폼을하나만들고, 거기에여러가지컴포넌트들을추가하고, 이벤트핸들러에적당한내용의코드들을추가하면그걸로충분한것이다. 그렇지만, 이것을이해하면델파이가어떤방법으로작업을처리하는지이해할수있고, 자신만의컴포넌트를만들어내거나, 비교적커다란프로젝트를진행할때에커다란도움을받게될것이다.
More informationvar answer = confirm(" 확인이나취소를누르세요."); // 확인창은사용자의의사를묻는데사용합니다. if(answer == true){ document.write(" 확인을눌렀습니다."); else { document.write(" 취소를눌렀습니다.");
자바스크립트 (JavaScript) - HTML 은사용자에게인터페이스 (interface) 를제공하는언어 - 자바스크립트는서버로데이터를전송하지않고서할수있는데이터처리를수행한다. - 자바스크립트는 HTML 나 JSP 에서작성할수있고 ( 내부스크립트 ), 별도의파일로도작성이가능하다 ( 외 부스크립트 ). - 내부스크립트 - 외부스크립트
More information쉽게 풀어쓴 C 프로그래밍
Power Java 제 7 장클래스와객체 이번장에서학습할내용 객체지향이란? 객체 메시지 클래스 객체지향의장점 String 클래스 객체지향개념을완벽하게이해해야만객체지향설계의이점을활용할수있다. 실제세계는객체로이루어진다. 객체지향이란? 실제세계를모델링하여소프트웨어를개발하는방법 절차지향과객체지향 절차지향프로그래밍 (procedural programming): 문제를해결하는절차를중요하게생각하는방법
More information쉽게 풀어쓴 C 프로그래밍
제 11 장상속 1. 상속의개념을이해한다. 2. 상속을이용하여자식클래스를작성할수있다. 3. 상속과접근지정자와의관계를이해한다. 4. 상속시생성자와소멸자가호출되는순서를이해한다. 이번장에서만들어볼프로그램 class Circle { int x, y; int radius;... class Rect { int x, y; int width, height;... 중복 상속의개요
More informationMicrosoft PowerPoint - 04-UDP Programming.ppt
Chapter 4. UDP Dongwon Jeong djeong@kunsan.ac.kr http://ist.kunsan.ac.kr/ Dept. of Informatics & Statistics 목차 UDP 1 1 UDP 개념 자바 UDP 프로그램작성 클라이언트와서버모두 DatagramSocket 클래스로생성 상호간통신은 DatagramPacket 클래스를이용하여
More information<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>
Power Java 제 8 장클래스와객체 I 이번장에서학습할내용 클래스와객체 객체의일생직접 메소드클래스를 필드작성해 UML 봅시다. QUIZ 1. 객체는 속성과 동작을가지고있다. 2. 자동차가객체라면클래스는 설계도이다. 먼저앞장에서학습한클래스와객체의개념을복습해봅시다. 클래스의구성 클래스 (class) 는객체의설계도라할수있다. 클래스는필드와메소드로이루어진다.
More information쉽게 풀어쓴 C 프로그래밍
Power Java 제 11 장상속 이번장에서학습할내용 상속이란? 상속의사용 메소드재정의 접근지정자 상속과생성자 Object 클래스 종단클래스 상속을코드를재사용하기위한중요한기법입니다. 상속이란? 상속의개념은현실세계에도존재한다. 상속의장점 상속의장점 상속을통하여기존클래스의필드와메소드를재사용 기존클래스의일부변경도가능 상속을이용하게되면복잡한 GUI 프로그램을순식간에작성
More informationModern Javascript
ES6 - Arrow Function Class Template String Destructuring Default, Rest, Spread let, const for..of Promises Module System Map, Set * Generator * Symbol * * https://babeljs.io/ Babel is a JavaScript compiler.
More informationMicrosoft PowerPoint PythonGUI-sprite
(Sprite) 순천향대학교컴퓨터공학과 이상정 순천향대학교컴퓨터공학과 1 학습내용 소개 클래스 그룹클래스 충돌 블록수집게임예 게임레벨증가및점수표시 이동 순천향대학교컴퓨터공학과 2 소개 (sprite) 큰그래픽장면의부분으로사용되는단일 2차원이미지 => 쪽화면 게임의장면에서서로상호작용 ( 충돌등 ) 하는물체 => 캐릭터, 아바타 파이게임에서는일반적으로클래스로구현된객체
More information<4D F736F F F696E74202D C61645FB3EDB8AEC7D5BCBA20B9D720C5F8BBE7BFEBB9FD2E BC8A3C8AF20B8F0B5E55D>
VHDL 프로그래밍 D. 논리합성및 Xilinx ISE 툴사용법 학습목표 Xilinx ISE Tool 을이용하여 Xilinx 사에서지원하는해당 FPGA Board 에맞는논리합성과정을숙지 논리합성이가능한코드와그렇지않은코드를구분 Xilinx Block Memory Generator를이용한 RAM/ ROM 생성하는과정을숙지 2/31 Content Xilinx ISE
More informationUI TASK & KEY EVENT
T9 & AUTOMATA 2007. 3. 23 PLATFORM TEAM 정용학 차례 T9 개요 새로운언어 (LDB) 추가 T9 주요구조체 / 주요함수 Automata 개요 Automata 주요함수 추후세미나계획 질의응답및토의 T9 ( 2 / 30 ) T9 개요 일반적으로 cat 이라는단어를쓸려면... 기존모드 (multitap) 2,2,2, 2,8 ( 총 6번의입력
More informationMicrosoft PowerPoint - 2강
컴퓨터과학과 김희천교수 학습개요 Java 언어문법의기본사항, 자료형, 변수와상수선언및사용법, 각종연산자사용법, if/switch 등과같은제어문사용법등에대해설명한다. 또한 C++ 언어와선언 / 사용방법이다른 Java의배열선언및사용법에대해서설명한다. Java 언어의효과적인활용을위해서는기본문법을이해하는것이중요하다. 객체지향의기본개념에대해알아보고 Java에서어떻게객체지향적요소를적용하고있는지살펴본다.
More informationchap 5: Trees
5. Threaded Binary Tree 기본개념 n 개의노드를갖는이진트리에는 2n 개의링크가존재 2n 개의링크중에 n + 1 개의링크값은 null Null 링크를다른노드에대한포인터로대체 Threads Thread 의이용 ptr left_child = NULL 일경우, ptr left_child 를 ptr 의 inorder predecessor 를가리키도록변경
More information제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호
제이쿼리 () 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호 CSS와마찬가지로, 문서에존재하는여러엘리먼트를접근할수있다. 엘리먼트접근방법 $( 엘리먼트 ) : 일반적인접근방법
More informationMicrosoft PowerPoint - 09-Object Oriented Programming-3.pptx
Development of Fashion CAD System 9. Object Oriented Programming-3 Sungmin Kim SEOUL NATIONAL UNIVERSITY Introduction Topics Object Oriented Programming (OOP) 정의 복수의 pattern object 로 이루어지는 새로운 class Pattern
More information학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2
학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2 6.1 함수프로시저 6.2 서브프로시저 6.3 매개변수의전달방식 6.4 함수를이용한프로그래밍 3 프로시저 (Procedure) 프로시저 (Procedure) 란무엇인가? 논리적으로묶여있는하나의처리단위 내장프로시저 이벤트프로시저, 속성프로시저, 메서드, 비주얼베이직내장함수등
More information소프트웨어공학 Tutorial #2: StarUML Eun Man Choi
소프트웨어공학 Tutorial #2: StarUML Eun Man Choi emchoi@dgu.ac.kr Contents l StarUML 개요 l StarUML 소개및특징 l 주요기능 l StarUML 화면소개 l StarUML 설치 l StarUML 다운 & 설치하기 l 연습 l 사용사례다이어그램그리기 l 클래스다이어그램그리기 l 순서다이어그램그리기 2
More informationWeek5
Week 05 Iterators, More Methods and Classes Hash, Regex, File I/O Joonhwan Lee human-computer interaction + design lab. Iterators Writing Methods Classes & Objects Hash File I/O Quiz 4 1. Iterators Array
More information<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>
게임엔진 제 4 강프레임리스너와 OIS 입력시스템 이대현교수 한국산업기술대학교게임공학과 학습내용 프레임리스너의개념 프레임리스너를이용한엔터티의이동 OIS 입력시스템을이용한키보드입력의처리 게임루프 Initialization Game Logic Drawing N Exit? Y Finish 실제게임루프 오우거엔진의메인렌더링루프 Root::startRendering()
More informationPowerPoint Presentation
public class SumTest { public static void main(string a1[]) { int a, b, sum; a = Integer.parseInt(a1[0]); b = Integer.parseInt(a1[1]); sum = a + b ; // 두수를더하는부분입니다 System.out.println(" 두수의합은 " + sum +
More information쉽게 풀어쓴 C 프로그래밍
CHAPTER 11. 자바스크립트와캔버스로게임 만들기 캔버스 캔버스는 요소로생성 캔버스는 HTML 페이지상에서사각형태의영역 실제그림은자바스크립트를통하여코드로그려야한다. 컨텍스트객체 컨텍스트 (context) 객체 : 자바스크립트에서물감과붓의역할을한다. var canvas = document.getelementbyid("mycanvas"); var
More information[ 그림 7-1] 프로젝트 res 폴더 이미지뷰 [ 예제 7-1] 이미지뷰 1 <LinearLayout 2 ~~~~ 중간생략 ~~~~ 3 android:orientation="vertical" > 4 <ImageView
7 차시이미지처리 1 학습목표 이미지뷰를사용하는방법을배운다. 비트맵을사용하는방법을배운다. 2 확인해볼까? 3 이미지뷰와이미지버튼 1) 학습하기 [ 그림 7-1] 프로젝트 res 폴더 이미지뷰 [ 예제 7-1] 이미지뷰 1 4
More informationMicrosoft PowerPoint - ÀÚ¹Ù08Àå-1.ppt
AWT 컴포넌트 (1) 1. AWT 패키지 2. AWT 프로그램과이벤트 3. Component 클래스 4. 컴포넌트색칠하기 AWT GUI 를만들기위한 API 윈도우프로그래밍을위한클래스와도구를포함 Graphical User Interface 그래픽요소를통해프로그램과대화하는방식 그래픽요소를 GUI 컴포넌트라함 윈도우프로그램만들기 간단한 AWT 프로그램 import
More informationPowerPoint 프레젠테이션
SMV 소개 Konkuk Univ. IT 융합정보보호학과 오예원, 박선영 목차 SMV 소개 CTL NuSMV 설치방법및예시 (lift) 향후계획 SMV SMV(Symbolic Model Verifier) 는유한상태시스템 (finite state system) 이 CTL(Computation Tree Logic) 이라는논리와 BDD(Binary Decision
More informationMicrosoft PowerPoint - PL_03-04.pptx
Copyright, 2011 H. Y. Kwak, Jeju National University. Kwak, Ho-Young http://cybertec.cheju.ac.kr Contents 1 프로그래밍 언어 소개 2 언어의 변천 3 프로그래밍 언어 설계 4 프로그래밍 언어의 구문과 구현 기법 5 6 7 컴파일러 개요 변수, 바인딩, 식 및 제어문 자료형 8
More informationPowerPoint 프레젠테이션
인터페이스 배효철 th1g@nate.com 1 목차 인터페이스의역할 인터페이스선언 인터페이스구현 인터페이스사용 타입변환과다형성 인터페이스상속 디폴트메소드와인터페이스확장 2 인터페이스의역할 인터페이스란? 개발코드와객체가서로통신하는접점 개발코드는인터페이스의메소드만알고있으면 OK 인터페이스의역할 개발코드가객체에종속되지않게 -> 객체교체할수있도록하는역할 개발코드변경없이리턴값또는실행내용이다양해질수있음
More informationEMBARCADERO TECHNOLOGIES (Humphery Kim) RAD Studio : h=p://tech.devgear.co.kr/ : h=p://blog.hjf.pe.kr/ Facebook : h=p://d.com/hjfactory :
#1 RAD (RAD STUDIO) In www.devgear.co.kr 2016.05.16 EMBARCADERO TECHNOLOGIES (Humphery Kim) RAD Studio : h=p://tech.devgear.co.kr/ : h=p://blog.hjf.pe.kr/ Facebook : h=p://d.com/hjfactory : hskim@embarcadero.kr
More informationPowerPoint Presentation
Package Class 1 Heeseung Jo 목차 section 1 패키지개요와패키지의사용 section 2 java.lang 패키지의개요 section 3 Object 클래스 section 4 포장 (Wrapper) 클래스 section 5 문자열의개요 section 6 String 클래스 section 7 StringBuffer 클래스 section
More information歯엑셀모델링
I II II III III I VBA Understanding Excel VBA - 'VB & VBA In a Nutshell' by Paul Lomax, October,1998 To enter code: Tools/Macro/visual basic editor At editor: Insert/Module Type code, then compile by:
More information트레이 아이콘 어플리케이션의 제작
트레이아이콘어플리케이션의제작 (Creating Tray Icon Application) 윈도우 95 와 NT 4.0 에는작업바의우측에작업트레이라는부분이있다. 여기에있는아이콘은현재데스크탑에서실행되고있는윈도우를가지고있는어플리케이션이라기보다는도스시절에있었던램상주프로그램과비슷한역할을하는것이많다. 이번장에서는트레이에상주하는어플리케이션을제작하는방법에대해서알아보자. Shell_NotifyIcon
More informationMicrosoft Word - ntasFrameBuilderInstallGuide2.5.doc
NTAS and FRAME BUILDER Install Guide NTAS and FRAME BUILDER Version 2.5 Copyright 2003 Ari System, Inc. All Rights reserved. NTAS and FRAME BUILDER are trademarks or registered trademarks of Ari System,
More informationNetwork Programming
Part 5 확장된 Network Programming 기술 1. Remote Procedure Call 2. Remote Method Invocation 3. Object Request Broker 2. Java RMI
More informationMicrosoft PowerPoint - chap02-C프로그램시작하기.pptx
#include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의
More information델파이 4 프로그래밍의 이해 (Understandings of Delphi 4 Programming)
델파이 4 프로그래밍의이해 (Understandings of Delphi 4 Programming) 오브젝트파스칼과심도있는델파이프로그래밍의세계로들어가기전에, 이번장에서는델파이를사용하여첫번째윈도우어플리케이션을제작하고전반적인델파이의환경에대해서알아볼것이다. 내용의수준이높지는않겠지만, 흔히알고있었던내용이라고하더라도별생각없이넘어갔던것들도많을것이다. 그러면, 델파이 4
More informationContents. 1. PMD ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 2. Metrics ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 3. FindBugs ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 4. ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ
정적분석서 - 영단어수집왕 - Team.# 3 과목명 소프트웨어모델링및분석 담당교수 유준범교수님 201011320 김용현 팀원 201111360 손준익 201111347 김태호 제출일자 2015-06-09 1 Contents. 1. PMD ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 2. Metrics
More information05-class.key
5 : 2 (method) (public) (private) (interface) 5.1 (Method), (public method) (private method) (constructor), 3 4 5.2 (client). (receiver)., System.out.println("Hello"); (client object) (receiver object)
More information목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate
ALTIBASE HDB 6.1.1.5.6 Patch Notes 목차 BUG-39240 offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG-41443 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate 한뒤, hash partition
More informationgnu-lee-oop-kor-lec10-1-chap10
어서와 Java 는처음이지! 제 10 장이벤트처리 이벤트분류 액션이벤트 키이벤트 마우스이동이벤트 어댑터클래스 스윙컴포넌트에의하여지원되는이벤트는크게두가지의카테고리로나누어진다. 사용자가버튼을클릭하는경우 사용자가메뉴항목을선택하는경우 사용자가텍스트필드에서엔터키를누르는경우 두개의버튼을만들어서패널의배경색을변경하는프로그램을작성하여보자. 이벤트리스너는하나만생성한다. class
More informationMicrosoft Word - Armjtag_문서1.doc
ARM JTAG (wiggler 호환 ) 사용방법 ( IAR EWARM 에서 ARM-JTAG 로 Debugging 하기 ) Test Board : AT91SAM7S256 IAR EWARM : Kickstart for ARM ARM-JTAG : ver 1.0 ( 씨링크테크 ) 1. IAR EWARM (Kickstart for ARM) 설치 2. Macraigor
More informationUSER GUIDE
Solution Package Volume II DATABASE MIGRATION 2010. 1. 9. U.Tu System 1 U.Tu System SeeMAGMA SYSTEM 차 례 1. INPUT & OUTPUT DATABASE LAYOUT...2 2. IPO 중 VB DATA DEFINE 자동작성...4 3. DATABASE UNLOAD...6 4.
More information<3230303420B0B3C0CEC1A4BAB8BAD0C0EFC1B6C1A4BBE7B7CAC1FD2E687770>
인터넷 전화/팩스/이메일 방문 접수통보 분쟁조정 신청 및 접수 Case Screening 불만의 해소, 타기관 이첩 등 증거수집, 전문가 자문 등 사실조사 조정전 합의권고 YES 합의 NO 조정결정 NO 민사소송 또는 포기 YES 종료 200 180 190 180 160 163 140 120 100 80 60 40 20 116 100 57 93
More information[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme
8 차시메뉴와대화상자 1 학습목표 안드로이드에서메뉴를작성하고사용하는방법을배운다. 안드로이드에서대화상자를만들고사용하는방법을배운다. 2 확인해볼까? 3 메뉴 1) 학습하기 [ 그림 8-1] XML 을이용한옵션메뉴설정방법 public boolean
More information예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A
제 10 장상속 예제 1) ConstructorTest.java class Parent public Parent() super - default"); public Parent(int i) this("hello"); super(int) constructor" + i); public Parent(char c) this(); super(char) constructor
More informationPowerPoint Presentation
자바프로그래밍 1 클래스와메소드심층연구 ( 실습 ) 손시운 ssw5176@kangwon.ac.kr 예제 1. 접근제어 class A { private int a; int b; public int c; // 전용 // 디폴트 // 공용 public class Test { public static void main(string args[]) { A obj = new
More informationChapter 4. LISTS
6. 동치관계 (Equivalence Relations) 동치관계 reflexive, symmetric, transitive 성질을만족 "equal to"(=) 관계는동치관계임. x = x x = y 이면 y = x x = y 이고 y = z 이면 x = z 동치관계를이용하여집합 S 를 동치클래스 로분할 동일한클래스내의원소 x, y 에대해서는 x y 관계성립
More information오버라이딩 (Overriding)
WindowEvent WindowEvent 윈도우가열리거나 (opened) 닫힐때 (closed) 활성화되거나 (activated) 비활성화될때 (deactivated) 최소화되거나 (iconified) 복귀될때 (deiconified) 윈도우닫힘버튼을누를때 (closing) WindowEvent 수신자 abstract class WindowListener
More information02 C h a p t e r Java
02 C h a p t e r Java Bioinformatics in J a va,, 2 1,,,, C++, Python, (Java),,, (http://wwwbiojavaorg),, 13, 3D GUI,,, (Java programming language) (Sun Microsystems) 1995 1990 (green project) TV 22 CHAPTER
More information어댑터뷰
04 커스텀어댑터뷰 (Custom Adapter View) 커스텀어댑터뷰 (Custom Adapter View) 커스텀어댑터뷰 (Custom Adatper View) 란? u 어댑터뷰의항목하나는단순한문자열이나이미지뿐만아니라, 임의의뷰가될수 있음 이미지뷰 u 커스텀어댑터뷰설정절차 1 2 항목을위한 XML 레이아웃정의 어댑터정의 3 어댑터를생성하고어댑터뷰객체에연결
More informationAPI 매뉴얼
PCI-DIO12 API Programming (Rev 1.0) Windows, Windows2000, Windows NT and Windows XP are trademarks of Microsoft. We acknowledge that the trademarks or service names of all other organizations mentioned
More information- JPA를사용하는경우의스프링설정파일에다음을기술한다. <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localentitymanagerfactorybean" p:persistenceunitname=
JPA 와 Hibernate - 스프링의 JDBC 대신에 JPA를이용한 DB 데이터검색작업 - JPA(Java Persistence API) 는자바의 O/R 매핑에대한표준지침이며, 이지침에따라설계된소프트웨어를 O/R 매핑프레임워크 라고한다. - O/R 매핑 : 객체지향개념인자바와관계개념인 DB 테이블간에상호대응을시켜준다. 즉, 객체지향언어의인스턴스와관계데이터베이스의레코드를상호대응시킨다.
More informationMicrosoft PowerPoint - Lect04.pptx
OBJECT ORIENTED PROGRAMMING Object Oriented Programming 이강의록은 Power Java 저자의강의록을사용했거나재편집된것입니다. Class 와 object Class 와객체 클래스의일생 메소드 필드 String Object Class 와객체 3 클래스 클래스의구성 클래스 (l (class): 객체를만드는설계도 클래스로부터만들어지는각각의객체를특별히그클래스의인스턴스
More information쉽게
Power Java 제 4 장자바프로그래밍기초 이번장에서학습할내용 자바프로그램에대한기초사항을학습 자세한내용들은추후에. Hello.java 프로그램 주석 주석 (comment): 프로그램에대한설명을적어넣은것 3 가지타입의주석 클래스 클래스 (class): 객체를만드는설계도 ( 추후에학습 ) 자바프로그램은클래스들로구성된다. 그림 4-1. 자바프로그램의구조 클래스정의
More information삼성955_965_09
판매원-삼성전자주식회사 본 사 : 경기도 수원시 영통구 매탄 3동 416번지 제조원 : (주)아이젠 삼성 디지털 비데 순간온수 세정기 사용설명서 본 제품은 국내(대한민국)용 입니다. 전원, 전압이 다른 해외에서는 품질을 보증하지 않습니다. (FOR KOREA UNIT STANDARD ONLY) 이 사용설명서에는 제품보증서가 포함되어 있습니다. 분실되지 않도록
More informationMicrosoft PowerPoint - java2 [호환 모드]
10 장객체- 지향프로그래밍 II 창병모 1 상속 창병모 2 상속 (Inheritance) 상속이란무엇인가? 기존의클래스로부터새로운클래스를유도하는것 자식클래스는부모클래스의메쏘드와데이터를상속 자식클래스에새로운변수나메쏘드를추가할수있다. 기존클래스 부모클래스 (parent class), 수퍼클래스 (superclass), 기반클래스 (base class) 유도클래스
More informationSemantic Consistency in Information Exchange
제 6 장제어 (Control) 6.1 구조적프로그래밍 (Structured Programming) 6.2 예외 (Exceptions) Reading Chap. 7 숙대창병모 1 6.1 구조적프로그래밍 숙대창병모 2 Fortran 제어구조 10 IF (X.GT. 0.000001) GO TO 20 11 X = -X IF (X.LT. 0.000001) GO TO
More informationMicrosoft PowerPoint - chap11
10 장객체 - 지향프로그래밍 II 상속 상속 (Inheritance) 상속이란무엇인가? 기존의클래스로부터새로운클래스를유도하는것 자식클래스는부모클래스의메쏘드와데이터를상속 자식클래스에새로운변수나메쏘드를추가할수있다. 기존클래스 부모클래스 (parent class), 수퍼클래스 (superclass), 기반클래스 (base class) 유도클래스 자식클래스 (child
More informationJavascript.pages
JQuery jquery part1 JavaScript : e-mail:leseraphina@naver.com http://www.webhard.co.kr I.? 2 ......,,. : : html5 ; ; .
More informationU.Tu System Application DW Service AGENDA 1. 개요 4. 솔루션 모음 1.1. 제안의 배경 및 목적 4.1. 고객정의 DW구축에 필요한 메타정보 생성 1.2. 제품 개요 4.2. 사전 변경 관리 1.3. 제품 특장점 4.3. 부품화형
AGENDA 1. 개요 4. 솔루션 모음 1.1. 제안의 배경 및 목적 4.1. 고객정의 DW구축에 필요한 메타정보 생성 1.2. 제품 개요 4.2. 사전 변경 관리 1.3. 제품 특장점 4.3. 부품화형 언어 변환 1.4. 기대 효과 4.4. 프로그램 Restructuring 4.5. 소스 모듈 관리 2. SeeMAGMA 적용 전략 2.1. SeeMAGMA
More informationMicrosoft Word - java19-1-midterm-answer.doc
중간고사 담당교수 : 단국대학교응용컴퓨터공학박경신 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤쪽이나연습지에기술한내용은답안으로인정안함. 답에는반드시네모를쳐서확실히표시할것. 답안지에학과, 학번, 이름외에본인의암호 (4자리숫자 ) 를기입하면성적공고시학번대신암호를 사용할것임. 1. 다음질문에답을하라. (55
More information기본적인 컴포넌트의 제작
기본적인컴포넌트의제작 (Creating Basic Components) 델파이는가장잘된윈도우용 OOP 개발환경이라고말할수있다. 이러한델파이의가장핵심부분은누가뭐라해도델파이의튼튼한컴포넌트라고말할수있다. 컴포넌트란 OOP 의기본개념을충실하게지원하는델파이의객체로, 이러한컴포넌트를개발하는방법이야말로, 델파이개발자에게는가장중요한기술이라고말해도과언이아니다. 이번장에서는컴포넌트가동작하는방법을이해하고실제로컴포넌트를제작하는방법에대해서알아보기로한다.
More informationThisJava ..
자바언어에정확한타입을추가한 ThisJava 소개 나현익, 류석영 프로그래밍언어연구실 KAIST 2014 년 1 월 14 일 나현익, 류석영 자바언어에정확한타입을추가한 ThisJava 소개 1/29 APLAS 2013 나현익, 류석영 자바 언어에 정확한 타입을 추가한 ThisJava 소개 2/29 실제로부딪힌문제 자바스크립트프로그램분석을위한요약도메인 나현익,
More information제4장 기본 의미구조 (Basic Semantics)
제 4 장블록및유효범위 Reading Chap. 5 숙대창병모 1 4.1 변수선언및유효범위 숙대창병모 2 변수선언과유효범위 변수선언 Declaration before Use! 대부분의언어에서변수는사용전에먼저선언해야한다. 변수의유효범위 (scope) 선언된변수가유효한 ( 사용될수있는 ) 프로그램내의범위 / 영역 변수이름뿐아니라함수등다른이름도생각해야한다. 정적유효범위
More information목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4
ALTIBASE HDB 6.5.1.5.10 Patch Notes 목차 BUG-46183 DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG-46249 [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4 BUG-46266 [sm]
More information