주요 자바 API를 C++ 코드로 바꿔보기.
civa.CivaDef ¶
~cpp 
#ifndef CIVA_CIVADEF_INCLUDED
#define CIVA_CIVADEF_INCLUDED
#include <boost/smart_ptr.hpp>
namespace civa { namespace io {
using boost::shared_ptr;
class Serializable;
typedef shared_ptr<Serializable> Serializable_Handle;
}} // namespace civa::io
namespace civa { namespace lang {
using boost::shared_ptr;
template<typename ElementType> class Array;
//#define Array_Handle(ElementType) boost::shared_ptr< civa::lang::Array<ElementType> >
//template<typename ElementType> typedef shared_ptr< Array<ElementType> > Array_Handle;
typedef shared_ptr< Array<char> > charArray_Handle;
class CharSequence;
typedef shared_ptr<CharSequence> CharSequence_Handle;
class Comparable;
typedef shared_ptr<Comparable> Comparable_Handle;
class Object;
typedef shared_ptr<Object> Object_Handle;
class String;
typedef shared_ptr<String> String_Handle;
}} // namespace civa::lang
#endif // CIVA_CIVADEF_INCLUDED
분석 & 잡담 ¶
- 클래스들이 서로 맞물려서 결국 따로 빼게 되었군.
 
- 파라메터라이즈 typedef 은 컴파일이 안되네.. 으으 Array 쓸땐 길게 다 써줘야하나..
 
- 매크로는 쓰기 싫은데.
 
 
civa.io.Serializable ¶
~cpp 
#ifndef CIVA_IO_SERIALIZABLE_INCLUDED
#define CIVA_IO_SERIALIZABLE_INCLUDED
#include "../lang/Object.h"
namespace civa { namespace io {
class Serializable {
};
}} // namespace civa::io
#endif // CIVA_IO_SERIALIZABLE_INCLUDED
분석 & 잡담 ¶
- 인스턴스 생성 못하게 막아줘야 하나.
 
 
civa.lang.Array ¶
~cpp 
#ifndef CIVA_LANG_ARRAY_INCLUDED
#define CIVA_LANG_ARRAY_INCLUDED
#include "Object.h"
namespace civa { namespace lang {
template<typename ElementType>
class Array : public Object {
  private:
	ElementType* values;
	int length;
  public:
	Array(int length) throw() : length(length) {
		// 바운드 체크.
		values = new ElementType[length];
	}
	Array(ElementType newValues[]) {
		// 배열의 크기가 이게 맞나...
		length = sizeof(newValues) / sizeof(ElementType);
		values = new ElementType[length];
		for (index = 0; index < length; index++) {
			values[index] = newValuse[index];
		}
	}
	ElementType operator[] (int index) throw() {
		// 바운드 체크.
		return values[index];
	}
	const ElementType operator[] (int index) const throw() {
		// 바운드 체크.
		return values[index];
	}
	size_t getLength() {
		return length;
	}
  public:
	~Array() {
		delete[] values;
	}
};
}} // namespace civa::lang
#endif // CIVA_LANG_ARRAY_INCLUDED
분석 & 잡담 ¶
- 바운드 체크해서 익셉션 던지는거 해야하고,
 
- 배열의 크기 알아내는 법 조사.
 
 
civa.lang.CharSequence ¶
~cpp 
#ifndef CIVA_LANG_CHARSEQUENCE_INCLUDED
#define CIVA_LANG_CHARSEQUENCET_INCLUDED
#include "Object.h"
namespace civa { namespace lang {
class CharSequence {
  public:
	virtual int length() = NULL;
	virtual char charAt(int index) = NULL;
	virtual CharSequence_Handle subSequence(int start, int end) = NULL;
	virtual String_Handle toString() = NULL;
};
}} // namespace civa::lang
#endif // CIVA_LANG_CHARSEQUENCET_INCLUDED
분석 & 잡담 ¶
- 추상클래스니 인스턴스는 생성 안되겠군.
 
 
civa.lang.Comparable ¶
~cpp 
#ifndef CIVA_LANG_COMPARABLE_INCLUDED
#define CIVA_LANG_COMPARABLE_INCLUDED
#include "Object.h"
namespace civa { namespace lang {
class Comparable {
  public:
	virtual int compareTo(Object o) = NULL;
};
}} // namespace civa::lang
#endif // CIVA_LANG_COMPARABLE_INCLUDED
분석 & 잡담 ¶
civa.lang.Object ¶
~cpp 
#ifndef CIVA_LANG_OBJECT_INCLUDED
#define CIVA_LANG_OBJECT_INCLUDED
#include "../CivaDef.h"
namespace civa { namespace lang {
class Object {
  public:
	void getClass() {/*차후 추가 Class getClass()*/}
	virtual int getHashCode() {
		return reinterpret_cast<int>(this);
	}
	virtual bool equals(Object_Handle obj) {
		return (this == obj.get());
	}
	virtual String_Handle toString() {
		/*차후 추가*/
		//return getClass().getName() + "@" + Integer.toHexString(hashCode());
	}
	void notify() {/*차후 추가*/}
	void notifyAll() {/*차후 추가*/}
	void wait(long timeout) throw() {/*차후 추가*/} //InterruptedException
	void wait(long timeout, int nanos) throw() { //InterruptedException
		if (timeout < 0) {
			throw ;//new IllegalArgumentException("timeout value is negative");
		}
		if (nanos < 0 || nanos > 999999) {
			throw ;//new IllegalArgumentException("nanosecond timeout value out of range");
		}
		if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
			timeout++;
		}
		wait(timeout);
	}
	void wait() throw() { //InterruptedException
		wait(0);
	}
  protected:
	virtual Object_Handle clone() throw() {
		throw ; //CloneNotSupportedException
		//으음. 클론에이블 인터페이스 구현여부를 어떻게 판단하지 -_-;;
		return Object_Handle(new Object(*this));
	}
	virtual void finalize() throw() {/*아무것도 안함*/ } //Throwable
  public:
	virtual ~Object() {}
};
}} // namespace civa::lang
#endif // CIVA_LANG_OBJECT_INCLUDED
분석 & 잡담 ¶
- 일단 시작... 멀티쓰레드 관련 메소드와 클래스는 못할 듯. 과연 어디까지 할라나...
 
- wait 메소드의 저 사기 나노세컨을 보라.  왜 만든거지, 미래의 대비인가... 왜 만든거지, 미래의 대비인가...
 
- C++ 에서 throw 타입을 고정시킬 수 있나...
 
- 메소드 오버라이딩 금지 시킬 수 있나..
 
 
civa.lang.String ¶
~cpp 
#ifndef CIVA_LANG_STRING_INCLUDED
#define CIVA_LANG_STRING_INCLUDED
#include "Object.h"
#include "../io/Serializable.h"
#include "Comparable.h"
#include "CharSequence.h"
#include "Array.h"
namespace civa { namespace lang {
class String
: public Object, civa::io::Serializable, Comparable, CharSequence {
  private:
	/** The value is used for character storage. */
	charArray_Handle value;
	/** The offset is the first index of the storage that is used. */
	int offset;
	/** The count is the number of characters in the String. */
	int count;
	/** Cache the hash code for the string */
	int hash;
  public:
	String() : hash(0) {
		value = charArray_Handle(new Array<char>(0));
	}
};
}} // namespace civa::lang
#endif // CIVA_LANG_STRING_INCLUDED












