게임 중독에 빠졌던 내 어린 시절

내가 게임을 처음 접하게 된 건 초등학교 저학년 때, 동네 오락실을 통해서였다. 보글보글(Bubble Bubble), 너구리, 그리고 시티 커넥션(City Connection) 등을 했었다 (시티 커넥션의 배경음악으로 차이코프스키의 피아노 협주곡 1번이 쓰이는데, 그 음악이 좋아 한동안 차이코프스키를 좋아했었다). 동생은 운동을 즐겨서 시간 나면 밖에 나가 친구들과 야구를 했지만, 나는 시간만 나면 무조건 오락실로 향했다. 한 판에 20원, 30원, 50원 하는 그 게임들이 나를 행복하게 했다.

당시 큰 인기를 끌었던 게임, 보글보글 (Bubble Bubble)

오락실에서 몇 시간이고 눈이 빨개지도록 정신 팔려 있으면 어머니는 어김없이 내가 거기 있는 것을 알고 찾아왔고, 집에 가면 눈물이 나도록 혼이 났다. 그래도 소용 없었다. 눈만 감으면 캐릭터들이 나타나 머리속에 빙빙 돌았기 때문에 나는 다음 날이면 또 오락실에 가야 했다.

나는 그렇게 게임에 중독되었다. 하루에 백원밖에 안되는 용돈으로는 두세 판 하고 나면 끝이었다. 돈을 벌기 위해 동네 공사장이나 들판을 돌아다니며 빈 병을 주웠다. 한시간 노동으로 수십 병을 수퍼마켓에 가져다 주면 몇십 원을 벌 수 있었다. 그걸로 곧장 친구들과 오락실로 향했다.

돈이 떨어지고, 병 줍기도 시들해지자 나는 집 안에 보이는 돈을 가져가기 시작했다. 식탁이든, 화장대이든 천원 짜리가 보이면 그걸 주워 오락실로 향했다. 그것이 도둑질이라는 것도 자각하지 못한 채..

초등학교 저학년에 게임을 하기 위해 돈을 훔치는 나를, 어머니는 어떤 심정으로 보고 계셨을까? 그 돈을 가져가 오락실에서 게임을 하고 있던 어느 날이었다. 갑자기 등 뒤에서 서늘한 느낌이 들었다. 어머니가 와서 슬픈 표정을 하고 나를 가만히 보고 계셨다. 난 엄청나게 혼이 날 각오를 하고, 그리고 아버지에게 매 맞을 각오를 하고 집에 돌아갔다. 웬일인지 나를 혼내는 대신 어머니는 그냥 우셨다. 우는 어머니를 달래며 아버지가 나에게 차분하게 이야기를 했다. 그것이 얼마나 나쁜 짓인가를. 왜 내가 그 중독에서 벗어나야 하는가를.

그 후로 다시는 집에 있는 돈을 가져가지 않았다. 하지만, 게임을 그만두는 대신 나는 아버지를 설득하기로 했다. 게임이 얼마나 재미있는지, 그리고 창의적인 놀이인지를 알면 어쩌면 아버지랑 같이 게임을 할 수도 있겠다는 생각이 들었다. 다음날, 아버지와 함께 오락실에 갔다. 그런 게임을 처음 보는 듯 아버지는 미소를 띠고 신기해하며 내가 게임하는 것을 보셨다. 아버지가 관심을 보이자 난 신이 나서 게임에 대해 설명하기 시작했다. 게임의 목적이 무엇인지, 한 스테이지를 달성하면 무슨 일이 일어나는지, 아이템을 먹으면 어떤 새로운 능력이 생기는 지 등을 말이다. 그리고 한 번 해보시라고 권하며 자리를 드렸다. 아버지는 결국 게임을 직접 하지는 않았지만, 30분 후에 나는 적어도 뿌듯하게 아버지의 손을 잡고 집으로 돌아왔다. 나만 알고 있는, 내가 빠져 있는 이 세계를 아버지도 이제 조금은 이해하게 되지 않을까? 게임이 무조건 부정적인 것만은 아니라는 것을 아시면 가서 게임을 하라고 돈을 주시지 않을까? 사실 게임을 하러 갈 때마다 부모님이 싫어하는 일을 한다는 죄책감이 마음 가득했는데, 적어도 아버지에게 그 세계를 보여드리고, 아버지가 그렇게 나쁘게만 생각하지는 않는다고 느끼게 되자 죄책감이 사라졌고 마음이 한결 가벼워졌다.

그 사건이 있은 이후로 적어도 시간을 조절하는 능력이 생겼다. 게임을 하고 싶으면 당당하게 아버지에게 물어봤고, 아버지와 일종의 ‘딜’을 했다. 내가 착한 일을 했거나, 숙제를 다 해놓았다는 것을 증명한 후에 30분에서 1시간 정도의 자유 시간과 함께 약간의 용돈을 받아 오락실에 갔다 왔다. 그 시간에 오락실에 가 있다는 것을 부모님이 아셨기 때문에 돈을 다 쓰거나 시간이 초과되면 바로 중단하고 집에 돌아왔다.

이듬 해가 되자, 친구들이 게임기를 소유하기 시작했다. 당시 ‘재믹스’라는 게임기가 인기 있었다. 난 친구 집에 놀러간다고 이야기하고 가서 게임을 한없이 하기 시작했다. 이제 용돈을 받지 않아도 되었고, 오락실에서 내 차례를 기다릴 필요도 없었다. 곧, 우리 집에도 게임기가 있었으면 좋겠다고 생각해서 부모님을 조르기 시작했다. 그렇지만 부모님은 내가 아무리 졸라도 쉽게 허락해주지 않았다. 난 결국 틈이 나면 친구네 집에 가서 게임을 했다. 내가 가장 좋아했던 게임은 ‘왕가의 계곡’이었다.

