코드로 세상을 지배하는 마법사

7화: Null Pointer Exception
별관측탑 북쪽 경계선은 인적이 끊긴 숲길이었다.
돌바닥 틈새로 자란 이끼 위로 바람 정령 실피가 날았다. 실피의 궤적을 따라 풀잎이 눕자 흙 속의 뿌리 정령 그루가 솟아 길을 열었다.
“이쪽입니다.”
아리엘이 북쪽 비탈면을 가리켰다. 그녀의 양어깨에 머문 두 정령은 맑은 빛을 뿜었다.
“사흘 전부터 물이 차오르는 소리가 난 곳이 바로 저 아래예요. 숲의 뿌리들이 차가운 맥박에 떨고 있었습니다.”
비탈면 끝에는 거대한 석조 아치문이 반쯤 묻혀 있었다. 수백 년 전 세워졌다가 버려진 고대 수로 입구였다. 녹슨 철창살 사이로 서늘한 바람과 함께 규칙적인 파동이 새어 나왔다.
레온이 양피지 뭉치를 안고 쫓아왔다.
“대마법사님! 제국령 관측 일지를 다시 확인했습니다.”
“내용이 무엇인가?”
“어제 백 발의 화염구 투사 직후 제국 서부 사령부에 비상 경보가 울렸습니다. 방출량이 기준치의 스무 배를 넘었습니다.”
“그 정도 파동이라면 감찰대가 움직였겠군.”
“지하 7층 암흑 마력도 포착되어 황실 감찰기사단이 출동했다는 기록이 있습니다.”
레온의 말이 끝나기가 무섭게 숲 저편에서 쇠발굽 소리가 대지를 흔들었다.
쿠구구궁!
나무 틈새로 은빛 갑주를 입은 기마병 대열이 쏟아져 나왔다. 선두의 기사는 감찰대 망토를 둘렀고 흉갑의 푸른 마력석이 번뜩였다.
“거기 멈춰라!”
선두의 기사가 고삐를 당기며 호통쳤다. 뺨에 깊은 흉터를 지닌 사내의 눈빛이 사납게 빛났다.
“제국 공인 A급 감찰기사 베르너다. 전원 무릎을 꿇어라!”
레온의 얼굴이 하얗게 질렸다.
“A급 감찰기사 베르너……? 서부 전선에서 요새를 도륙했다는 도살자가 왜 여기에…….”
베르너는 허리춤의 강철 대검을 잡으며 두 사람을 훑었다.
“미등록 엘프 정령사에 암흑 마수 파동, 게다가 군단급 화염 폭발까지 일어났다. 대마법사 엘리언, 기어이 반역을 꾀하는 것이냐?”
아리엘이 지팡이를 쥐고 앞을 막아섰다.
“선생님은 숲의 오류를 고쳐 주셨을 뿐입니다! 제국이 관측탑을 함부로 수색할 권리는 없어요!”
“건방진 계집이 입을 놀리는구나.”
베르너가 차갑게 비웃었다.
“황실 영토의 마력은 제국의 통제를 받는다. 9서클이라 한들 황제 앞에서는 신민이지. 저 계집을 포박하고 봉인 구역을 수색하겠다. 저항하면 즉결 처형이다.”
베르너의 흉갑에서 뿜어져 나온 푸른 마력이 대검으로 흘러들었다.
서걱!
대검을 뽑아 드는 동작만으로도 대기가 갈라지며 섬뜩한 마찰음이 일었다. 고밀도의 순수한 오라가 검날을 감싸며 푸른 화염처럼 피어올랐다.
“물러서라, 아리엘.”
엘리언이 나직하게 말했다.
“하지만 선생님, 저자의 오라는 정령들의 숨결까지 찢어 버릴 만큼 위험해요!”
“알고 있다. 그러니 네가 나설 필요는 없다.”
엘리언은 천천히 걸어 나갔다. 붕대가 감긴 오른손이 로브 밖으로 드러났다.
베르너가 조소했다.
“지근거리에서 A급 기사의 오라를 마주하면 고깃덩이에 불과하지. 네놈의 마법이 내 검보다 빠른지 볼까?”
베르너의 신형이 흐려졌다.
콰앙!
발밑의 암반이 터져 나가며 베르너가 탄환처럼 쇄도했다. 대검을 휘두르는 궤적을 따라 거대한 초승달 모양의 검기가 뿜어져 나왔다.
“파쇄참(破碎斬)!”
대지를 가르며 날아드는 푸른 검기는 폭이 5미터에 달했다. 닿는 모든 장벽을 베어 넘길 파괴력이었다.
“대마법사님!”
“선생님, 피하세요!”
레온과 아리엘의 외침이 터져 나왔다.
그러나 엘리언은 물러서지 않았다. 피하려는 기색조차 없었다. 그의 눈동자에 푸른빛 대신 차가운 은빛 기호들이 떠올랐다.
‘디버그 모드, 활성화.’
순간 엘리언의 시야 속에서 세상이 극단적으로 느려졌다.
돌풍에 흩날리는 흙먼지, 대검을 내리꽂는 베르너의 근육 팽창까지 정지 화면처럼 굳어졌다. 날아오는 푸른 검기 표면 위로 데이터 문자열이 펼쳐졌다.
AuraBlade strike = new AuraBlade();strike.source = Werner.Core;strike.velocity = 180.0;strike.value = 5200;strike.target = Elian;strike.executeImpact();
일반적인 마법사는 방어막의 마나를 높여 5200의 수치를 막으려 든다. 하지만 그것은 극심한 낭비였다.
엘리언의 시선이 핵심 연산식에 닿았다.
strike.value = 5200;strike.executeImpact();
검기는 물리 엔진에 의해 실체 객체로 생성된다. 충돌 순간 executeImpact()가 호출되며 strike.value에 담긴 수치를 물리 피해로 변환하는 구조였다.
그렇다면 계산의 기준이 되는 참조값이 애초에 존재하지 않는다면 어떻게 될까?
엘리언은 오른손가락을 세웠다. 은빛 마력선이 뻗어 나가 검기 객체의 중심부를 찔렀다. 이번 수정은 단 한 줄이었다.
strike.value = null;
파괴력을 깎아내는 것이 아니라 데이터 필드 자체의 주소값을 비워 버렸다.
시간이 원래 흐름을 되찾았다.
콰아아아!
거대한 검기가 엘리언의 코앞 10센티미터 거리까지 짓쳐들었다. 베르너의 입가에 잔혹한 미소가 번졌다.
지직!
허공에 붉은 콘솔 에러가 번쩍였다.
[Exception in thread "CombatEngine.Physics": NullPointerException]Cannot read field "value" because "strike.value" is null[Terminating unhandled process: strike instance discarded]
타오르던 5미터 크기의 푸른 검기가 그 순간 거짓말처럼 허공으로 증발했다.
폭발음도 없었다. 마력 파편도 튀지 않았다. 분필로 그린 낙서를 마른걸레로 훔쳐낸 것처럼 아무런 흔적도 남지 않았다.
쉬이익.
베르너의 대검이 텅 빈 허공을 가르며 바닥으로 처박혔다.
콰창!
단단한 암반에 대검이 박히며 불꽃이 튀었다. 베르너는 넋이 나간 얼굴로 텅 빈 허공을 응시했다. 엘리언은 옷자락 하나 구겨지지 않은 채 단정하게 서 있었다.
“……어?”
베르너의 입에서 멍청한 신음이 새어 나왔다.
“내, 내 검기는? 어디로 갔지?”
허공에 흩어진 잔여 마력조차 없었다. 세상의 법칙에서 검기라는 현상 자체가 삭제된 것 같았다.
뒤편의 레온과 아리엘 역시 얼어붙었다.
“방어벽도 안 세우셨는데…… 그냥 사라졌어?”
“마력을 깬 게 아니에요. 흩어지는 기운조차 없었습니다.”
아리엘의 목소리가 떨렸다.
베르너는 치솟는 수치심과 공포에 얼굴을 일그러뜨렸다.
“사악한 눈속임을 쓴 게 분명해!”
베르너는 대검을 뽑아 올렸다. 흉갑의 마력석이 붉게 달아오르며 전신에서 푸른 오라가 폭풍처럼 일었다.
“제국 오의, 삼연단층참(三連斷層斬)!”
베르너의 검신이 세 번 연속으로 허공을 갈랐다. 가로, 세로, 대각선. 세 줄기의 압도적인 참격이 교차하며 거대한 파괴의 그물을 엮었다.
엘리언은 손가락을 가볍게 튕겼다.
이번에는 연속 배열에 담긴 세 개의 공격 객체였다.
for (AuraBlade blade : werner.comboChain) { blade.value = null;}
지직!
공중에서 붉은 스파크가 연달아 튀었다.
[NullPointerException][NullPointerException][NullPointerException]
세 줄기의 푸른 참격망이 엘리언의 발치에 닿기도 전에 허무하게 꺼져 버렸다.
툭.
바람조차 일지 않았다. 숲속에는 거친 숨을 몰아쉬는 베르너의 헐떡임만 감돌았다.
“허억…… 헉…… 끄으윽……!”
베르너는 다리에 힘이 풀려 주저앉았다. 전신의 마력을 모조리 쏟아부은 필살이었다. 그런데 상대는 손가락 하나 움직였을 뿐인데 모든 공격이 허공 속으로 사라졌다.
“너…… 대체 무슨 짓을 한 거냐?”
베르너의 턱이 덜덜 떨렸다. 공포가 그의 오만한 눈빛을 집어삼켰다.
엘리언은 천천히 베르너를 향해 다가갔다.
“사술이 아니다. 너는 존재하지 않는 값을 불러와 명령을 실행하려 했다. 결과는 당연히 예외 발생과 처리 중단이다.”
“무슨…… 말도 안 되는……!”
베르너가 떨리는 손으로 대검을 쥐려 했다.
스으윽.
엘리언의 발밑에서 짙은 암흑이 일렁였다. 거대한 날개를 펼친 그림자 가고일이 모습을 드러냈다. 3미터가 넘는 마수의 살기가 감찰대 병사들의 숨통을 틀어쥐었다.
가고일의 육중한 발톱이 베르너의 어깨 흉갑을 내리눌렀다. 쩌적 하는 소리와 함께 강철 갑주가 찌그러졌다.
“히익!”
베르너는 대검을 내던지며 바닥에 무릎을 꿇었다.
엘리언은 베르너의 흉갑 중앙에 새겨진 문장을 내려다봤다. 디버그 시야 속에서 내부의 회로가 드러났다.
[Item: Imperial Knight Insignia][Node Auth: Imperial_Network_Sector_04][Status: Connected / Ping: Active]
엘리언의 눈빛이 가늘어졌다.
제국 기사단의 오라 코어와 장비 인증은 중앙 네트워크의 관리를 받고 있었다. 베르너의 가슴에 박힌 마력석은 4구역 서버망과 연결된 단말 노드였다.
엘리언이 싸늘한 목소리로 말했다.
“황도에 있는 네 상관들에게 전해라.”
베르너가 핏발 선 눈으로 고개를 들었다.
“별관측탑은 시스템을 점검 중이다. 다시 한 번 무례한 호출로 내 작업을 방해한다면 그때는 검기뿐만 아니라 검을 쥔 손의 좌표까지 지워 버리겠다.”
“으, 으으…….”
“물러나라.”
가고일이 발톱을 거두자 베르너는 허겁지겁 대검을 챙겨 말에 올랐다.
“후퇴하라! 즉시 철수한다!”
감찰대 병력은 숲길 저편으로 달아났다. 숲에는 다시 정적이 찾아왔다.
레온이 가슴을 쓸어내렸다.
“살았습니다……. 저 A급 기사를 피 한 방울 안 흘리고 쫓아내시다니…….”
아리엘은 엘리언을 경이로운 눈으로 올려다봤다.
“선생님. 방금 것은 방어 마법이 아니었지요?”
“그렇다. 방어할 가치도 없는 공격이었다.”
엘리언은 손등의 붕대를 고쳐 매며 말했다.
“모든 현상은 실행되기 위한 데이터가 필요하다. 그 연결 하나만 끊어 내면 거대한 파괴력도 허상에 불과하다.”
아리엘의 눈동자에 깊은 감탄이 어렸다. 그녀는 정령을 다루는 자신의 손을 내려다보며 스승의 말을 되새겼다.
엘리언은 흙에 묻힌 고대 수로의 철창살을 바라봤다. 베르너의 흉갑에서 감지되던 네트워크 신호와 수로 안쪽의 맥박이 완벽하게 일치하고 있었다.
route -> Imperial_Network_Sector_04
철창 틈새로 푸른빛의 데이터 선들이 지하 깊은 곳을 향해 뻗어 나가고 있었다.
“길이 열렸다.”
엘리언이 손짓하자 가고일이 발톱으로 수로의 철창을 뜯어냈다.
쿵!
어두운 지하 수로의 통로가 세 사람 앞에 입을 벌렸다.
그들은 망설이지 않고 푸른 맥박이 요동치는 어둠 속으로 발걸음을 옮겼다. 세계를 지탱하는 거대한 네트워크의 심장부를 향한 진짜 탐색이 시작되고 있었다.