본문 바로가기

공부/컴퓨터

[CURL] 클래스 만들기. 및 기본 개념 이야기

반응형
컬에서는 { } 를 이용하여 모든 메소드, 또는 명령어를 호출하게 되어 있다.


컬 클래스만든는 예제 프로그램
=======================================================================

{curl 2.0, 3.0 applet}
{curl-file-attributes character-encoding = "euc-kr"}

{define-class public Adder
  field total:int = 0
  field min:int = 0
  field max:int = 0
  
  || 디폴트 생성자로 처리
  {constructor public
    {default}
    set self.max= 20
    set self.min = 10
  }
  
  || 생성자인데 limits 라는 메소드로 생성 시킬때 초기화
  {constructor public
    {limits m1:int, m2:int}
    set self.max = m1
    set self.min = m2
  }

  {method public {add min:int,max:int} :int
    {return min+max}
  }
  |#################################
  {setter public {smax i:int}:void
    set self.max = i
  }
  {getter public {gmax}:int
    {return self.max}
  }
  {getter public {gmin}:int
    {return self.min}
  }
  ##################################|
}

{ let
    val1:Adder = {Adder}
}
{ let
    val2:Adder = {Adder.limits 0,200}
}
{ set
    val1.max=100
}
{value
    {val1.add val1.max,val1.min}
}
====================================================================




컬로 클래스 만들기
{define-class public Adder
  field total:int = 0
  field min:int = 0
  field max:int = 0

  || 디폴트 생성자 만들기.
  {constructor public
    {default}
    set self.max= 20
    set self.min = 10
  }

  || 생성자인데 limits 라는 메소드로 생성시키며 초기화
  || 매개변수는 m1 과 m2를 받아서 처리 함.
  {constructor public
    {limits m1:int, m2:int}
    set self.max = m1
    set self.min = m2
  }

  || 메소드 설정
  || 메소드 명 : add     인자 min 과 max을 받음.
  {method public {add min:int,max:int} :int
    {return min+max}
  }

}



보다시피 메소드를 실행 시킬때에는  { } 안에서 실행 시켜야 한다.
하지만 일반적인 배정문 등은 꼭 { } 안에 들어갈 필요가 없다.



{ let
  val1:Adder = {Adder}
}

let 문을 사용하면 화면에 아무것도 출력되지 않는 어떠한 수행을 할수 있다.
위와 같은 예는 val1 의 참조에 {Adder}의 아무것도 없는 생성자를 호출하여
(defalut) 객체를 만들어서 물리는 과정이다.



{ set
    val1.max=100
}
어떤 값을 넣어 줄때에는 set 명령을 이용하여 값을 배정해 준다.
여기서 max는 public 로 설정되어서.. 접속이 가능하다.

하지만.. private 등으로 설정된경우는 위와같이 접근할수 없다.

여기서 메소드를 통한 private 필드의 접근과 accessor을 이용한 접근.
두가지 방법이 있는데 그것은 다음과 같다.



{define-class public Adder
  {method public {setMinUseMethod min:int} :void
    set self.min = min

  {setter public {setMinUseSetter min:int}:void
    set self.min = min
  }

}


위와 같이 하나는 일반적인 메소드이고
하나는 Accessor 중에서 setter 을 이용한것이다.

만약 self의 min 값을 바꾸어 주고 싶다면 다음과 같이 사용해야 한다.

메소드의 경우 : { object.setMinUseMethod 10 }
setter인 경우 : object.setMinUseSetter = 10

메소드의 경우.. 일반적인 실행 법 처럼 당연히 { } 를 싸줘야하고.
매개인자로 넘어 가므로 = 을 사용할수 없다.

하지만 setter인 경우 특별한 메소드(?) 이기 때문에  배정문 처럼 사용이 가능하다.



for 문의 예제를 하나 보자면 다음과 같다.

메소드를 사용한 for 문의 예제.
{ for i = 0 to {object.size} do
  || Some Code
}

getter을 사용한 for 문의 예제
{ for i = 0 to object.size do
  || Some Code
}

보다시피 좀 더 값을 보기 쉽게 되어 있다.



내 생각이지만.. getter 과 setter은

실제로는 getter 나 setter 의 형태의 메소드를 호출하는것이지만,
특별히 값을 얻고 배정하는것이므로 { } 를 생략하고,
일반 변수의 접근 처럼 쓸수 있게 해 준것 같다.

하지만 private 변수 등을 object.size 로 바로 접근하는것은,
잘못 접근하게 될 가능성을 주는것과 같다고 느껴진다.



========== 작성중 ============
let과 set 과 value의 차이점
  let
========== 작성중 ============






컬의 최상위 클래스는 Object 이다.
( 자바와 같다. )
그러므로 모든 객체는 Object 형으로 참조 될수 있다.
하지만 Object 형 참조이므로.. 캐스팅을 시켜야 해당 객체의
메소드를 호출 할수 있게 되어 있다.


{ value
    || Assign an instance of HBox to "x".
    let x:Object = {HBox "Hello"}

    || Convert "x" to be of type HBox
    || Use the HBox.add method to add contents to "x".
    {(x asa HBox).add " World"}
    || Note that if you attempt to access the method
    || without converting "x", you generate an error.
    
    || display "x"
    x

}
반응형