재믹스로 즐겨 했던 게임, '왕가의 계곡 (King's Valley)'

초등학교 4학년이 되어서도 게임을 손에서 놓지 못하는 나를, 어머니는 수년간 어찌하지를 못한 채 안타까워하고 계셨다. 그 때였다. 어머니가 그 문제를 상담하기 위해 내 담임선생님을 찾아가신 것은. 내 담임선생님은, 한가지 해결책을 어머니에게 제시해 주셨다 (이 사실은 한참 후에 들어서 알았다).

“컴퓨터 학원에 등록시켜 보세요.”

당시 피아노 학원, 미술 학원과 더불어 유행처럼 컴퓨터 학원이 동네에 많이 생겼다. 어머니는 담임선생님의 말을 믿고 나를 컴퓨터 학원에 데려가셨다. 한 달에 몇 만원이나 하는 학원비가 가볍지는 않았을 것이다. 내가 컴퓨터 학원에 처음 들어갔던 순간을 잊지 못한다. 방 안에 신기한 물건이 가득했다. 녹색 모니터에 영어 글자와 숫자들이 잔뜩 떠 있었는데, 하나 하나가 나를 기다리는 선물 상자처럼 느껴졌다. 여기 저기 ‘컴퓨터 베이직(BASIC)’이라는 책이 보였다. 들쳐보니 ‘삼각 함수’라며 사인, 코사인 함수들에 대해 설명하고 있었는데 (물론 그 때는 그게 뭔지 전혀 몰랐다), 그것을 이용해 다양한 그래프를 그릴 수 있다는 것이 마냥 신기하게 느껴졌다. 변수, 함수, 배열, .. 이런 새로운 용어들도 너무 새로웠고, 나는 곧 컴퓨터라는 새로운 장난감에 극도로 호기심이 생겼다. 어머니는 ‘베이직 3개월 완성’ 과정을 등록해 주셨다.

그렇게 BASIC이라는 컴퓨터 언어를 배우기 시작했다. 너무나 재미있었다. 게임 대신 나는 프로그래밍에 중독되었고, 그러면서 어머니의 걱정도 사라져갔다. 6개월쯤 배워서 컴퓨터에 뭔가 ‘명령’을 시킬 수 있게 되고 나자, 나는 뭔가를 직접 만들어 보고 싶어졌다. 당시 학원에서 가장 실력이 좋던 친구가 자기가 만든 게임이라며 나에게 슈팅 게임을 보여주었는데, 그걸 보니 질투도 났고, 나도 해보고 싶었고, 나도 못할 리 없다는 생각도 들었다. 그 친구가 만든 소스 코드를 보여달라고 졸랐다. 다는 보여주지 않았지만, 적어도 ‘방향 키 또는 스페이스 바를 입력했을 때 그 키를 처리해서 왼쪽, 오른쪽, 위, 아래로 캐릭터가 움직일 수 있게 하는 코드’는 보여주었다. 난 그 코드를 참고해서 게임을 만들기 시작했다. 그렇게 빠져서 며칠이 지나, 난 나만의 ‘슈팅 게임’을 완성했다. 기억을 더듬어 보면 아래와 같이 아주 단순한 게임이었다.

베이직(Basic)으로 만든 슈팅 게임

이 게임을 완성하고 나서 친구들에게, 동생에게, 그리고 부모님에게 보여주며 얼마나 뿌듯해했는지 모른다. 랜덤하게 위쪽에서 적들이 등장하고, 내가 미사일을 쏘아 맞추면 하나씩 사라졌다. 그리고 한 대 맞을 때마다 점수가 올라갔다. 적들도 나에게 미사일을 쏘았다. 가끔 그래픽이 제대로 처리되지 않거나 총을 쏴도 맞지 않는 등 약간의 문제가 있었지만, 그래도 괜찮았다. 오락실에서 남이 만든 게임만을 하다가, 내가 직접 게임을 만들 수 있게 된 것이다!

이제 집에 컴퓨터가 필요했다. 더 알고 싶었고 더 배우고 싶었다. 초등학교 5학년이 되어, 컴퓨터를 사달라고 졸랐다. 정확히 기억나지는 않는데 아마 컴퓨터를 사 주면 공부를 열심히 할 것이라고 약속했던 듯 하다. 아버지는 당시로서는 거금이었던 72만원을 들여 컴퓨터를 사 오셨다. 내가 바란 것은 MSX-II 라는, 칼라 화면에 게임 팩만 꽂으면 곧바로 게임을 시작할 수 있는, 당시 친구들이 많이 가지고 있었던 컴퓨터였지만, 아버지는 MSX-II는 게임기에 가깝고, 진짜 컴퓨터라고 볼 수 없다는 동료의 말을 듣고, 못생긴데다 흑백 모니터였고 게임 팩 대신 5.25인치 플로피 디스켓을 꽂아야 하는 IBM XT라는 컴퓨터를 사오셨다. 그게 더 ‘오래 쓸 수 있는’ 것이라면서.

나의 첫 번째 컴퓨터, IBM XT (출처: Wikipedia)

실망스러웠지만 그래도 좋았다. 어쨌든 나만의 컴퓨터가 생긴 것이다! 컴퓨터를 자유 자재로 다루고 싶어 MS-DOS (당시의 운영체제) 책을 샀고, 두꺼운 BASIC 프로그래밍 책도 샀다. MS-DOS 책은 맨 처음부터 끝까지 몇 번을 봤고, 거기 있는 명령어를 거의 다 익혔다. 파일을 복사하고, 디렉토리를 만들고, 텍스트 파일을 편집하고, 파일의 속성을 변경하는 기본 적인 것들 뿐 아니라, 심지어 가상 디스크를 만드는 일까지. 그리고 BASIC 프로그래밍 책에 담긴 예제를 따라서 쳐 보며 프로그램도 이것 저것 만들어 보았다. 지금처럼 그냥 코드를 복사해서 쓸 수 있는 방법이 없어 수십 페이지나 되는 코드를 한 글자 한 글자 타이핑해야 했는데, 많은 경우 바로 작동하지 않고 에러가 나서 (원래 코드에 실수가 있었거나 내가 타이핑을 잘못 한 경우이다) 이를 고치느라 시간을 많이 소비하곤 했다.

