아래 예제는 함수 프로그램 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 참조

#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

NSAMPLES\FUN-CLASS\CLASS1.PRG 참조

#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

1. 객체, 클래스

▶ 객체 란?

 객체란 다른 종류의 객체와 구분되는 일부 전형적인 행동을 갖는 데이터의 집합체이다.

 객체  : 데이터 + 행동 → 데이터 + 메소드

 데이터 : 객체가 가지고 있는 무엇

 행동  : 객체가 하는 것

  ▶ 클래스 란?

  이렇게 객체가 생성되고 그들 객체의 행동들은 어떤 것인가에 대한 일종의 규칙들의 집합체가 바로 클래스다.

  FiveWin에서의 클래스 구성 예제

  CLASS TWindow
   	  	DATA nTop, nLeft, nBottom, nRight
	  	METHOD New() CONSTRUCTOR
	  	METHOD Display()
  ENDCLASS

  이것은 클래스의 헤더 선언부이다. 우리는 윈도우가 nTop, nLeft, nBottom, nRight라는 데이터를 가지게 됨을 알 수 있다. 그리고 윈도우의 행동은 New()와 Display()를 수행할 것임을 알 수 있다.

  전형적으로 New() 행동은 ‘Constructor’ 메소드라고 하는데 이는 새로운 객체를 만드는 방법이다.

  oWindows := TWindow() : New(3, 3, 20, 40)

  우리는 oWindow라고 하는 하나의 객체를 만드는 것이다. 그 객체는 어떤 특정 데이터를 갖는 FiveWin 내에서의 특별한 종류의 배열이며, 그 데이터는 객체마다 서로 다른 값을 가질 수가 있다. 그러나 항상 동일한 종류의 데이터를 갖고 있다.

2. OBJECTS 엔진

  ▶ 객체 문법

  #include "Objects.ch"

  (#include “npp.ch”를 해주면 npp.ch내에서 관련 .ch는 모두 불러주므로 위와 같이 별도로 할 필요는 없다.)

  CLASS <TMyClass> [ FROM <TParentClass> ]
	        DATA <DataName>
	        ...
         	METHOD <MethodName> ([<params, ....>]);
		               [CONSTRUCTOR | SETGET | VIRTUAL | BLOCK ]

  ENDCLASS

  <TMyClass>  생성하려고 하는 새로운 클래스의 이름. 10자를 초과해서는 안됨

  <TParentClass> 새로운 클래스를 상속받으려고 하는 클래스의 이름

  <DataName>  이 새로운 클래스의 객체에 대하여 우리가 갖고자 하는 데이터 요소(인스턴스 변수)의 이름들

  <MethodName> 이 객체의 메소드 이름

  <params, ….>  메소드에 전달될 인수로서의 요소 리스트(옵션)

 

  ▶ 절

  CONSTRUCTOR  객체를 초기화하고자 할 때, 그리고 레퍼런스를 자동적으로 자신에게 돌려주고자 할 때

  SETGET     이 것들은 계산된 데이터를 위한 것이며 이 메소드의 이름을 데이터같이 사용하는 것임을 의미한다.

  VIRTUAL    아무일도 안하는 메소드.

          상속에서 매우 유용한 것이며 클래스를 처음 만들고 검사할 때에도 유용

  BLOCK     매우 빠르고 코딩하기가 쉽다.

          단지 클래스 정의에 라인 중 선언을 원할 경우 이것을 사용하며, 파이브윈 클래스에서 대단히 많이 사용된다. 반드시 첫 번째 인수는 'Self'로 지정해 주어야 한다.

  INLINE    BLOCK절과 동일한 기능을 가지지만 코드 블록을 만들 필요가 없기 때문에 훨씬 사용하기 가 쉽다

         (자동적으로 생성. 이것이 더 우수한 xBase다!).

 

  ▶ 메소드 만들기

  METHOD <MethodName> ([<params, ....>]) CLASS <TMyClass>

    여기에 사용할 하나의 로컬 ‘Self'를 가지고 있다. Self:Data를 엑세스하려면 ::를 사용한다.

    즉, 클래스에서 선언된 데이터나 메쏘드를 사용하려면 ::<Data>, ::<Method()> 로 한다.

  Return < Nil, uValue, .t., .f.)

클래스 상속예제

NSAMPLES\FUN-CLASS\SOURCE\MAIN.PRG 참조

#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

NSAMPLES\FUN-CLASS\SOURCE\TFATHER.PRG 참조

#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

NSAMPLES\FUN-CLASS\SOURCE\TSON.PRG 참조

#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
 

Link categories 1

Link categories 2