본문 바로가기

[ C/ C++ 프로그래밍 ]/[ 루아 ]

[ 루아 ] 클래스

ㅇ 테이블과 클래스
루아는 명시적으로 'class'라는 형태를 지원하지 않는다. 그러나 클래스를 지원하는 것처럼 그 기능이나 형태를 비슷하게 흉내를 낼 수 있다.  ==> 루아는 클래스를 반만 지원
이것은 테이블과 매우 밀접한 관련이 있다.

테이블은 객체이다. 그리고 클래스의 인스턴 역시 객체이다. 클래스의 객체를 생각해 보면 객체는 자기 자신에 상태값을 유지할 수 있다.
또한 자신의 상태값을 조작하기 위해 자기 자신의 함수를 가지고 있다. 이것을 메소드(method)라고 부른다.
테이블도 이런 기능을 가지고 있다. 그래서  테이블을 이용해 클래스를 구현해 낼 수 있다.





'테이블.함수명(..)' ==> 함수의 정의 이다.  '테이블:함수명()'도 가능하다. 그렇지만 '.'와 ':'는 완전히 같은 것은 아니다. 자세한 것은 뒤에 설명

클래스는 동전을 찍어내는 금속틀 처럼 '틀'과 같은 것이다.
다른 언어에서는  클래스를 정의하고 클래스를 직접 사용하는 것이 아니라 클래스를 인스턴스화 해서 나온 결과물을 사용한다.
마치 금속틀을 사용하는 것이 아니라, 그것에 의해 찍혀진 동전을 사용하듯 한다.

이런 의미에서 보면, 실은 루아의 클래스는 꼭 같은 경우가 아니다. 왜냐하면 루아의 클래스는 클래스 그 자체가 이미 객체 이기 때문이다. 
일종의 프로토타입(porotype)을 만들어주는 것이라고 이해하면 될것이다. 먼저 사용할 객체를 만들고 그것과 같은 다른 테이블을 생성해서, 그 객체를 사용하는 것이기 떄문이다.
그래서  위 예제에서 구현한 'Trianglr'이 클래스라면 아래와 같이 형태로 사용이 가능해야 하는 것이다.

 ObjTriangle = Triangle
 Triangle = nil
 Objtriangle.print()

하지만 위의 실행 결과는 에러가 발생한다. 이는 위에 작성한 것은 Triangle이란 객체에 국한된 코드인데, 이 객체를 제거(nil)에 함수에서 처리되지 못하기 떄문이다.
Triangle에 국한된 코드를 예를 들어 말하면 

 function Triangle.set(agWidth, agHeight)
    Triangle.widh = agWidth
    Triangle.height = afHeight
 end

 이렇게 되어 있기 때문이다. ObiTriangle = Triangle을 해주어도 코드 내용안에는 Traingle 객체에 적용된 코드가 있기 떄문이다.
그래서 자기 자신의 맴버변수에 접근할  경우 C/C++ 같은 경우 클래스 내에서 this 포인터를 사용한다. 그렇지만 루아에서는 self를 사용한다. 위의 코드를 다시 고쳐보면

 function Triangle.set(agWidth, agHeight)
    self.widh = agWidth
    self.height = afHeight
 end

이렇게 하면 앞에서 우리가 원했던

 ObjTriangle = Triangle
 Triangle = nil
 Objtriangle.print()

명령이 올바르게 처리가 된다?

아마 이렇게 해도 에러가 발생할것이다. self가 들어가는 함수를 '.' 이 아니라 ':"로 선언하면  function Triangle:set(agWidth, agHeight) 에러가 발생하지 않는다.
그이유는   함수의 선언에 '.'를 사용한것은 객체가  무엇인지 알기 위해서는 매개변수에 self를 명시 해주어야 한다(뒤의 예제 Triangle.print() 함수 선언을 참고
함수의 선언에 ':"를  사용한 함수는 매개 변수에 self를 생략가능하다.
이것은 함수의 선언뿐만 아니라 함수의 호출부분에서도 마찬가지이다.




이로써 클래스로써의 기본 형태는 갖추었다.


출처 및 참고 : 예제로 배우는 프로그래밍 루아

'[ C/ C++ 프로그래밍 ] > [ 루아 ]' 카테고리의 다른 글

[ 루아 ] 클래스 캡슐화  (1) 2010.07.22
[ 루아 ] 클래스 상속  (1) 2010.07.22
[ 루아 ] 테이블의 활용과 자료 구조  (1) 2010.07.21
[ 루아 ] 테이블  (1) 2010.07.20
[ 루아 ] 함수  (0) 2010.07.20