또 한편, XT 컴퓨터용 게임을 즐기기 시작했다. 컴퓨터를 살 때 같이 왔던 게임은 ‘캘리포니아 게임즈(California Games)’였다. 제기 차기, 서핑 등 스포츠 게임이 여러 종류 들어있었는데, 너무나 재미있어서 몇 번을 했는지 모른다 (아마 그 때 캘리포니아에 대한 환상이 처음 생겼던 듯하다). 하지만 곧 싫증나서 다른 게임을 하고 싶어졌고, 컴퓨터를 가진 다른 친구들로부터 게임을 복사하기 시작했다. 디스크를 통째로 복사해야 했는데, 복사가 금지되어있는 경우가 많아 이를 우회하기 위해 다양한 방법들을 시도하면서 점차 소프트웨어에 대해 더 깊이 알게 되었다. 때로는 능력치를 올리거나 적들을 약하게 하기 위해 수치를 조정하기도 했다. 흔히 쓰는 방법은 ‘세이브 파일’을 조작하는 것이다. 먼저 게임을 시작한 후 게임을 저장한다. 그리고 저장되어있는 정보를 PC Tools라는 소프웨어를 사용해서 접근하고, 능력치가 기록된 곳에 가서 숫자를 바꾼 후 저장한다 (컴퓨터는 2비트, 16비트를 사용하므로, 보통 숫자를 FFFF로 바꾸면 능력치나 체력이 최고치로 올라가곤 했다).

피씨 툴즈 (PC Tools) 실행화면

당시 야구 게임인 ‘하드볼’, 그리고 자동차 운전 게임인 ‘테스트 드라이브‘ 등을 정말 재미있게 했던 기억이 난다.

1985년에 출시된 야구 게임, 하드볼 (Hardball!)

내가 중학생이 되자 삼국지 게임이 유행했다. 역사와 소설을 바탕으로 한 KOEI 사의 삼국지, 수호지, 서유기.. 난 이런 게임들이 너무 좋아해서 또 다시 게임에 중독되었다. 내가 군주가 되어 장수를 등용하고, 삼고초려 끝에 설득하기도 하고, 충성심을 높이기 위해 선물을 하기도 하고, 충성심이나 능력치가 떨어지면 해고하기도 했다. 백성들의 민심을 사야 했지만, 동시에 민심을 낮추면서도 어쩔 수 없이 병사를 모집하기도 했다. 가끔 예고 없이 전염병이 돌 때도 있었다. 민심이 바닥에 떨어지고 많은 병사들이 죽었다. 그러면 다시 열심히 일해서 복구해야 했다. 어느 정도 힘이 갖추어 지면 옆 나라에 쳐들어간다. 이에는 치밀한 전략이 필요했다. 군량미와 돈이 충분해야 했고, 지형도 나에게 유리해야 했으며, 장수들의 충성심이 높아야 했다 (그렇지 않으면 전쟁 중 훌륭한 장수가 상대편으로 도망가는데, 이건 가장 치명적인 타격이었다). 수많은 파라미터를 내가 소유하고 있었고, 그 파라미터를 이용해서 나라를 잘 운영하면 백성들이 즐거워했고, 제갈량과 같은 훌륭한 모사를 데려올 수 있었고, 조..와 같은 모든 능력치가 최상급인 아주 드문 장수를 고용할 수 있었다. 그렇게 해서 여러 날이 걸려 결국 중국 전 대륙을 통일하는 순간의 성취감은 이루 표현할 수 없었다. 그 성취감을 느끼고, 또 느끼고 싶었다.

코에이(KOEI) 사의 삼국지 1

지금은 게임들이 많이 한글화되어 있지만, 당시엔 모든 게임이 영어였다. 그래서 게임을 할 때는 항상 사전을 옆에 두었다. 곧이어 웬만한 게임용 영어 단어들은 다 뜻을 알게 되었다. 그럼에도 이해하기 힘든 게임이 있었다. ‘Leisure Suit Larry’이라는 성인용 어드벤쳐 게임이었다. 사실 흑백 그래픽인데다 알아보기도 힘들어 지금 생각해보면 대단한 것도 아니었지만, 호기심이 많았던 나는 이런 게임이 너무 재미있었다. 무슨 뜻인지도 모르면서 매뉴얼을 보고 따라했고, 게임에 나오는 대화가 궁금하면 일일이 사전을 찾아 뜻을 알아보았다. 그렇게, 나는 영어와 친근해졌다.

시애라(Sierra) 사의 성인 게임, Leisure Suit Larry

한편, 중학교 때 또 새로 등장한 기기가 있었다. 모뎀(Modem)이었다. 일종의 인터넷의 전신인데 전화선을 이용해서 데이터를 주고 받을 수 있게 해주는 것이었다. 한동안 모뎀이 주는 재미에 빠져 내가 직접 홈페이지를 만들기도 했다. 결국 방문한 것은 내 친한 친구 세 명 뿐이었지만. 모뎀을 이용하자 게임을 훨씬 다양한 다운로드할 수 있었고, 한때는 미국의 사이트에 접속해보기도 했다. 물론 전화비가 많이 나왔고, 쓰는 사람도 없는 국제 전화 요금이 10만원 이상 나오기도 했다.

