게임에서의 마법 하나하나를 만들거나 고칠 때마다 코드를 수정하고 컴파일과 빌드를 거치기에는 반복이 너무 비효율적이다. 이럴 때, 코드를 수정하는 대신 코드는 특정 데이터를 읽게 하고, 데이터를 만들어서 반복을 수행하면 훨씬 효율적일 것이다. 행동을 데이터 파일에 따로 정의해놓고 게임 코드에서 읽어서 실행할 수 있다면 많은 장점이 있다. 데이터를 정의하기 위해 어떻게 할 것인가? 인터프리터 패턴 을 통해 데이터를 만들 수도 있겠다. 그러나, 인터프리터 패턴은 너무나도 느리고 메모리를 많이 소비한다. 더 빠른 수단을 찾아보자. 극단적으로 생각해보면, 기계어가 가장 빠를 것이다. 기계어의 장점. 밀도가 높으며, 선형적이고, 저수준이며, 그러므로 빠르다. 그러나 데이터를 기계어로 짜게하는 것은 어불성설이다. 대신 가상 기계어를 정의하면 어떨까? 그리고 그 가상 기계어를 실행하는 간단한 에뮬레이터도 만든다면? 이 가상 기계어는 게임에서 완전히 제어할 수 있으며, 밀도가 높고 선형적이고 상대적으로 저수준이다. 이 에뮬레이터를 가상 머신 이라 하고, 가상 기계어를 바이트 코드 라 하자. 바이트코드 패턴을 사용하면 좋은 경우 언어가 너무 저수준이라 만드는 데 손이 많이 가거나 오류가 생기기 쉽거나 컴파일 시간이나 다른 빌드 환경 때문에 반복 개발하기가 너무 오래 걸리거나 정의하려는 행동을 나머지 코드로부터 격리하고자 할 때 네이티브 코드보다는 느리므로 성능이 민감한 곳에 사용하지는 말자. 만드려는게 일종의 API라고 생각하면 좀 더 접근하기 쉬울 것이다. 마법 데이터를 만드는 예제를 통해 알아보겠다. 마법은 명령어 집합으로 생각한다. 그리고 그 명령어는 열거형 값을 배열에 저장해 데이터로 인코딩한다. 한 바이트로 전체 열거형 값을 다 표현할 수 있다. 데이터를 구성하는 코드가 실제로는 이런 바이트들의 목록이다보니 바이트코드라 부른다. 명령 하나를 실행하려면 어떤 명령인지 보고 이에 맞는 API메서드...