~cpp Smalltalk 배우기 #1 1998. 11. 21. 김찬홍 mailto:andrea92@hitel.net ====================================== 1. Smalltalk의 소개 →1.1. 프로그램과 프로그래밍 언어 ........ ======================================= 1. Smalltalk의 소개 ------------------------------ Smalltalk는 프로그래밍 언어입니다. 프로그래밍은 결국 컴퓨터를 내가 생각 하는 대로 움직일 수 있도록 해 주는 하나의 큰 도구입니다. 이제 Smalltalk 를 처음 공부하는 여러분들을 위해, 이 마당에서는 Smalltalk의 한 종류인 Dolphin Smalltalk를 설치하고 실행하고 종료하는 기본적인 방법을 소개할 것입니다. 그리고 이 과정에서 여러분은 간단하지만 재미있는 몇 가지의 Smalltalk 프로그램을 실행시켜보게 될 것이고, Smalltalk에서 어떤 식으로 명령어를 실행하는지에 대해서 공부하게 될 것입니다. 물론 처음부터 '객체지향'은 어떻고 '갈래'(class)가 어떻느니 등과 같이 접 근할 수도 있을 것입니다. 그러나 자전거를 배울 때 우선 자전거의 원리부터 배우려고 하는 사람은 없습니다. 자전거를 직접 타 봄으로써 몸으로 익히려 고 하겠지요. 이 마당에서도 일단은 객체지향에 대한 이론적인 면보다는 Smalltalk 환경 자체에 대해서 다루고자 합니다. 한 마디로 이 마당은 여러분이 Smalltalk에 익숙해지기 위한 곳입니다. 이 마당을 마칠 즈음에 여러분은 앞으로 Smalltalk를 공부하는데 있어서 가장 기본이 되는 몇 가지 사항들을 알 수 있게 될 것입니다. 1.1. 프로그램과 프로그래밍 언어 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 우리는 하루에도 여러 가지 명령을 알게 모르게 주기도 하고 받기도 하며 살 아갑니다. 동생에게 "물 좀 갖다 줘"에서부터 어머니에게 "밥 좀 주세요" 에 이르기까지, 우리는 다른 사람에게 명령을 내리고 또한 그에 따른 결과로써 무언가를 이루어갑니다. 어머니에게 명령을 내린다는 것이 좀 우습게 들리겠 지만, 따지고 보면 우리가 어머니에게 명령을 내릴 때에는 매우 공손한 태도 를 취하는 것입니다. 결국 어머니에게 무언가를 부탁하고 어머니는 그것을 들어주시는 것이므로, 어머니에게 명령을 전달했다고 생각할 수 있습니다. (한낱 컴퓨터를 다루는 사람의 우스운 괴변이 되지나 았았으면 합니다.) 우리는 또한 스스로에게도 자리에서 일어나라거나, 밥을 먹으라거나, 공부를 하라는 등 여러 가지의 명령을 내리며, 그렇게 해서 살아갑니다. 스스로 하 는 것이 무슨 명령이냐고 말할지 모르지만, 밥을 먹을 때에도, 눈과 팔과 손 에 붙어있는 뼈와 근육 등 여러 곳에 명령을 내려야만 제대로 밥을 먹을 수 있습니다. 그뿐입니까? 집에서 기르는 개나 고양이 같은 애완 동물에게도 우리는 명령 을 내립니다. "이리 와!", "손을 다오"처럼 분명히 우리는 애완 동물에게 명 령을 합니다. 물론 그 명령을 제대로 알아듣고 실행하는지 안 하는지는 그 동물을 얼마큼 훈련시켰느냐에 달려있지만 말입니다. :) 또한 우리는 주위에 있는 물건에게도 명령을 내립니다. 흔히 "TV를 끈다"고 말하는데, 정확히 말하면, 우리는 "TV의 전원이 꺼지도록 전원 단추를 누른 것"에 불과합니다. 이 단추를 누르는 동작이 결국은 TV 속에서는 복잡한 동 작으로 바뀌어서 전원이 꺼지게 되는 것이지요. 명령은 꼭 말로만 하라는 법이 없습니다. 앞서 이야기했듯이 TV를 끄는 것도 말로 하는 명령이 아닙니다. 손짓을 하거나 단추를 누르거나 하는 모든 것들 이 명령이 될 수 있습니다. 지금 여러분이 제 글을 보고 있다면, 여러분은 컴퓨터에게 수많은 명령을 내려서 이 글을 볼 수 있게 된 것입니다. 운영 체 계를 시작하고, 통신 프로그램을 띄우고, 전화를 걸고, 이 글이 실려 있는 게시판까지 찾아와서 글을 읽는 모든 것이 마우스를 누르거나 글쇠판을 두드 려서 내려진 여러분의 명령이 실행된 결과라는 사실을 생각하면, 명령은 꼭 말로만 내리는 것이 아니라는 제 말에 동감하실 것입니다. 제가 글머리부터 왜 이리 "명령" 타령을 하느냐고요? 그것은 바로 우리가 앞 으로 다루어야 할 "프로그램"(program)은 결국 이러한 "명령들의 집합"이기 때문입니다. 좀 더 정확히 말한다면, '프로그램'이란 명령이 언제 어떻게 실 행될 지를 늘어놓은 것입니다. 일단 이렇게 프로그램이 만들어지면 명령을 다시 내리지 않더라도 "나중에 언제든지" 다시 그 명령들을 실행할 수 있습 니다. 시계를 매일 아침 여섯 시에 울리도록 설정한다거나, 비디오 녹화기를 특정 시간에 방송되는 TV 프로그램―이것 역시 TV의 내용을 일정한 시간에 방송될 수 있도록 하는 것이겠지요―을 녹화하도록 설정한다거나 하는 것은, 결국은 우리가 바라는 명령들을 실행 순서에 따라 차례대로 늘어놓은 것입니 다. 이러한 프로그램을 짜는 작업을 '프로그래밍'(programing)이라고 부릅니 다. 결국 프로그래밍은 명령이 실행되는 순서를 정하는 것을 의미합니다. 프로그래밍과는 조금 다른 의미로 쓰이는 말 중에 "설계"(designing)란 말이 있습니다. 프로그래밍이 명령이 어떤 순서로 실행되는가를 중요하게 생각하 는 것과는 달리, 설계는 명령을 어떤 식으로 조직할 것인지를 결정하는 일입 니다. 프로그램이 선(線)이나 면(面)과 비유할 수 있다면, 설계는 입체로 비 유할 수 있습니다. 설계는 프로그래밍보다는 조금 상위 수준에 속한다고 보 면 됩니다. 소설을 쓰는 사람은 우선 자기가 쓸 글의 얼개를 짜고 글의 큰 흐름을 조직 합니다(설계). 일단 이렇게 글의 얼개가 짜여지고 목표가 생기면, 이제 그는 자신의 생각을 차례차례 글로 옮겨 적습니다(프로그래밍). 그래서 설계와 프로그래밍은 뗄 수 없는 불가분의 관계라는 말이 있습니다. 어느 한 쪽에만 치우치게 되면 둘 자 제대로 이루어지지 못하고 어그러지고 맙니다. 컴퓨터는 명령을 기억하고 또한 기억된 명령을 실행할 수 있는 장치입니다. 물론 컴퓨터에 기록된 명령은 컴퓨터가 알아들을 수 있는 말로 작성된 것이 겠지요. 프로그래머(programer)는 이렇게 컴퓨터가 알아들을 수 있는 말로 프로그램을 만드는 사람을 가리킵니다. 프로그래머가 컴퓨터에게 명령을 전 달하기 위해서는 방금 말했듯이, 컴퓨터가 알아들을 수 있는 말을 사용해야 합니다. 아직 컴퓨터는 사람이 사용하는 자연어(自然語)를 이해할 수 있을 만큼 똑똑 하지 못합니다. 결국은 사람이 컴퓨터가 알아들을 수 있는 말을 이용하여 프 로그램을 작성하는 수밖에는 없습니다. 이렇게 프로그램을 만들기 위하여 컴 퓨터가 알아들을 수 있는 말을 '프로그래밍 언어'라고 부릅니다. ─────────────────────────────────────── 사람도 여러 가지의 언어를 사용합니다. 우리말, 영어, 일어, 중국어, 프랑 스어 등 세상에는 여러 가지의 말이 있습니다. 마찬가지로 컴퓨터가 알아들 을 수 있는 말, 즉 프로그래밍 언어에도 여러 가지가 있습니다. 주로 사용되 는 C, C++, Java, Pascal, BASIC 등의 언어가 있는가 하면, 주류 언어는 아 니지만 각각의 목적에 따라 사용되고 있는 Forth, Lisp, Prolog, Scheme, 그 리고 우리가 공부하려고 하는 Smalltalk와 같이 정말 많은 종류의 프로그래 밍 언어가 존재합니다. 이들 언어는 나름대로의 장단점들을 가지고 있어서, 어떤 언어가 좋고 나쁨을 가릴 수는 없습니다. 어쨌건 우리가 다루고자 하는 언어는 Smalltalk이므로 앞으로 이 글에서는 다른 언어에 대해서 크게 다루 지는 않을 것입니다. 물론 필요할 때에는 다른 언어에 이미 익숙하신 분들을 위해서 다른 언어에 대해서 필자가 생각하는 것들을 잠깐씩 적을 생각입니 다. Smalltalk를 공부하시는데 도움이 되시기를 바랍니다. 계속... 제 목:[강좌] Smalltalk 배우기 #1 관련자료:없음 보낸이:김찬홍(안드래아) 1998-11-22 03:26 조회:420 1/8 ─────────────────────────────────────── Smalltalk 배우기 #2 1998. 11. 22. 김찬홍 mailto:andrea92@hitel.net ====================================== 1. Smalltalk의 소개 1.1. 프로그램과 프로그래밍 언어 →1.2. Smalltalk의 설치 1.3. Smalltalk 맛보기 프로그램 ........ ======================================= 1. Smalltalk의 소개 ------------------------------ 1.2. Smalltalk의 설치 ~~~~~~~~~~~~~~~~~~~~~ Smalltalk를 사용하여 프로그램을 짜기 위해서는 우선 여러분의 시스템에 Smalltalk 환경이 설치되어있어야 합니다. 일단 우리들은 Object Arts사의 Dolphin Smalltalk를 사용할 것이므로, 자료실에서 Dolphin Smalltalk를 내 리받읍시다. 원래 Dolphin Smalltalk는 상용과 공개용 Smalltalk 환경을 같이 배포하고 있습니다. Dolphin Smalltalk 1.1판은 공개용이며, 2.1판은 상용입니다. 현 재 필자가 사용하고 있고 또한 자료실에 올려진 환경은 1.1판입니다. 그러므 로 여러분이 마음대로 전송 받아서 사용할 수 있을 것입니다. 원래 Object Arts에서 제공하는 배포판의 파일 이름은 Dolphin981Setup.Exe 이지만, 자료실의 파일명 길이 제한 때문에 위의 실행 파일을 다시 WinZip으 로 압축하여 올린 것입니다. 그러므로 Dolphin Smalltalk를 설치하기 위해서 ─────────────────────────────────────── 는 다음과 같은 과정을 거치면 됩니다. 1. 자료실에서 Dolphin Smalltalk와 Dolphin Education Center를 찾 아서 내리받으십시오. 2. 내리받은 파일은 zip 압축파일이므로 WinZip 등과 같이 긴 파일 이름을 지원하는 압축 프로그램을 사용하여 압축을 푸십시오. 3. 압축이 풀리면 실행 파일 하나가 나오는데, 이것을 실행시키십시 오. 자동 풀림 파일이므로 실행파일을 실행하면 바로 설치 화면 으로 넘어갑니다. 4. 다른 응용 프로그램을 설치할 때처럼 그냥 <Next> 단추를 누르면 바로 바로 넘어갑니다. 고칠 사항이 있는 사람이라면 알맞게 고 치면 됩니다. 5. 설치를 마무리하면 Dolphin Smalltalk의 바로 가기를 시작 메뉴 에 넣을 것인가를 묻습니다. 여러분이 알아서 하면 될 것입니다. 이렇게 하면 설치의 전 과정이 다 끝나게 됩니다. 특별히 설정해 줄 것이 없 기 때문에 매우 쉽게 설치를 할 수 있을 것입니다. 나중에 필요하다면 언제 든지 Dolphin Smalltalk를 제어판의 "프로그램 추가/삭제"를 통해서 제거할 수 있습니다. Dolphin Smalltalk를 시작하기 위해서는 "시작 → 프로그램 → Dolphin Smalltalk 98"을 가리킨 다음 안에 들어있는 "Dolphin Smalltalk 98" 아이콘 을 실행하면 됩니다. ---<잠깐!>----------------------------------------------------------- 처음 Dolphin Smalltalk를 설치하여 실행할 때에 화면에 경고 상자가 나타납 니다. 대강의 내용은, 지금 사용하고 있는 Dolphin Smalltalk는 아직 등록 절차를 거치지 않았기 때문에 프로그램의 실행 결과를 저장할 수 없다는 것 입니다. 저장 기능을 사용하려면 Object Arts사에서 무료로 배부하는 등록 번호를 발급 받아야 하는데, 이에 관해서는 조금 뒤에 자세히 설명합니다. -------------------------------------------------------------------- 1.3. Smalltalk 맛보기 프로그램 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 이제 Smalltalk의 설치를 마쳤으므로 설치된 Smalltalk 환경을 실행시켜 봅 시다. 그러면 "Transcript"와 "Workspace"라는 제목을 가진 두 개의 창이 뜰 것입니다. 이 두 개의 창은 모두 Smalltalk의 명령어를 실행시킬 수 있는 기 능을 가지고 있습니다. 그러나 지금 우리가 주목해야 할 창은 'Untitled - Workspace'라는 이름을 가진 창입니다. 이 창에는 아마 "Welcome to Dolphin Smalltalk/98"이라는 큰 제목과 함께 제법 긴 문장들이 들어 있을 것입니다. 이 문장들에는 여러분이 Smalltalk 프로그램을 실행하는데 익숙해지도록, 그 리고 Smalltalk 프로그래밍에 대한 흥미를 느낄 수 있도록 짤막한 Smalltalk 프로그램들이 실려 있습니다. 이제 여기서는 이 창에 들어 있는 Smalltalk 프로그램을 실행하고 그 결과를 알아보는 방법을 알아봄으로써, Smalltalk 명령의 실행방법과 Smalltalk 프로그래밍의 생김새를 어느 정도 파악할 수 있게 하겠습니다. 여러분이 보고 있는 Workspace를 "일터"라고 부릅니다. 여기는 여러분이 Smalltalk 시스템에 명령을 내리거나, 이미 만들어진 프로그램의 결과를 확 인하는 곳입니다. 일터는 '메모장'이나 '워드패드'와 비슷한 동작 방법을 가 지고 있습니다. 즉 흔히 사용하는 텍스트 문서 편집기와 비슷한 동작 방식을 가지고 있다는 말입니다. 이 창에 여러분은 마음대로 글을 쓸 수 있으며, 덩이(block)를 씌워서 한 번 에 여러 개의 글자들을 복사 또는 이동할 수 있습니다. 단지 일터가 일반 텍 스트 편집기와 다른 점은, 이곳에는 Smalltalk의 명령들이 들어가고, 이 명 령을 실행할 수 있다는 것입니다. 일단 마우스나 글쇠판으로 밀대(scroll bar)를 사용해서 아래와 같은 문장이 보이도록 화면을 아래로 말아 내리십시오. ---------------------------------------------------------- "First evaluated by Smalltalk in October 1972, and by Dolphin in February 1995. With a bit of luck the answer will be 7." 3 + 4. ---------------------------------------------------------- 위에 보이는 문장은 Smalltalk에서 실행할 수 있는 명령입니다. 이 위의 다 른 문장들은 Smalltalk의 명령을 어떤 방식으로 실행하는 것인지, 그리고 실 행 결과를 어떻게 얻어낼 수 있는지에 대해서 설명하고 있습니다. 자, 이제부터 우리는 Smalltalk 명령을 내려보게 될 것입니다. 방향 글쇠를 이용하여 커서를 3 + 4. 가 있는 줄로 이동하십시오. '.' 바로 뒤에 커서를 위치시키는 것입니다. 이제 글쇠판에서 <Ctrl-D>를 누르십시오. 그리고 화면을 살펴봅시다. 커서가 놓였던 자리에 덩이(block)가 씌워진 "7"이라는 글자가 나타났습니다. 3 + 4. ☞ 7 여기서 덩이에 둘러싸인 체로 나타난 "7"은 방금 우리가 실행시킨 명령의 결 과입니다. "3 + 4"라는 명령을 실행하였더니 "7"이라는 결과가 나왔다는 말 입니다. 이처럼 Smalltalk에서는 명령을 실행하면 그 결과가 언제나 덩이가 씌워진 체로 나타납니다. 따라서 이 상태에서 바로 글쇠판의 <Delete> 글쇠나 <Back Space>글쇠를 이용하여 덩이를 지우게 되면, 덩이가 씌워진 명령의 실행 결 과도 역시 지워지게 되는 것입니다. ─────────────────────────────────────── 방금 우리가 실행한 명령은 1972년 10월에 Smalltalk 시스템에게 처음으로 내려진 명령이라고 합니다. Object Arts사는 1995년 2월에 자사의 Dolphin Smalltalk에서 이 명령을 실행했다는군요. 이제 다음 명령을 실행할 차례입니다. 200 factorial. 위의 문장 끝에 커서를 갖다 놓고, 앞서 사용했던 <Ctrl-D> 글쇠를 사용해서 명령을 실행시켜봅시다. 어떻게 되었습니까? 200 factorial. ☞788657867364790503552363213932185062295135977687173263294742533244359 44996340334292030428401198462390417721213891963883025764279024263710506 19266249528299311134628572707633172373969889439224456214516642402540332 91864131227428294853277524242407573903240321257405579568660226031904170 32406235170085879617892222278962370389737472000000000000000000000000000 0000000000000000000000 지금 여러분은 200!, 즉 200의 계승을 구한 것입니다. 정말 어마어마한 자릿 수의 결과가 산출되었습니다. 대단하지 않습니까? 아마 C++나 Java 언어에서 기본으로 제공하는 기능만으로 위와 같은 결과를 얻으려면 상당한 노력이 필 요했을 것입니다. ---<잠깐!>---------------------------------------------------------- 계승? 계승(階乘, factorial)이란 n이 하나의 자연수일 때, 1에서 n까지의 모든 자 연수의 곱을 n에 대하여 일컫는 말입니다(한글학회, 1994, 우리말큰사전). ─────────────────────────────────────── 이를테면 5!는 5x4x3x2x1, 즉 120이 되는 것입니다. ---------------------------------------------------------- 그럼 Smalltalk에서 200!을 구하는데 과연 얼마나 시간이 걸릴까요? 바로 다 음의 명령을 실행하면 결과를 알 수 있습니다. <Ctrl-D>를 사용하십시오. Time millisecondsToRun: [200 factorial]. ☞ 1 와우! 200!을 구하는데 1ms정도의 시간밖에 걸리지 않는다고 그러는군요. 1ms초는 1000분의 1초이므로, 매우 빠른 속도로 200!을 구할 수 있다는 것을 알 수 있습니다. 좀 더 세밀하게 측정할 수도 있습니다. 다음 명령을 실행해 보십시오. (이제 각 명령을 실행하기 위해서는 해당 명령 끝에 커서를 위치하고 <Ctrl-D>글쇠 를 누른다는 것쯤은 기억하고 계시겠지요?) Time microsecondsToRun: [200 factorial]. ☞ 1024 위의 명령은 200!을 구하는데 걸린 시간을 100만 분의 1초 단위로 구하는 명 령입니다. 필자의 경우는 약 1024㎲의 시간이 걸렸습니다. 물론 여기서 여러 분이 직접 실행했을 때의 결과는 다를 수 있습니다. 이 결과는 시간값이기 때문에 명령을 실행하고 있는 컴퓨터의 속도에 매우 민감하게 반응합니다. 여기서 중요한 것은 이러한 시간값이 아닙니다. 필요하다면 Smalltalk에서는 100만 분의 1초 단위로 명령 실행 시간을 측정할 수 있다는 것이 중요한 것 이지요. 이제 Smalltalk의 내부를 한 번 들여다보겠습니다. Smalltalk 환경에는 많은 수의 객체(object)가 있으며, 이들 객체는 저마다의 갈래(class)에 속해 있 습니다. 아래의 명령을 실행시키면 현재 Smalltalk 환경에 어떤 갈래들이 있 는지를 한 눈에 알 수 있습니다. Class allClasses asSortedCollection. ☞ a SortedCollection(_FPIEEE_RECORD AbstractCardContainer AbstractToTextConverter ACCEL AcceleratorPresenter AcceleratorTable ....(중략).... DWORDBytes DWORDField EDITSTREAM ... etc ... 이번에도 참 많은 결과가 화면에 표시되었습니다. 그런데 맨 마지막 줄을 보 십시오. "... etc ..."로 끝났습니다. 이는 지금 화면에 표시된 것보다 훨씬 더 많은 수의 갈래가 존재한다는 말입니다. 또한 방금 실행한 명령의 결과를 제대로 알아보기가 어려웠습니다. 왜 그랬을까요? 그것은 바로 갈래의 이름 들을 그냥 줄줄이 늘어놓았기 때문입니다. 지금까지 살펴본 것처럼 Smalltalk에서 어떤 명령을 실행한 뒤에는 언제나 결과가 남습니다. 그 중에는 "3 + 4."의 경우와 같이 간단한 결과를 남기는 경우도 있지만 지금의 경우처럼 복잡한 결과를 남기는 경우도 많습니다. 이와 같이 복잡한 결과를 좀 더 쉽게 보기 위해서, 지금까지와는 다른 명령 의 명령 실행 방법이 준비되어 있습니다. 위에서 내린 명령을 한 번 더 실행해 봅시다. 역시 명령의 끝에 커서를 놓고 글쇠판에서 <Ctrl-I>를 누르십시오. <Ctrl-D>가 아니라 <Ctrl-I>라는 점을 주의해 주십시오. Class allClasses asSortedCollection. ☞ "Inspector 창 열림" 어떻습니까? "Inspecting a SortedCollection"이라는 제목의 창이 화면에 나 타났습니다. 지금 나타난 창을 "객체 탐색기"(object inspector), 혹은 간단 히 "탐색기"(inspector)라고 부릅니다. 창의 왼쪽에는 self부터 시작하여 몇 개의 항목들이 있으며, 그 밑에는 1, 2, 3,...처럼 번호가 매겨져 있습니다. 그리고 오른쪽에는 왼쪽에서 돋이된 항목의 결과를 표시하는 부분이 있습니다. 처음에는 "self"라는 항목이 선택 되어있을 것이고, 오른쪽에는 방금 우리가 <Ctrl-D>로 명령을 실행했을 때와 똑같은 결과가 나타났을 것입니다. 다른 항목들은 내버려두고, 1, 2, 3,...처럼 번호가 매겨진 항목들을 돋이해 봅시다. 그러면 각 항목에 하나씩의 낱말이 오른쪽 창에 보일 것입니다. 이 것이 지금 Smalltalk 환경에서 사용할 수 있는 갈래(class)입니다. 맨 마지 막 항목은 은 몇 번입니까? 필자의 경우는 567입니다. 결국 이 말은, Smalltalk 시스템에는 500개가 넘는 갈래가 존재한다는 말입니다. 갈래들을 한 번 쭉 훑어보았으면 이제는 열려있는 탐색기를 닫으십시오. 계속 명령어를 실행시켜봅시다. 아래의 명령은 Smalltalk 환경에 도대체 몇 개의 객체(object)들이 존재하는지를 보여줍니다. <Ctrl-I>를 쓰지 말고 <Ctrl-D>로 실행하십시오. Object allSubinstances size. ☞ 44121 필자의 경우에는 44121개의 객체가 있다고 보고되었습니다. 여러분의 경우에 는 좀 다른 숫자가 나타날지도 모르겠습니다만, 여하튼 현재 돌아가고 있는 Smalltalk 환경에 적어도 4만개가 넘는 객체들이 서로 맡은 바 임무를 수행 하면서 돌고 있습니다. '객체'니 '갈래'니 하는 말이 생소하십니까? 이제부터 점점 명령의 의미를 파악하기가 어려워집니까? 전혀 신경 쓸 필요가 없습니다. Smalltalk를 공부 하면서 차차 자세하게 알게 될 것이기 때문입니다. 지금은 단지 Smalltalk의 명령을 실행하고 결과를 알아보는 방법에만 초점을 맞춥시다. 지금까지 우리는 몇 가지의 Smalltalk 명령을 실행해 보았습니다. 여기서 Smalltalk 명령을 실행하는 방법에 대해서 지금까지 알아본 것을 간단하게 정리하고 넘어가도록 하겠습니다. 1. 실행해야 할 명령 끝에 커서를 놓는다. 2. <Ctrl-D>글쇠를 입력하면 명령이 실행되고 결과가 나타난다. 3. 나타난 결과가 지나치게 복잡하면 <Ctrl-I>를 사용하여 "탐색기" 를 통해서 결과를 살펴볼 수 있다. 정리가 되십니까? 아직까지 이해가 잘 안 가시는 분들은 여기서 잠시 휴식을 취하십시오. 그리고 처음부터 차근차근 다시 한 번 제 글을 따라가면서 명령 을 실행시켜 봅시다. 자, 그럼 이제 다음의 명령을 실행시켜보겠습니다. <바탕글 1> 간단한 디지털 시계 ---------------------------------------------------------- digitalClockProcess := [[ Processor sleep: 1000. (DesktopView current canvas) font: (Font name: 'Arial' pointSize: 36) bold; text: Time now printString at: 10@10; free ] repeat] fork. ---------------------------------------------------------- 지금까지 우리는 한 줄 짜리 Smalltalk 명령을 실행해 보았습니다. 그런데 위의 <바탕글 1>은 일곱 줄로 이루어진 명령입니다. 이 명령을 그럼 어떻게 실행할 수 있을까요? 방법은 간단합니다. 위의 일곱 줄에 모두 덩이를 씌우십시오. 덩이를 씌우는 방법은 1. 마우스를 이용하여 끌어서 덩이를 씌우는 방법. 2. 명령의 첫 글자에 커서를 놓고, <Shift>를 누르면서 방향 글쇠를 이용하는 방법 등이 있습니다. 둘 중에서 여러분이 편리한 것을 골라서 사용하시기 바랍니 다. 어쨌건 중요한 것은 위의 일곱 줄에서 한 글자도 빼놓지 말고 덩이를 씌 워야 한다는 것입니다. 덩이를 씌웠으면 이제는 앞에서 한 것처럼 <Ctrl-D>를 입력하여 명령을 실행 시켜 보겠습니다. 어떻게 되었습니까? <바탕글 1> ☞ a Process(a CompiledExpression, priority: 5, state: #ready) 일곱 줄에 덩이를 씌운 다음 <Ctrl-D>를 누르자마자 위의 결과를 뿌리면서 화면 왼쪽 구석에 큼지막하게 현재 시간이 표시되는 것을 볼 수 있습니다. 시간이 나타나는 자리에 다른 그림이 그려지더라도 곧 그 그림은 지워지고 그 자리에 시간이 나타납니다. 아주 큼지막하게 말입니다. 결과적으로 <바탕 글 1>은 간단한 디지털 시계를 만들어서 화면에 보이는 프로그램이었습니다. 그렇지만 언제나 저렇게 큼지막한 시계가 표시되어있으면 때로는 불편할 때 가 있을 것입니다. 자, 이제 우리가 방금 표시한 디지털 시계를 없애도록 합 시다. 다음 명령을 실행하십시오. 한 줄 짜리 명령이므로 덩이를 씌울 필요 는 없습니다. 그냥 명령의 끝에 커서를 놓고 <Ctrl-D>를 눌러보십시오. digitalClockProcess terminate. ¬ UserLibrary default invalidate: nil lpRect: nil bErase: true. ☞ true ※ 줄 끝에 '¬' 표시가 되어 있는 것은 한 줄에 쓸 수 있는 글자수의 제한 때문에 어쩔 수 없이 두 줄 이상으로 갈라서 나타낸 것을 의미합니다. 그러므로 이 표시가 있다는 것은 바로 다음 줄과 이어서 한 줄임을 나타 냅니다. 위의 명령을 실행하면 여태껏 표시되던 시계는 없어지고 'true'를 결과값으 로 받게 됩니다. 앞서 우리는 두 가지 명령을 실행해 보았습니다. 하나는 <바탕글 1>로써 화 면에 시계를 보이는 명령이고, 나머지 하나는 동작하고 있는 시계를 멈추어 서 지우는 명령이었습니다. 그런데 이 명령을 실행한 뒤에 나타나는 결과값 은 무엇이었습니까? 둘 다 사실 우리에게는 별로 쓸모 없는 결과입니다. 우 리는 시계를 보이고 없애는 것이 중요하지, 실제로 이 명령이 실행되고 난 뒤에 어떤 결과를 일터에 표시하는지는 별로 관심이 없습니다. 이럴 때 Smalltalk에서 명령을 실행하는 세 번째의 방법이 있습니다. 이것은 바로 <Ctrl-E> 글쇠입니다. 명령어를 실행하고 나서 보고되는 결과를 굳이 일터 화면에 표시하고싶지 않을 때 사용합니다. 우리가 방금 실행했던 <바탕글 1>과 "UserLibrary"로 시작하는 명령을, 이번 에는 <Ctrl-D> 대신 <Ctrl-E>를 사용하여 실행시켜 보십시오. 한결 깔끔하게 실행되는 것을 볼 수 있습니다. 자, 다시 한 번 정리합시다. Smalltalk에서 명령을 실행하는 방법은... ---<정리>---------------------------------------------------------- Smalltalk의 명령 실행법 * <Ctrl-D>: 가장 일반적인 형태. 명령을 실행하고 나서 결과를 보인다. * <Ctrl-I>: 명령을 실행하고 난 결과가 복잡할 때, 결과값을 탐색한다. * <Ctrl-E>: 명령 실행 자체에 의미가 있고 결과는 무시하고 싶을 때 쓴다. ---------------------------------------------------------- ---<다른 Smalltalk>--------------------------------------- Dolphin Smalltalk가 아닌 다른 Smalltalk 환경의 경우 명령 실행 방법이 다 를 수 있습니다. 일단 이에 대해서는 나중에 명령 실행을 중점적으로 다루는 마당에서 자세하게 설명할 것입니다. ---------------------------------------------------------- 자, 그럼 계속해서 Smalltalk가 어디까지 할 수 있는지를 시험해 봅시다. 아 래 명령은 여러분이 듣고싶은 음성(wave) 파일을 연주해 줍니다. (Sound fromFile: 'xxxxx.wav') woofAndWait; woofAndWait. 위에서 'xxxxx.wav'를 자신이 연주하고 싶은 파일 이름으로 바꾸어 주면 됩 니다. 위의 명령 역시 실행된 후의 결과값 보다는 명령 실행 자체가 중요하 므로, <Ctrl-E>를 사용하여 실행시켜 봅시다. 필자는 (Sound fromFile: 'C:\Windows\Media\Ding.wav') woofAndWait; woofAndWait. 로 고쳐서 실행해 보았습니다. 여하튼 위의 명령은 우리가 지정한 음성 파일 을 두 번 연주해 주는 일을 합니다. 우와! Smalltalk에서 멀티미디어까지??? 다음 명령은 이미 프로그래밍 언어를 접해본 사람들에게 의미가 있을지도 모 르겠습니다. 100개의 원소를 가진 배열을 만들어 내는 명령입니다. (1 to: 100) collect: [:i | i]. ☞ #(1 2 ...(중략)... 99 100) 결과가 너무 많습니까? <Ctrl-D>를 사용하지 말고 <Ctrl-I>를 사용하여 탐색 해 봅시다. (배운 것을 잘 써먹는 것이 정말 중요하겠지요?) 위의 명령은 1 부터 100 까의 수 100개가 들어 있는 배열(array)을 만들어 내는 명령입니 다. '배열'은 간단히 말해서 번호가 붙은 '통'이라고 생각하면 되겠습니다. 자, 이제 처음보다는 Smalltalk 명령 실행에 많이 익숙해졌을 것입니다. 이 제는 좀 더 부드럽게 진행해 나갈 수 있겠습니다. 자, 끝까지 해 봅시다. 지금도 일요일이면 TV에서 복권 추첨을 합니다. 이 때가 복권을 산 사람들의 희비가 엇갈리는 순간이겠지요 아래의 명령은 주택복권을 추첨하여 여섯 개 의 번호를 담은 배열―앞에서 배열은 '번호가 붙은 통'쯤으로 이해하라고 말 씀드린 것, 기억하십니까?―을 결과값으로 넘겨줍니다. (Random new next: 6) collect: [:n | (n * 49) rounded]. ☞ #(37 48 22 19 22 24 ) "첫 번째 실행" ☞ #(4 36 20 37 24 5 ) "두 번째 실행" ☞ #(18 43 28 15 41 22 ) "세 번째 실행" ─────────────────────────────────────── ...(중략)... 위의 명령은 실행할 때마다 서로 다른 번호를 나타냅니다. 신기하지 않습니까? 여 러분이 즐겨하던 게임에서 매번 다른 상황이 연출되는 것도 이와 같은 원리가 적 용되었기 때문입니다. 위의 명령은 다 좋지만 한 가지 결점이 있습니다. 가끔가다가 두 개 이상의 같은 수가 나올 확률이 있다는 것입니다. (첫 번째 실행 결과를 잘 보십시오.) 실제로 복권을 추첨할 때에는 같은 숫자가 두 번 이상 나오면 다시 추첨을 합니다. 그래 서 중복된 수가 나오지 않도록 하는데요... 아래의 명령은 바로 이러한 원리를 그 대로 적용한 예입니다. 명령이 두 줄 이상이므로 글쇠판이나 마우스로 덩이를 씌 운 후 실행하십시오. <바탕글 2> 복권 추첨 프로그램 ---------------------------------------------------------- r := Random new. s := Set new. [ s size = 6 ] whileFalse: [s add: (r next * 49) rounded]. s asSortedCollection asArray. [ 실행 결과 ☞ #(15 18 21 25 31 39 ) "첫 번째 실행" ☞ #(6 11 21 26 27 31 ) "두 번째 실행" ...(중략)... ---------------------------------------------------------- <바탕글 2>는 단순히 중복된 숫자만 나오지 않는 것이 아니라, 작은 수에서 큰 수로, 즉 오름차순으로 정렬된 결과를 남깁니다. 이제 정말 복권 추첨 프 로그램 같습니까? 지금까지는 글자들하고만 놀았으므로, 이번에는 여러분의 그림 솜씨를 마음 껏 발휘할 수 있는 기회를 드리겠습니다. 다음 명령을 <Ctrl-E>를 사용하여 실행하십시오. scribble := Scribble show. 화면에 'a Scribble'이라는 제목이 달린 노란색 창이 열릴 것입니다. 주저하 지 말고 이 창 위에 마우스를 끌어서 그림을 그려봅시다. 아주 잘 그려질 것 입니다. 여러분의 그림 솜씨가 여기에서 드러나겠지요? 그림판이 좀 썰렁합니다. 아래의 명령을 한 번 실행시켜 보십시오. 방금 여 러분이 실행했던 명령어의 결과로 만들어진 그림판은 닫지 않도록 하십시오. EtchASketch showOn: scribble model. 위의 명령을 실행하면 "Etch A Sketch"라는 그림판이 열릴 것입니다. 그리고 방금 여러분이 노란색 그림판에 그렸던 그림이 그대로 나타납니다. 아마 Dolphin Smalltalk를 만든 영국에서는 "Etch-a-Sketch"라는 그림판이 보편적 으로 사용되고 있나봅니다. 지금 화면에는 노란 그림판과 Etch-aSketch가 떠 있습니다. 둘 중 아무 곳에 나 여러분이 그림을 그리면 다른 한 쪽에 그것이 바로 반영이 됩니다. 즉 둘 은 모양은 서로 다르지만 같은 자료를 공유하고 있습니다. 이것이 Dolphin Smalltalk에서 응용 프로그램을 만드는 "MVP 짜임새"의 예를 보여주는 것입 니다. "MVP 짜임세"에 대해서 공부하려면 아직도 많은 여정이 남았지만, 그 때까지 지치지 말고 열심히 합시다. 그림을 다 그렸으면 이제 열려있는 두 개의 그림판을 닫으십시오. 아래 명령은 "발자취 창"(walkback window)를 표시하는 명령입니다. 발자취 창에 대해서도 나중에 상세하게 다루겠지만, 여기서는 단지 프로그램이 어떤 자취로 실행되어왔는가를 나타내는 창쯤으로 생각하면 됩니다. self halt. 위의 명령을 실행하면 "발자취 창"이 열립니다. 보통의 경우 그냥 <Terminate> 단추를 누르는 것으로 문제가 해결됩니다. 만일 다른 프로그래 밍 언어를 공부해 본 사람이라면 여기서 <Debug> 단추를 누름으로써 Smalltalk 환경의 벌레잡개(debugger)를 구경하실 수 있습니다. 물론 이렇게 해서 열린 벌래잡개는 Smalltalk 환경을 들여다볼 수 있는 중요한 도구입니 다. 그러므로 잘못 다루는 일이 없도록 조심하십시오. 나중에 Smalltalk에 대해서 어느 정도의 지식이 생기면 그 때 벌래잡개에 대해서 깊이 있는 공부 를 할 수 있을 것입니다. 운전도 못하면서 자동차 뚜껑을 열어서 차를 망그 러뜨리는 일이 있어서는 안되겠지요? ^^: 다음 명령은 Smalltalk 환경에서 'Dolphin'이라는 낱말이 포함된 바탕글 (source code)를 찾아내는 명령입니다. 3MB가 넘는 큰 용량의 파일을 뒤져서 내용을 찾는 것이기 때문에 몇 십초 정도의 시간이 걸릴 수도 있습니다. 조 금만 기다리면 'Dolphin'이라는 낱말을 포함하고 있는 여러 가지의 바탕글들 이 나타나게 될 것입니다. SmalltalkSystem current browseContainingSource: 'Dolphin'. "Containing Source: 'Dolphin'"이란 이름이 붙은 창은 두 부분으로 이루어 져 있습니다. 위쪽은 찾아낸 바탕글을 나타내고, 아래쪽은 해당 글의 자세한 내용이 표시되는 곳입니다. 과연 Smalltalk 환경에서 Dolphin이라는 낱말이 몇 번이나 나왔으며, 또 어디서 사용되고 있는지를 한 번 살펴보시기 바랍니 다. (참고로 '바탕글'을 명령을 써넣은 글이라는 뜻입니다.) 이제 마지막 명령입니다. 우리는 지금까지 여러 가지 명령을 실행해 왔는데, 이번 명령처럼 썰렁한 것은 없을 것입니다. 어느 정도로 썰렁하냐고요? 직접 실행을 해 보십시오. 아래의 명령을 실행해 봅시다. View destroyAll. 위의 명령이 실행되자마자 Smalltalk 환경의 열려있던 모든 창이 없어지고 "Transcript"라는 이름의 창만 하나 덜렁 남아 있게 되었습니다. 썰렁하지 않습니까? ^^: 방금 내린 명령은 주로 Smalltalk 환경을 깨끗이 하고 싶을 때 사용하는 명 령입니다. 지금까지 우리는 많은 명령을 실행해서 결과를 출력했으므로 우리 가 가지고 놀았던 흔적(?)을 깨끗이 하는 것이라고 생각하면 되겠습니다. 지금까지 우리는 Smalltalk에서 여러 가지 명령을 실행해 보았습니다. 그리 고 명령을 어떻게 실행하는지에 대해서도 알아보았습니다. 명령을 실행할 때 에는 <Ctrl-D>, <Ctrl-E>, <Ctrl-I>의 세 가지 글쇠를 사용한다는 것도 알아 보았습니다. 또한 한 줄 짜리 명령과 여러 줄에 걸친 명령을 실행하는 방법 도 알아보았습니다. 이제 Smalltalk에서 명령을 내리는 것이 별로 어렵지 않을 거라고 생각합니 다. 만약 잘 모르겠으면 Smalltalk를 빠져나간 다음 다시 들어와서 이 글에 있는 내용을 다시 한 번 따라해 보시기 바랍니다. 이제 Smalltalk를 끝내야 하는데, 앞서 말씀드렸듯이 저장의 문제가 남아 있 습니다. Smalltalk를 끝낼 때마다 현재 Smalltalk의 상태를 저장하겠느냐고 묻게 됩니다. 지금은 아직 등록 절차를 밟지 않았으므로 저장은 불가능합니 다. 오히려 이것이 더 잘된 일인지도 모르겠습니다. 저장이 안 된다는 말은 여러분이 무슨 실수를 하더라도 그것이 Smalltalk 환경에 영향을 주지 않음 을 의미하기 때문입니다. 그러므로 당분간 Smalltalk에 익숙해질 때까지 저 장 기능 없이 연습해 보는 것도 도움이 될 것입니다. 등록 절차에 관한 것은 바로 다음에 설명을 드리도록 하겠습니다. 계속...