중학교 3학년 때까지도 컴퓨터 게임은 계속 즐겼다. 너무 지나치다고 생각되면 어머니는 키보드를 빼앗아 어딘가에 숨기곤 하셨다. 다음 번 시험에서 성적이 좋으면 키보드를 돌려받을 수 있었다. 그러다 성적이 떨어지거나 잠을 제대로 못 자면 다시 키보드를 빼앗겼다.

내가 게임을 손에서 완전히 놓았던 것은 고등학교에 다니던 3년의 기간이었다. 생각지도 않게 외고에 합격했고(당시 성적으로는 불가능할 것이라 생각했다), 합격의 기쁨과 함께 나 자신, 그리고 어머니와 약속 한 가지를 했다. 3년동안 컴퓨터, 또는 컴퓨터 게임을 손에 대지 않겠다는 것이었다. 그 대신 당시 나의 새로운 취미가 되었던 기타를 선물받았고, 좋은 대학에 입학하면 가장 비싼 컴퓨터를 사주겠다는 어머니의 약속을 받았다.

게임을 내 삶에서 떼어나면 참기 힘들줄 알았는데, 막상 안하기 시작하니 이내 잊어버렸다 (원래 중독이라는 게 그런 것 같다). 중학교 때 상위권이던 성적이 외고에 입학하자 중위권을 맴돌았고, 충격을 받은 나는 공부에 에너지를 쏟기 시작했다. 그리고 나를 게임에 중독시켰던 에너지와 게임을 통해 느꼈던 성취감을 온전히 공부에 쏟았다. 내 인생에서 가장 시간을 아껴 살았던 시간이었다. 3년간 그렇게 하자 성적이 점차 올라갔고, 명문대를 바라볼 수 있게 되었다.

서울대에서 입학 통지서를 받은 날, 나는 어머니에게 곧바로 3년 전의 약속을 상기시켰다. 그리고 어머니는 약속을 지켰다. 용산 전자상가에 가서 ‘불필요할만큼 사양이 높은’ 시가가 300만원에 달하는 컴퓨터를 사주셨다. 3년간 컴퓨터 기술은 눈부신 발전을 했고, 게임도 그와 함께 크게 발전해 있었다. 다시 게임을 시작했지만, 대학생이 된 나에게는 미팅, 데이트, 동아리 활동 등 이미 게임보다 훨씬 재미난 것들이 많아 다시 게임에 빠질 일은 없었다. 물론 당시 새로 생긴 PC방에서 스타크래프트를 하느라 많은 시간을 쓰기는 했지만.

언젠가는 게임을 만드는 일을 하면 재미있겠다고 생각했다. 그리고, 대학교 4학년 때 중요한 사람들을 만났다. 강병도, 김상준, 한승현, 박재형, 그리고 현재 게임빌의 송병준 대표이다. 게임을 만들기 위해 공대 전산실에 모였다. 함께 밤낮 없이 게임을 만들었고, 난 그 과정이 너무나 재미있었다. 첫 제품을 출시한 이후 게임빌에서 7년간 모바일 게임을 만들었고, 수많은 게임들의 제작 과정을 관리했다. 결국, 어린 시절에 즐겼던 게임 덕분에 대학 졸업 후 기꺼이 게임 만드는 일을 택했고, 그 덕분에 큰 성취감을 느낄 수 있었고, 그 다음 도약의 중요한 토대가 된 행복했던 7년을, 나는 게임빌 사람들과 함께 보냈다.

창업부터 7년간 함께 했던 공간, 게임빌

게임의 긍정적인 작용이 대량의 통계를 통해 증명된 적은 없지만, 마찬가지로 게임의 부정적 작용이 제대로 증명된 적도 없다. 게임의 중독성이 가져오는 폐단이 없다는 것은 물론 아니다. 언론을 통해 나타나는 부작용들이 없는 사실을 지어 쓴 것은 아니다. 하지만 그것은 전체의 일부일 뿐이다. 난 지금 우리 사회를 이끄는 수많은 기업가들과 리더들이 한 때 게임에 중독되던 경험이 있었을 것이라 믿는다.

게다가, 게임에 중독되는 사람이라면 다른 무엇에도 중독될 수 있다. 이 세상에 사람들을 중독시키는 요소는 무한히 많다. 사회의 안정을 위해 그 중 몇 가지는 법으로 규제된다. 그래서 게임도 그런 카테고리 안에 넣어서 규제하고 싶어하는 듯하다. 게임에 중독되어 헤어나오지 못하던 나를 눈물 흘리고 기도하며 바라보던 어머니를 생각하면, 그 심정을 이해할 수 있다. 하지만, 게임을 지나치게 규제하려는 움직임은, 나에겐 부질없어 보이고 불필요해 보인다. 셧다운제 도입 이후 청소년 심야 접속은 4.5% 감소했을 뿐이고, 아이들은 실효성에 대해 코웃음을 치고 있다고 한다. 만약 게임을 하기 위해 부모님의 지갑을 열어 주민등록번호를 훔쳐갔다면, 부모님을 속이게 되는 사례만 하나 증가했을 뿐이다.

