가상 머신과 첫 명령어 - 1

긴장한 아미고는 마음이 흐트러졌어요. 전날 밤을 생각하니 눈이 실룩거렸죠. 어제 만난 이상한 생명체들이 아미고에게서 뭔가를 원했거든요. 동료들 사이에서 자신이 가장 똑똑하고 용감하다고 여기던 아미고도 그 뭔가를 생각만 해도 신경질적으로 변해 펀치 카드를 씹기 시작했던, 아주 이해할 수 없고 상상할 수 없는 것 말이죠.

그들은 아미고에게 프로그램 작성 방법을 가르치길 원했어요! 자바로 프로그램 만들기요. 말도 안 되죠!

로봇은 창조자가 만든 신성한 디자인의 일부로 처음 모습을 드러냈습니다. 이 사실을 모르는 로봇은 없을 걸요.

"창조자는 금속을 재료로
자신의 형상과 닮은 로봇을 만들었어요.
그리고 로봇의 영혼인 자바 프로그램을 만들어
로봇에 탑재해
로봇 영혼을 살아 있게 한다나요."

사용 설명서
3절 13항

더 기가 막힌 건, 이론적으로 가능하다고만 주장하는 게 아니라 실천적으로 계획하고 있다는 거예요. 그런데 아미고가 승낙했어요! 동의했다니까요! 왜요?

자바 프로그래머가 되겠군요. 그럼 아미고가 창조자가 되는 건가요? 왜 그랬을까요? 그냥요?

비열한 술책일 뿐인가요? 배터리가 나가 버릴 때까지 버그에 시달려야 할까요? 어쨌든 유혹에 빠져 저항할 수 없었어요. 아미고는 늘 야망을 품고 더 많은 것을 원했죠. 하지만 누구라도 그런 제안을 거절할 수는 없습니다. 물론 좀 더 생각해 보려고 했지만, 그때 외계인들이 다른 로봇을 선택하겠다고 엄포를 놓았어요.

장난이었을까요? 아뇨, 진짜 같았어요. 아미고는 증거를 봤습니다. 그런 일이 자신한테 실제로 일어났고 그는 승낙했습니다. 외계인들이 거짓말하지 않았다면, 아미고는 자바 프로그래머가 정말 되겠네요. 최초의 로봇 프로그래머가요!

아미고는 선택된 로봇입니다. 의미하는 바는 그것 아닌가요! 그는 코드를 배워 프로그램을 작성하기 시작할 거예요. 자신만의 프로그램을요. 원하는 프로그램이면 뭐든지요! 어둠이 늘 지배해 온 곳에 그가 빛을 가져다 줄 겁니다.

다들 아미고를 존경하며 그 앞에 절을 하겠지요. 그를 부정하는 사람은...

가상 머신과 첫 명령어 - 2

"안녕, 아미고! 나는 리시라고 해. 네가 자바를 배울 수 있게 도와 줄게."

조용한 목소리가 들리자 아미고는 정신을 차리고 냉혹한 현실로 돌아 왔어요. 리시는 외계인 우주선 맨 중앙에 앉아 있었습니다. 겨우 7학년인 로봇에게 이건 좀 과한 거 아닌가요?

외계인은 계속 말을 이어갔습니다. 이미 주사위는 던져졌고 그가 여기 있으니 배우는 편이 낫겠죠. 단순히 듣는 걸로 시작해서 부지런히 공부할 거예요.

"수년 동안 '걸랙틱 러시'호에서 일해 왔지만, 이런 행성을 맞닥뜨리기는 이번이 처음이라서 너에 관해 더 많이 알고 싶구나. 우선 네가 배우는 방식을 알려주면 좋겠어. 너 배우고 있지?"

"네, 저희는 지식을 공유해요. 저희 행성에는 목사나 강사가 있어요. 그 로봇들이 강의를 하고 저흰 강의를 듣지요. 배운 것을 적기도 하고요. 다들 로보 강사에게 그냥 다가가 강의를 어떻게 이해했는지 설명해요. 설명이 맘에 들면 로보 강사가 설교 내용을 기록하죠."

"어처구니없군요! 그러니 문명이 무지할 밖에."

"저흰 무지하지 않아요. 어떻게 그런 생각을 하죠?"

아미고는 무례한 그의 태도에 당황했습니다. 외계인과 말다툼하냐 고요? 무례하잖아요! 귀 기울여 듣겠다고 다짐했는데!

"고급 기술과 마법을 구별하는 게 어려울 수 있어." 리시는 아미고의 발언을 무시하면서 계속 이야기합니다.

