차이점

이 페이지의 선택한 이전 버전과 현재 버전 사이의 차이점을 보여줍니다.

차이 보기로 연결

함수_프로그램을_클래스_프로그램으로_고치기 [2012/07/27 15:27]
admin 새로 만듦
함수_프로그램을_클래스_프로그램으로_고치기 [2012/07/27 17:55] (현재)
admin
줄 1: 줄 1:
 {{:00170.jpg|}} {{:00170.jpg|}}
 +
 +아래 예제는 함수 프로그램 FUNC1.PRG를 클래스 프로그램 CLASS1.PRG로 바꾼 모습을 보여 줍니다.
 +
 + STATIC cInit, dDate, lLogic, nToTa, aClass[5]를 클래스 프로그램에서는
 +
 + DATA cInit  AS CHARACTER
 +
 + DATA dDate  AS DATE
 +
 + DATA lLogic AS LOGICAL
 +
 + DATA nTotal AS NUMERIC
 +
 + DATA aClass AS ARRAY INIT Array( 5 )
 +
 +로 대치하며 변수의 타입을 정확히 해주었습니다.(변수 타입은 정하지 않아도 됩니다.) 
 +
 +함수 프로그램의 함수들은 모두 메소드로 바꾸어 주며, 메소드명은 클래스를 선언하는 부분에 한번 더 적어 줍니다.
 +
 +그리고 DATA 변수를 METHOD에서 값을 참조하거나, 값을 변경할 때는 변수 앞에 ::을 붙입니다.
 + 
 +또,  어떤 CLASS에서 다른 CLASS를 부를 때는 LOCAL oMan := TApp():New() 와 같은 방법으로 부르면 됩니다.
 +
 +함수 프로그램을 클래스 프로그램으로 고치는 방법은 이와 같이 간단합니다. 
 +
 +함수프로그램을 클래스 프로그램으로 고치면 코딩이 편리하고, 쏘스 분석이 편리하며, 프로그램의 실행속도가 향상됩니다.
 +
 + 
 +
 +NSAMPLES\FUN-CLASS\FUNC1.PRG 참조
 +
 +<code>
 +#include "npp.ch"
 +
 +STATIC cInit, dDate, lLogic, nToTal
 +
 +Function Main()
 +       Init()
 +       Show()
 +       Show1()
 +Return Nil
 +
 +Function Init()
 +     cInit  := "Test"
 +     dDate  := date()
 +     lLogic := .t.
 +     nToTal := 100
 +Return Nil
 +
 +Function Show()
 +     MsgInfo( cInit  )
 +     MsgInfo( DTOC(dDate)  )
 +     MsgInfo( lLogic )
 +     MsgInfo( nToTal )
 +Return Nil
 +
 +Function Show1()
 +     MsgInfo( cInit  )
 +Return Nil
 +</code>
 +
 +NSAMPLES\FUN-CLASS\CLASS1.PRG 참조
 +
 +<code>
 +#include "npp.ch"
 +
 +FUNCTION Main()
 +         LOCAL oMan1 := TApp():New()
 +Return Nil
 +
 +CLASS TApp
 +      DATA cInit  AS CHARACTER
 +      DATA dDate  AS DATE
 +      DATA lLogic AS LOGICAL
 +      DATA nTotal AS NUMERIC
 +
 +      METHOD New() CONSTRUCTOR
 +      METHOD Init()
 +      METHOD Show()
 +      METHOD Show1() INLINE MsgInfo( ::cInit )
 +ENDCLASS
 +
 +METHOD New() CLASS TApp
 +       ::Init()
 +       ::Show()
 +       ::Show1()
 +RETURN Self
 +
 +METHOD Init() CLASS TApp
 +       ::cInit  := "Test"
 +       ::dDate  := date()
 +       ::lLogic := .t.
 +       ::nToTal := 100
 +Return Nil
 +
 +METHOD Show() CLASS TApp
 +        MsgInfo( ::cInit  )
 +        MsgInfo( DTOC(::dDate)  )
 +        MsgInfo( ::lLogic )
 +        MsgInfo( ::nToTal )
 +Return Nil
 +</code>
 +
 +{{:00171.jpg|}}
 +
 +1. 객체, 클래스
 +
 +▶ 객체 란?
 +
 + 객체란 다른 종류의 객체와 구분되는 일부 전형적인 행동을 갖는 데이터의 집합체이다.
 +
 + 객체  : 데이터 + 행동 → 데이터 + 메소드
 +
 + 데이터 : 객체가 가지고 있는 무엇
 +
 + 행동  : 객체가 하는 것
 +
 +  ▶ 클래스 란?
 +
 +  이렇게 객체가 생성되고 그들 객체의 행동들은 어떤 것인가에 대한 일종의 규칙들의 집합체가 바로 클래스다.
 +
 +  FiveWin에서의 클래스 구성 예제
 +
 +<code>
 +  CLASS TWindow
 +      DATA nTop, nLeft, nBottom, nRight
 +   METHOD New() CONSTRUCTOR
 +   METHOD Display()
 +  ENDCLASS
 +</code>
 +
 +  이것은 클래스의 헤더 선언부이다. 우리는 윈도우가 nTop, nLeft, nBottom, nRight라는 데이터를 가지게 됨을 알 수 있다. 그리고 윈도우의 행동은 New()와 Display()를 수행할 것임을 알 수 있다.
 +
 +  전형적으로 New() 행동은 ‘Constructor’ 메소드라고 하는데 이는 새로운 객체를 만드는 방법이다.
 +
 +<code>
 +  oWindows := TWindow() : New(3, 3, 20, 40)
 +</code>
 +
 +  우리는 oWindow라고 하는 하나의 객체를 만드는 것이다. 그 객체는 어떤 특정 데이터를 갖는 FiveWin 내에서의 특별한 종류의 배열이며, 그 데이터는 객체마다 서로 다른 값을 가질 수가 있다. 그러나 항상 동일한 종류의 데이터를 갖고 있다.
 +
 +2. OBJECTS 엔진
 +
 +  ▶ 객체 문법
 +
 +<code>
 +  #include "Objects.ch"
 +</code>
 +
 +  (#include "npp.ch"를 해주면 npp.ch내에서 관련 .ch는 모두 불러주므로 위와 같이 별도로 할 필요는 없다.)
 +
 +<code>
 +  CLASS <TMyClass> [ FROM <TParentClass> ]
 +         DATA <DataName>
 +         ...
 +          METHOD <MethodName> ([<params, ....>]);
 +                [CONSTRUCTOR | SETGET | VIRTUAL | BLOCK ]
 +</code>
 +
 +  ENDCLASS
 +
 +  <TMyClass>  생성하려고 하는 새로운 클래스의 이름. 10자를 초과해서는 안됨
 +
 +  <TParentClass> 새로운 클래스를 상속받으려고 하는 클래스의 이름
 +
 +  <DataName>  이 새로운 클래스의 객체에 대하여 우리가 갖고자 하는 데이터 요소(인스턴스 변수)의 이름들
 +
 +  <MethodName> 이 객체의 메소드 이름
 +
 +  <params, ....>  메소드에 전달될 인수로서의 요소 리스트(옵션)
 +
 + 
 +
 +  ▶ 절
 +
 +  CONSTRUCTOR  객체를 초기화하고자 할 때, 그리고 레퍼런스를 자동적으로 자신에게 돌려주고자 할 때
 +
 +  SETGET     이 것들은 계산된 데이터를 위한 것이며 이 메소드의 이름을 데이터같이 사용하는 것임을 의미한다.
 +
 +  VIRTUAL    아무일도 안하는 메소드.
 +
 +          상속에서 매우 유용한 것이며 클래스를 처음 만들고 검사할 때에도 유용
 +
 +  BLOCK     매우 빠르고 코딩하기가 쉽다.
 +
 +          단지 클래스 정의에 라인 중 선언을 원할 경우 이것을 사용하며, 파이브윈 클래스에서 대단히 많이 사용된다. 반드시 첫 번째 인수는 'Self'로 지정해 주어야 한다.
 +
 +  INLINE    BLOCK절과 동일한 기능을 가지지만 코드 블록을 만들 필요가 없기 때문에 훨씬 사용하기 가 쉽다
 +
 +         (자동적으로 생성. 이것이 더 우수한 xBase다!).
 +
 + 
 +
 +  ▶ 메소드 만들기
 +
 +<code>
 +  METHOD <MethodName> ([<params, ....>]) CLASS <TMyClass>
 +</code>
 +
 +    여기에 사용할 하나의 로컬 ‘Self'를 가지고 있다. Self:Data를 엑세스하려면 ::를 사용한다.
 +
 +    즉, 클래스에서 선언된 데이터나 메쏘드를 사용하려면 ::<Data>, ::<Method()> 로 한다.
 +
 +<code>
 +  Return < Nil, uValue, .t., .f.)
 +</code>
 +
 +클래스 상속예제
 +
 +{{:00172.jpg|}}
 +
 +NSAMPLES\FUN-CLASS\SOURCE\MAIN.PRG 참조
 +
 +<code>
 +#include "npp.ch"
 +
 +FUNCTION CLASSMAIN()
 +
 +         Local oDlg, oBut[2]
 +
 +         DEFINE DIALOG oDlg RESOURCE "D_MAIN"
 +
 +                REDEFINE BUTTON oBut[1] ID 1001 OF oDlg ;
 +                         ACTION TFATHER():New()
 +
 +                REDEFINE BUTTON oBut[2] ID 1002 OF oDlg ;
 +                         ACTION TSON():New()
 +
 +         ACTIVATE DIALOG oDlg CENTERED
 +
 +RETURN NIL
 +
 +
 +Init Function START()
 +
 +     SET _3DLOOK ON
 +     SET RESOURCES TO "CLASS.DLL"
 +
 +RETURN NIL
 +</code>
 +
 +NSAMPLES\FUN-CLASS\SOURCE\TFATHER.PRG 참조
 +
 +<code>
 +#include "npp.ch"
 +
 +CLASS TFather
 +   DATA oDlg,   oBut
 +   DATA oName,  cName
 +   DATA oLeft,  cLeft
 +   DATA oRight, cRight
 +   DATA oNose,  cNose
 +   DATA oMouth, cMouth
 +
 +   METHOD New() CONSTRUCTOR
 +   METHOD FormCreate()
 +   METHOD LoadInfo()
 +   METHOD DrawEye()
 +   METHOD DrawNose()
 +   METHOD DrawMouth()
 +
 +ENDCLASS
 +
 +
 +METHOD New() CLASS TFather
 +
 +   ::FormCreate()
 +
 +RETURN Self
 +
 +
 +METHOD FormCreate()
 +
 +       DEFINE DIALOG ::oDlg RESOURCE "D_CLASS"
 +
 +         ::LoadInfo()
 +         ::DrawEye()
 +         ::DrawNose()
 +         ::DrawMouth()
 +
 +       ACTIVATE DIALOG ::oDlg ON INIT ::oDlg:MOVE(333,302)
 +
 +Return NIL
 +METHOD LoadInfo() CLASS TFather
 +
 +       ::cName:= "아버지"
 +       REDEFINE SAY ::oName VAR ::cName ID 1001 OF ::oDlg
 +
 +RETURN NIL
 +
 +
 +METHOD DrawEye() CLASS TFather
 +
 +       ::cLeft  := "O"
 +       ::cRight := "O"
 +       REDEFINE SAY ::oLeft  VAR ::cLeft  ID 1002 OF ::oDlg
 +       REDEFINE SAY ::oRight VAR ::cRight ID 1003 OF ::oDlg
 +
 +RETURN NIL
 +METHOD DrawNose() CLASS TFather
 +
 +       ::cNose := "oo"
 +       REDEFINE SAY ::oNose VAR ::cNose ID 1004 OF ::oDlg
 +
 +RETURN NIL
 +
 +
 +METHOD DrawMouth() CLASS TFather
 +
 +       ::cMouth := "^^^^^"
 +       REDEFINE SAY ::oMouth VAR ::cMouth ID 1005 OF ::oDlg
 +
 +RETURN NIL
 +</code>
 +
 +NSAMPLES\FUN-CLASS\SOURCE\TSON.PRG 참조
 +
 +<code>
 +#include "npp.ch"
 +
 +CLASS TSon FROM TFather  // 부(TFather)로 부터 상속을 받음
 +
 +   METHOD LoadInfo()     // 이름 바꿈
 +   METHOD DrawEye()      // 눈모양 바꿈
 +                         // 그 이외는 부와 같음
 +
 +ENDCLASS
 +
 +
 +METHOD LoadInfo()  CLASS TSon
 +
 +      ::cName := "아  들"
 +       REDEFINE SAY ::oName VAR ::cName ID 1001 OF ::oDlg
 +
 +RETURN NIL
 +
 +
 +METHOD DrawEye() CLASS TSon
 +
 +       ::cLeft  := "O"
 +       ::cRight := "--"
 +       REDEFINE SAY ::oLeft  VAR ::cLeft  ID 1002 OF ::oDlg
 +       REDEFINE SAY ::oRight VAR ::cRight ID 1003 OF ::oDlg
 +RETURN NIL
 +</code>
 

Link categories 1

Link categories 2