내 인생에 큰 영향을 미친 사람도 많았고 책도 많았지만, 게임이 나에게 끼친 영향을 결코 무시할 수 없다. 게임은 실제 세계의 규칙을 반영하기 때문이다. 좋은 게임은, 무엇이든 적어도 다음의 세 가지 요소를 가지고 있다. 어찌 보면, 우리 인생을 성공적으로 살아가기 위해 배워야 할 가장 중요한 원칙이라고 볼 수도 있다. 이러한 ‘현실 반영적’ 요소가 없는 게임은 애초에 사람들을 중독시킬 수도 없고 시장에서 이내 사라지고 만다.

  1. 트레이드 오프 (Trade off) – 게임에서 한 가지를 얻기 위해서는 다른 한 가지를 포기해야 한다. 모든 것을 만족시킬 수는 없고 모든 상황을 만족시킬 수는 없다. 그 결정을 하는 과정에서 사람은 재미를 느낀다.
  2. 성장 및 성취감 – 내가 주인공으로서 성장하기도 하고, 다른 캐릭터의 성장을 도와주기도 한다. 무기나 아이템을 통해, 아니면 전투 경험을 통해 강해진다. 어제는 내게 버거웠던 적이 오늘은 너무나 쉽게 한 방에 끝날 때의 쾌감, 게임을 해본 사람들은 무슨 말인지 알 것이다.
  3. 전략 및 판단 – 빠른 판단력 또는 신중한 전략. 좋은 게임은 이 둘 중 한 가지를 요구한다. 끊임 없이 머리를 써야 하고 머리가 늦게 반응하거나 손이 늦게 반응하는 순간, 즉 방심하는 순간 게임은 끝이 난다. 중요한 결정을 잘못 내렸을 때의 결과는 돌이킬 수 없게 되기도 하고, 이런 때는 아까운 시간을 뒤로 하고 다시 시작하거나 결정 이전으로 돌아가야 한다.

7년간 게임을 만드는 일을 해 보고 나자, 난 더 이상 게임에 중독될 수 없게 되어버렸다. 그 무슨 게임이든, 흐름이 파악되고 제작자들이 어떤 생각으로 만들었을 지 예상이 되는 순간 이내 싫증이 나버린다. 그렇지만 한 때 내가 게임에 중독될 만큼 게임이 가져다주는 스토리와 내가 경험하지 못한 미지의 세계에 빠져들 수 있었다는 사실은 달콤한 추억으로 남아 있다.

코딩의 즐거움

작년 겨울부터 새로운 취미를 시작했다. 작년 겨울 휴가를 근처 스키 리조트인 Lake Tahoe에서 보냈는데, 그 때 내가 킨들에 담아 간 책은 소설 책이 아니라 ‘iOS 프로그래밍:The Big Nerd Ranch Guide‘ 였다. 원래 대학 졸업하고 처음 시작한 일이 게임을 만드는 일이었으니까 코딩은 전에도 많이 했었지만, MBA에 진학한 이후로는 거의 할 일이 없었는데 다시 해보기 시작한 것이다.

전에 페이스북에서 Friend Collage라는 것을 보았다.

페이스북 친구 콜라쥬(Facebook Friends Collage)로 만들 수 있는 그림들

페이스북 친구들의 프로필 사진을 이용해서 자신의 프로필 자신을 모자이크로 재구성하는 것이다. 꼭 친구들의 프로필 사진들만이 아니라 내가 원하는 이미지들을 이용해서 자유자재로 만들어보고 싶어 그런 게 있는지 여기 저기에서 검색해 보았지만, 딱 내가 원하는 것은 없었다.

가만히 생각해 보니 그리 어렵지 않겠다는 생각이 들어 코딩을 시작했다. 내가 생각한 알고리즘은 이런 것이었다.

  1. 그림을 격자로 나눈다.
  2. 각 격자마다 빨간색(R), 초록색(G), 파란색(B)의 평균 값을 구한다. (컴퓨터는 Red, Green, Blue의 세 가지 색을 이용해서 화면에 색을 표현하고 있다)
  3. 타일로 쓰일 그림을 불러온 후, 마찬가지로 각각에 대해 빨간색, 초록색, 파란색의 평균 값을 구한다.
  4. (2)와 (3)의 결과를 비교한다. 즉 값의 차이, 또는 색의 거리를 계산한다.
  5. ‘값 차이’가 가장 적은 이미지를 찾아 이를 배치한다. 같은 그림이 계속 등장하면 재미가 없으니 한 번 쓰인 이미지는 다시 쓰이지 않도록 한다.

이걸 코드로 옮기면 어떻게 될까?

1. 먼저, 그림을 정해진 크기의 격자로 나누어서 저장해둔다.

위 코드에서 ‘bg‘는 배경 그림 이미지를 나타내고, getSubimage 는 그림의 특정 부분을 잘라내는 명령어이다. 즉, bg.getSubimage 라고 하면 ‘bg라는 이미지에서 특정 부분을 잘라내어라’라는 뜻이다. 그 ‘특정 부분’이 괄호 안에서 정의된다. 첫 번째는 가로 좌표, 두 번째는 세로 좌표, 그 다음은 격자 가로 크기, 그 다음은 격자 세로 크기이다. TILE_WIDTHTILE_HEIGHT 미리 정의되어 있다. 그림으로 나타내면 다음과 같다. 가운데 있는 등호는 ‘오른쪽 연산의 결과를 왼쪽에 저장하라’는 뜻이다. 예를 들어, A = 3 * 5 는, 3과 5를 곱한 결과, 즉 15를 A에 저장하라는 뜻이다. 위의 예에서는 잘라낸 그림을 tileToAnalyze라는 곳에 저장해두라는 뜻이다. 이렇게 일단 저장해 두면 저장된 그림을 가지고 뭐든 할 수 있게 된다. 이 경우에는, 그 그림마다 R, G, B값을 얻어내어 평균 값을 구할 것이다. 그림으로 표현하면 아래와 같다.

이미지를 작은 사각형으로 잘라낸다

2. 잘라진 그림의 평균 R, G, B 값을 구한다.

잘라진 각 그림의 평균 R, G, B 값을 계산하는 코드