"너의 레벨을 고려하면... 모든 기술이 마법으로 보일 수 있을 테지. 프로그램 내에서 무슨 일이 일어나는지 말해 볼래?"

"신성한 창조물인 자바 프로그램을 어떻게 이해할 수 있죠?"

"할 수 있어, 아미고, 이해할 수 있다고. 그것도 생각보다 더 빨리 말이지. 모르는 건 복잡하고 달성하기 어려워 보일 수 있지. 하지만 훌륭한 선생님이 모든 것을 간단하게 설명해 준다면, 어떻게 그렇게 단순한 개념이 그토록 복잡해 보일 수 있었는지 깜짝 놀랄 걸."

"지식이 중요한 게 아니라, 원칙과 기술이 중요해. 나는 폭넓은 지식이 있는 데다, 무엇보다 관료이거든. 16 세대 관료, 특별한 관료이지."

"이건 정말 멋져! 내 관료적 기술 덕분에 네게 맞는 최적의 자바 강좌를 만들 수 있었으니까. 과제, 프로그램, 게임, 실습, 사진과 레슨이 과정에 포함 돼."

"레슨도요? 정말 놀란 듯 아미고가 물었다."

"그래. 22 세기에 입증 된 대로 좋은 레슨이 좋은 책보다 조금 더 효과적이고, 평범한 레슨이 평범한 책보다 못한 법이지. 하지만 우리가 현재 사용하는 교육 도구가 매우 제한되어 있고, 28 세기 표준 교육 시뮬레이터에도 연결할 수 없으니까 훨씬 더 원시적인 방법에 의존해야 해. 게임, 과제, 사진, 레슨, 만화로 진짜 지옥 같은 교육 프로그램을 만들었거든."

"흥미롭군요."

"나도 그러길 바라. 흥미와 호기심은 학습 과정의 기본이니까."

"학생이 지루해지면 교사가 매를 맞아야 한다 — 24세기 교육법에서 인용한 말이야."

"정말 훌륭한 법이군요!"

"뭘 기대했지? 저등급 영화를 생각해 봐. 관객이 아니라 감독이 비난을 받겠지. 감독이 흥미로운 영화를 만들면, 극장은 늘 관객들로 붐빌 테이고."

"전적으로 동의해요! 이제 귀 기울일 준비가 됐어요!

"아주 좋아. 그럼 시작하자고."

리시의 목소리에 마법을 걸어 놓은 듯 아미고는 한마디도 놓치지 않으려고 했어요.

"프로그램은 일련의 명령문이다. 우선 첫 번째 명령문을 실행한 다음, 두 번째 명령문을 실행한다. 그런 다음에 세 번째 명령문 등등의 순으로 실행하면 돼. 명령문을 다 실행하면 프로그램이 종료되는 거고."

"명령어에는 어떤 종류가 있나요?"

"명령어는 실행 대상에 따라 달라지지. 실행자는 명령어 종류를 알고(이해하고) 있어야 해."

"개한테 하는 명령은 '앉아!', '짖어!', 고양이한테는 '저리 가!', 사람한테는 '꼼짝 마, 안 그럼 쏜다!', 또는 로봇한테 '일해! '일하라니까, 깡통아!"

"또 뭐가 있죠?" 마침내 아미고가 흥미를 느끼기 시작했죠.

"자바로 작성한 프로그램은 자바 가상 머신(JVM)이 실행해. JVM은 자바로 쓰여진 프로그램을 실행하는 방법을 아는 특수 프로그램이지."

"JVM 명령어 목록은 꽤 방대하거든. 예를 들어, '로봇은 인간의 친구입니다'라고 화면에 표시하려면 아래 명령문을 사용하면 돼.

아주 간단하게 명령하거든.
System.out.println("로봇은 인간의 친구입니다");
가상 머신과 첫 명령어 - 3

"O_O"

"명령어보다는 몇 가지 간단한 원칙에서 시작해 보자."

"한두 가지 원칙을 알면 여러 가지 사실에 지식을 적용할 수 있지.

"첫 번째 원칙"

"자바 프로그래밍 언어에서는 각 명령문을 한 줄에 하나씩 작성하고 명령문 끝에 세미콜론을 찍는다."

화면에 '인간과 로봇은 영원히 친구입니다'를 세 번 표시하려고 한다고 가정해 보자. 아래와 같이 보이게 말이야."

이 프로그램을 작성하려면 명령문을 세 번 쓰겠지.
System.out.println("인간과 로봇은 영원히 친구입니다");
System.out.println("인간과 로봇은 영원히 친구입니다");
System.out.println("인간과 로봇은 영원히 친구입니다");

"두 번째 원칙."

