더북(TheBook)

MemberVariable 객체의 GetOffset() 멤버 함수를 호출하면 주어진 객체의 데이터에서 멤버 변수의 위치를 가리키는 포인터를 계산할 수 있다. 이후 switch 문에서 GetPrimitveType()에 따라 분기하여 이 포인터 값을 적절한 자료형으로 캐스팅한 다음 Serialize() 함수에 넘겨 실제 직렬화 처리를 수행한다.

MemberVariable 클래스의 메타 정보를 확장하면 더 강력한 리플렉션을 구축할 수 있다. 예를 들어 각 변수의 정보를 생성할 때 사용할 비트 수도 지정하게 하고 그 값에 따라 자동으로 비트 압축을 처리하는 식이다. 추가로 엔트로피 인코딩도 지원하고 싶다면 멤버 변수의 기댓값을 지정할 수 있게 확장하는 것도 가능하다.

대체로 이와 같은 방법은 수행 성능을 약간 희생하여 유지보수를 편하게 하는 기법이라 하겠다. 개발 공정에는 여러 병목이 있기 마련이지만, 이러한 기법을 도입하면 조금이라도 코드를 작성하고 관리하는 노력을 줄일 수 있어 결과적으로는 오류가 덜 발생하게 된다. 부가적인 장점은 리플렉션 시스템이라는 게 비단 네트워크 직렬화 말고도 써먹을 데가 많다는 점이다. 예를 들어 디스크에 저장할 때나 가비지 컬렉션, GUI 편집기 등을 구현할 때도 도움이 된다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.