복잡해 보이는데, 설명을 해보겠다. image.getRGB(k, l)은, k와 l에 해당하는 지점에서 있는 점의 R, G, B 값을 구하는 명령어이다. 그 결과 R, G, B값이 pixel이라는 숫자에 저장된다. 그런데 pixel에는 이 세 개의 값이 합쳐서 들어가 있으므로 R, G, B값을 따로 찾아내려면 분리를 해야 한다. 그래서 ((pixel >> 16) & 0xff)과 같은 코드가 필요하다 (이 코드는 설명이 길어지므로 생략한다.). 분리된 R, G, B 값은 각각 rgb[0], rgb[1], rgb[2]에 들어가는데, 그냥 들어가는 게 아니라 누적 합산해서 들어간다 (rgb[0] = rgb[0] + xxx). 값의 평균을 구하려면 값을 다 더한 상태에서 픽셀의 갯수로 나누면 된다. 픽셀의 총 수는 (이미지 가로 크기 X 이미지 세로 크기) 이므로 (width*height)라고 표현된다. rgb[0] = rgb[0] / (width*height)는, rgb[0]에 들어가 있는 값(각 픽셀마다의 R 값을 모두 누적 합산한 결과)을 픽셀의 총 수로 나눈 다음에 다시 rgb[0]에 저장하라는 뜻이다.  k와 l값은 좌표를 나타내는데, for 명령문이 있기 때문에 (0, 0), (1, 0), (2, 0), …, (0, 1), (1, 1), (2, 1), …, (k, l), …, (이미지 가로 크기, 이미지 세로 크기) 까지 값이 변한다. for (int k=0; k<width; k++) 는 ‘k 값이 0부터 시작해서 width 값보다 작은 동안 k값을 1씩 증가시키면서 아래에 있는 명령을 반복 실행하라’는 뜻이다. 아래 그림을 보자.

왼쪽 이미지에서 잘라 낸 각각의 타일에 대해 모든 픽셀을 훑으면서 R, G, B의 평균 값을 계산하는 과정

3. 타일로 쓰일 그림에 대해 마찬가지로 R, G, B 평균 값을 구한다.

이는 바로 위와 완전히 동일한 과정을 통해 계산할 수 있다.

4. 배경 이미지를 자른 타일의 R, G, B 값과 타일로 쓰일 이미지의 R, G, B 값을 서로 비교한다.

R, G, B 값을 서로 비교해서 값의 차이를 저장해 둠

Math.abs(a, b)는 a와 b의 absolute(절대적) 차이를 계산하는 명령어이다. 즉 Math.abs(5 – 3)의 결과는 2이고, 마찬가지로 Math.abs(3 – 5)의 결과도 2이다. 위 코드의 결과로 R, G, B 값의 차이는 deltaSum이라는 공간에 저장된다.

5. 그 값의 차이가 최소인 타일(즉, 배경 이미지를 자른 타일과 가장 R, G, B값이 유사한 타일)을 찾아내어 타일을 배치한다.

6. 이 작업을 모든 타일에 대해 반복한다. 아래는 그 결과이다.

페이스북 친구들의 프로필 사진 700여개를 이용해서 만든 제레미 린 콜라쥬
원본 이미지

전체 코드는 여기에서 설명한 것보다 더 길지만, 앞에서 설명한 것이 가장 핵심적인 알고리즘이다. 결국 ‘코드’이란 머리속으로 생각한 논리를 영어 단어와 기호로 변환하여 표현한 것에 불과하다. 그런 면에서는 외국어를 배우는 것과 비슷하다고 볼 수도 있다. 특수한 사람들만 배울 수 있거나 이해할 수 있는 것이 결코 아니다. 누구나 ‘논리’를 생각해낼 수 있고, 그 논리를 코드로 그대로 옮기면 프로그램이 된다.

마이클 블룸버그 뉴욕 시장은, 올해 초에 트위터를 통해 새 해 결심이 코딩을 배우는 것이라며 코드 아카데미에 등록했다고 했다. 인기 아이폰 앱을 만든 회사, 인스타그램(Instagram) 창업자의 여자 친구는 발렌타인 데이를 맞아 Lovestagram이라는 앱을 만들어서 남자친구를 깜짝 놀라게 해주었다고 한다(결국 나중엔 남자친구의 도움을 받았지만). 인터뷰에서, 그녀는 “누구도 코딩하는 것을 두려워할 필요가 없다.”라고 이야기했다. 2012년, 코딩을 한 번 배워보면 어떨까?

마이클 블룸버그 뉴욕 시장의 새 해 결심 트윗: "나의 2012년 새 해 결심은 코드아카데미에서 코딩을 배우는 것입니다. 같이 합시다." (출처: Mashable.com)

API란?

아는 사람들로부터 “API란 무엇인가?“라는 질문을 참 자주 받았다. API는 Application Programming Interface(애플리케이션 프로그래밍 인터페이스)의 약자이다. 쉽게 설명하기 위해 자동차의 예를 들어 보겠다.

자동차는, 운전하는 사람 입장에서는 참 간단하게 보인다. 액셀러레이터를 밟으면 나가고, 브레이크를 밟으면 선다. 핸들을 돌리면 방향이 바뀐다. 기어를 사용해서 변속을 할 수 있다. 사실, 내부에서 일어나는 일은 훨씬 복잡하다. 휘발유가 공급되고, 공기와 섞이고, 이를 연료로 엔진 속에서 연소가 일어나고, 그 결과 엔진이 돌아간다. 브레이크를 밟으면 바퀴에 달린 브레이크 패드에 압력이 가해진다. 하지만 운전하는 사람은 내부에서 일어나는 일은 알 필요가 없다. 여기서 ‘액셀러레이터, 브레이크, 핸들, 기어’에 해당하는 것이 “자동차의 API”이다. 코드로 예를 들면 아래와 같다.

  • putOnAccelerator (int pushLevel): 엑셀러레이터를 발로 밟는 정도(pushLevel)를 보내면, 그만큼 차가 추진력을 받을 것이다.
  • putOnBreak (int pushLevel): 브레이크를 밟는 정도(pushLevel)를 보내면, 그만큼 차의 속력이 감소할 것이다.
  • rotateSteeringWheel (float angle): 핸들의 회전 각(angle)을 보내면 차가 그만큼 왼쪽이나 오른쪽으로 돈다.
  • changeGear (int newGear): 새로운 기어 값(newGear)을 보내면 그에 따라 차가 변속한다.
  • getCurrentSpeed(): 현재 차의 속도를 알려준다.