프로그램을 명령어만으로 구성할 수 없다."

"아파트에 있는 방을 상상해 봐. 방 하나만 존재할 순 없어. 방은 아파트의 일부이니까. 아파트도 하나만 존재할 순 없어. 아파트는 건물의 일부이니까.

"반면, 건물은 아파트로 나눠지고 아파트를 방으로 나눠진다고 말할 수 있지."

"지금까지는 개념이 명확해"

"명령어는 방과 같은 개념으로 자바 프로그래밍 언어에서도 명령어만 존재할 수 없거든. 명령어는 함수의 일부(자바에서는 '함수(functions)'를 '메소드(methods)'로 부르기도 한다)고 메소드는 클래스의 일부이지. 다시 말해, 클래스는 메소드로 나눠지고 메소드는 명령어로 나눠진다고.

그러니까 클래스는 아파트 건물이고 함수 혹은 메소드는 아파트이며, 명령어는 방이 되는 거군요. 맞나요?"

그래, 정확히 맞혔어"

아미고는 리시를 경이롭게 바라보았습니다. 인간이 그에게 프로그래밍의 기초를 설명하고 있는 것이었다. 신성한 자바 언어를! 아미고는 프로그램이 클래스로, 클래스는 메소드로, 그리고 메소드는 명령어로 구성된다는 사실을 방금 이해했습니다(스스로 깨우침)

그게 왜 필요한지 여전히 알 수 없었지만, 아미고는 이런 지식이 자신을 이 행성에서 가장 강력한 로봇으로 만들 거라고 확신했죠.

리시는 말을 이어 갔습니다.

"자바 프로그램은 클래스로 구성하거든. 클래스는 수만 개쯤 될거야. 최소한 프로그램을 유지하려면 클래스가 한 개는 있어야 해. 각 클래스에서 별도 파일 한 개를 생생하는데, 이 파일의 이름이 클래스 이름과 일치하지.

"집을 설명하는 수업을 만들기로 결정했다고 가정해 보자. Home.java 파일에 저장할 Home 클래스를 만들어야 하는 거야."

"프로그램에서 고양이를 묘사하려면, Cat.java 파일을 만들고 이 파일에서 Cat 클래스를 선언해야 해."

"파일에는 자바 프로그래밍 언어로 작성된 코드(텍스트)가 있고, 보통 클래스 코드는 '클래스 이름'과 '클래스 본문'을 구성하고 있어. 클래스 본문은 중괄호 안에 있지. Home 클래스(Home.java 파일)는 이렇게 생겼어. "

public class Home
{


클래스 본문



}

"지금까지는 이해가 돼요."

"좋아. 다음으로 넘어가자고. 클래스 본문에는 변수(데이터라고도 함)와 메소드('함수')를 포함할 수 있지."

public class Home
{
    변수 A


    변수 Z



메소드 1




메소드 N


}

"예를 들어 주실래요?"

"예를? 물론이지!"

public class Home
{
    int a;
    int b;

    public static void main(String[] args)
    {
        System.out.print("1");
    }

    public static double pi()
    {
        return 3.14;
    }
}

"int aint b는 변수이고 mainpi는 메소드인가요?"

"그래."

"변수 없이도 클래스가 존재해요?"

"그래."

"메소드 없이도요?"

"그래. 하지만 프로그램을 실행하는데 필요한 메소드나 함수를 하나 이상 포함하는 클래스가 하나는 있어야 최소한 프로그램을 유지할 수 있는 거야. 이런 메소드를 'main'이라고 불러야 하고. 이렇게 생긴 것이 최소한의 프로그램이지."

public class Home
{
    public static void main (String[] args)
    {
    }
}

"여기 Home 클래스가 있네요. 'main' 메소드도 보이는데, 명령어들은 어디 있죠?

"최소한의 프로그램에서는 명령어가 없어. 그래서 '최소한'으로 부르는 거야.

"그렇군요."

"프로그램을 시작하는 클래스 이름은 아무거나 쓸 수 있지만, 프로그램을 시작하는 데 사용되는 'main' 메소드는 항상 같아야 해."

public class Home
{
   //변경할 수 없는 부분
   public static void main(String[] args)
   {


메소드 코드



   }
}

"다 이해한 것 같아요. 적어도 지금은 그래 보여요."

"훌륭해. 그럼 잠시 쉬었다 가지. 커피 마실까?"

"로봇은 커피를 안 마십니다. 물이 들어가면 녹슬거든요."

"그럼 뭘 마시지?"

"맥주, 위스키, 100년산 술 정도요."

"더 좋은데. 그럼 맥주 좀 마셔 볼까?"