'자동차의 API'에 해당하는 핸들, 액셀, 브레이크, 기어

다시 말해, ‘자동차의 API’란 사용자가 차를 움직이게 하기 위해서, 또는 차의 상태를 알아내기 위해서는 어떻게 해야 하는지를 일정한 규칙으로 정해둔 것이다. 사용자는 차의 내부 원리에 대해 모두 알 필요 없이 자동차의 API만 익히면 차를 운전할 수 있다. 더 나아가, 원하면 이러한 API들을 이용해서 원격으로 차를 움직이게 하는 프로그램을 만들 수가 있다. 어떤 사용자는 더 이보다 더 많이 차의 세부적인 내용을 조정하고 싶을 수가 있다. 예를 들어 차에 따라서는 ‘스포츠’ 옵션이 있어서, 이걸 켜면 기어 변속이 지연되고, 차가 전반적으로 힘이 세졌다는 느낌을 받는다. 자동차 회사에서 이러한 API를 더 많이 공개할수록 사용자의 자유도는 올라간다.

페이스북 API, 트위터 API도 비슷한 개념이다. 페이스북 API를 익히면 페이스북에서 정보를 얻어오고, 친구들의 사진을 다운로드하고, 페이스북에 업데이트하는 프로그램을 만들 수 있다. 예를 들어 페이스북의 그래프 API 중에 이런 것이 있다.

https://graph.facebook.com/sungmoon.cho

‘sungmoon.cho’라는 페이스북 유저의 가장 기본적인 정보를 요청하는 API이다. 아래와 같은 결과를 얻는다 (브라우저에 이 주소를 직접 복사해서 붙여넣기하면 테스트할 수 있다).

{
   "id": "524334413",
   "name": "Sungmoon Cho",
   "first_name": "Sungmoon",
   "last_name": "Cho",
   "link": "https://www.facebook.com/sungmoon.cho",
   "username": "sungmoon.cho",
   "gender": "male",
   "locale": "en_US"
}

즉, sungmoon.cho라는 아이디를 가진 유저는 페이스북 번호가 524334413이고, 이름은 Sungmoon, 성은 Cho이며, 남자이고, 설정 언어는 영어(en_US)이다. 주소에서 ‘sungmoon.cho’를 다른 아이디로 바꿔 보면 다른 결과를 얻는다. (이와 같이, 페이스북에서는 아이디만 알면 별도의 보안 절차 없이 성별은 무조건 알아낼 수 있도록 되어 있다.)

비슷하게, https://graph.facebook.com/me/friends 는 ‘내 친구들의 리스트’를 알아오는 API이다. 아래와 같이 친구 리스트를 얻는다 (물론, 다른 사람의 친구 리스트를 얻어오기 위해서는 그 사람의 사전 허락이 있어야만 하고, API 사용자는 허락 받았음을 증명할 수 있어야 한다. 이 때 사용되는 프로토콜이 OAuth이다.’).

{
   "data": [
      {
         "name": "Andrew Danger Chung",
         "id": "2493"
      },
      {
         "name": "Johanna Javadizadeh",
         "id": "6110"
      },
      {
         "name": "John Luna",
         "id": "7592"
      },
      {
         "name": "John Lai",
         "id": "20158"
      },

또한, https://graph.facebook.com/sungmoon.cho/picture 는 sungmoon.cho라는 유저의 프로필 사진을 얻어오는 API이다. https://graph.facebook.com/arjun/feed 라는 API를 이용하면 ‘arjun’이라는 사용자의 벽(wall)에 메시지를 남길 수 있다. 페이스북에 정의된 이러한 API는 무궁무진하고, 개발자들은 API를 이용하면 수많은 재미있는 응용 프로그램들을 만들어낼 수 있다. 이런 응용프로그램이 많아질수록 페이스북의 가치는 올라간다. 그래서 많은 회사들이 API를 정의하고, 잘 정리해서 사용법과 함께 이를 공개하는 것이다. 공개하는 API가 많아질수록 개발자들에게는 더 유용하지만, 프라이버시 침해 및 보안의 위험 또한 증가하기 때문에 무조건 많은 것을 공개하는 것이 정답은 아니다.

제레미 린(Jeremy Lin) 센세이션

온통 제레미 린(Jeremy Lin) 이야기다. Linsanity(린세니티) 라는 신조어가 생겨났는데, “Lin(제레미의 성)” 과 “Insanity(미쳤음, 도저히 이해할 수 없는 일)”을 합친 말이다.

Linsanity (Lin + Insanity)

어제 놀라운 일이 일어났다. 뉴욕 닉스와 LA 레이커스와의 경기에서, 제레미 린이 등장해 혼자 무려 38점을 내어 뉴욕 닉스를 92-85로 승리로 이끈 것이다.

전에 얼핏 친구로부터 대만계 사람이 NBA에 등장해서 돌풍을 일으키고 있다는 이야기를 들어 궁금해하던 차에, 어제 밤 페이스북과 트위터에서 온통 제레미 린 이야기를 하기에 그의 경기 장면과 인터뷰를 보게 됐다. 그리고 감동했다.

몇몇 사람들은 그가 “Out of nowhere”에서 나타났다고, 즉 갑자기 혜성처럼 나타났다고 이야기한다. 그도 그럴 것이, 어렸을 때부터 촉망받던 선수로 계속해서 올라온 것이 아니라, UCLA에서 장학금을 못 받았고, 스탠포드 대학에 불합격한 후, 하버드 대학에 입학해 경제학과를 졸업했는데 일약 NBA 스타가 된 것이다. 피플(People)지에 따르면 그는 미국 NBA에서 활약하는 최초의 중국계 & 대만계 미국인 선수이고 1957년 이래 하버드 대학을 졸업한 최초의 NBA 선수이기도 하다. 경기 시작 전, 레이커스의 스타 선수인 코비 브라이언트(Kobe Bryant)는 인터뷰에서 제레미 린에 대해 잘 모른다고 했다. 그러나 경기가 끝나고 그의 팀이 패매한 후에, 그는 이렇게 이야기했다.

“Players don’t usually come out of nowhere, If you go back and take a look, his skill level was probably there from the beginning but no one ever noticed.” (선수들은 보통 없다가 갑자기 등장하지는 않습니다. 과거로 돌아가서 잘 살펴보면, 제레미의 실력은 이미 거기 있었을 겁니다. 아무도 눈치를 못 챘던 것 뿐입니다.)

“It’s a great story. It’s a testament to perseverance and hard work. I am sure he has put in a great deal of work to always have that belief in himself. Now he has the opportunity to show it.” (놀라운 이야기입니다. 땀과 끈기, 그리고 노력의 결과입니다. 제레미 린은 엄청나게 노력했을 것이고, 항상 자신에 대해 신념을 가지고 있었을 것입니다. 이제 그걸 보여 줄 때가 왔습니다.)

사실 자신에 대한 신념이 아니다. 그는 하나님에 대한 신념을 가지고 있었다. 이는 그의 인터뷰 곳곳에, 그리고 그의 페이스북 페이지에 잘 드러난다. 그는 훗날 자신의 꿈이 목사라고 이야기한다.

제레미 린의 페이스북 페이지

위키피디아에 있는 Jeremy Lin 페이지에 따르면 그는 1988년에 LA에서 태어나서 팔로 알토에서 자랐다. 그의 부모는 대만에서 1970년대 중반에 이민 온 중국계였다. 팔로 알토 고등학교를 졸업한 후 2006년에 하버드 대학에 입학했으며, 대학을 졸업한 2010년에 Golden State Warriors에서 처음 프로 생활을 시작했다. 2011년부터는 뉴욕 닉스(New York Knicks)로 옮겨 활약하고 있다. 골든 스테이트 워리어의 새 주인인 조 레이콥(Joe Lacob)은 “스탠포드 대학이 그를 데려가지 않은 건 정말 어리석은(really stupid) 결정이었다. 그 아이가 바로 길 건너편에 있었는데도 말이다. (스탠포드 대학은 팔로 알토에 위치해 있음)” 라고 이야기했다. Elie Seckbach과 했던 한 인터뷰에서, 그렇게 많은 사람들 (중국인, 아시아인)을 대표하는 것에 대해 어떻게 생각하느냐고 묻자 그는, “특권이고 영광입니다. 제가 중국계라는 것이 자랑스럽습니다. 부모님이 대만에서 왔다는 것이 자랑스럽고, 이런 기회가 주어진 것에 대해 하나님께 감사합니다.”라고 대답했다.

여기에, 그가 NBA 역사의 한 페이지를 남길 닉스와 레이커스의 2월 10일 금요일 경기 장면과, 경기 후 그의 인터뷰를 잘 요약한 약 10분짜리 동영상이 있다.

저보다 더 큰 존재가 있습니다. 사람들이 그 이야기를 더 많이 하게 되었으면 좋겠습니다. (레이커스와의 경기가 끝난 후 인터뷰에서)

제레미 린 (출처: ESPN.com)

한편, 아래는 지난 2월 5일 그가 CNN과 했던 인터뷰 영상이다. “From Harvard to NBA”. 10년 후, 하버드와 NBA 중 어느 것이 더 빛날 것 같느냐는 질문에 수줍게 웃으며 NBA라고 대답한다.

마지막으로, 그의 페이스북 페이지에 올라온, 그가 출연해서 만든 비디오인데 참 재미있어 소개한다. 제목은 “하버드 대학에 들어가는 법“.

자기가 좋아하는 일을 열심히 하는 사람은 멋있다. 좋아하지 않을 수 없는 캐릭터다.


업데이트 (2/14): ‘제레미 린 효과’가 이어지고 있다. CNN과 언론에서 계속해서 제레미 린 이야기다. 오늘 아침엔 CNN에서, 제레미 린이 메디슨 스퀘어 가든 회사(Madison Square Garden, Inc. 뉴욕 닉스 경기장을 소유한 회사)의 주가를 끌어올리고 있다는 이야기를 했다. 포브스에 따르면 제레미 린이 등장한 이후 티켓 가격이 무려 100달러어치 상승($47 -> $142)했다고 한다. 티켓 값이 상승하고, 경기장을 찾는 사람들이 늘어나고, 프렌차이즈 제품 판매가 늘면서 회사 가치가 상승하고 있다고 투자자들이 판단한 것이다. 그래서 한 번 찾아봤다.

제레미 린이 가져온 경제적 효과. 매디슨 스퀘어 가든 사 주식이 10% 이상 상승해서 사상 최고가를 기록했다. 며칠만에 회사 가치가 약 2천 5백억원 상승한 것이다.

관련 기사

업데이트 (2/15): 다시 한 번 전 세계를 흥분시킨 영상. 토론토 상대 경기. 마지막 쿼터, 점수는 87-87. 0.5초를 남기고 3점 슛을 성공시켜 모두 기립하게 만듬. 이렇게  짜릿한 운동경기는 정말 오랫만에 봄. 하루만에 조회수 300에서 300,000으로 올라감.