SmalltalkObjectsandDesign:Preface
- 서문
서문
스몰토크, 객체 그리고 디자인
Chamond Liu
1996년 원판을 약간 수정하여 재인쇄
All rights reserved. Copyright © 2000 by Chamond Liu
본 저서의 어떠한 부분도 출판업체의 서면 동의 없이는 복사, 녹화, 테이핑을 포함한 그래픽, 전자, 기계적 수단이나 형태 또는 어떠한 정보 저장이나 정보 검색 시스템에 의해 전달 및 재생산되어서는 아니된다.
본 저서의 저자와 출판업체는 책에 포함된 정보와 관련해 명시적으로나 함축적으로 어떠한 보장도 하지 않는다. 저자와 출판업체는 본 책에 포함된 정보의 사용으로 야기된 어떠한 손실이나 피해도 책임질 권리가 없다.
본 저서에서 언급한 모든 제품은 각 소유자의 트레이드마크 또는 등록된 트레이드마크이다. 본 저서에 사용된 용어는 어떠한 트레이드마크 또는 서비스 마크의 타당성에도 영향을 미치는 것으로 간주되어선 안 된다.
iUniverse.com, Inc.의 imprint인 toExcel이 출판
추가 정보는 아래 주소를 이용한다:
iUniverse.com, Inc.
620 North 48th St. , Suite 20 1
Lincoln, NE 68504
www. i Universe. com
ISBN 1-58348-490-6
Printed in the United States of America
"My good friend, every profession requires
effort and devotion and practice."
- advice to the young Perceval
[de Troyes 1 1 90]
"나의 벗에게, 모든 직업은 노력과 헌신과 실천을 요한다."
-젊은 친구 Perceval에게
[de Troyes 1190]
감사의 말
이 책은 두 가지 활동에서 비롯된다-교과과정을 개발하고 교육하는 활동과 소프트웨어를 개발하는 활동이 그것들이다. 하지만 사실적인 자원은 필자가 그 동안 만났던 사람들이다. 그 중 다수는 소프트웨어에 관한 필자의 사고를 깊이 형성시켜주었고-Dave Collins, Peter Deutsch, Amarjeet Garewal, Steve Goetze, Ralph Johnson, Doug Lea, Bertrand Meyer, Tom Morgan, Dave Thomas, Rebecca Wirfs-Brock, 그리고 Kirk Wolf-그 외 다수는 작지만 엄청나게 중요한 인상을 남겼다: Bruce Anderson, Marilyn Bates, Katherine Betz, Desmond D'Souza, Phil Hartley, Richard Helm, Felix Laura, 그리고 John Vlissides. 그 외에 필자가 노력했던 기업의 실제 객체지향 디자인 및 프로그래밍 문제에 관련된 사람들, 그리고 수년간 객체, 스몰토크, C++의 교육에 관해 가르쳐준 모든 강사와 학생들을 합하면 수가 엄청나므로 일일이 열거하지 못한다.
원고에 대한 자신의 생각을 공유해준 것만으로도 많은 사람들에게 고마움을 느낀다. Bruce Anderson은 진부한 표현식과 예제들을 과감히 꼬집어주었고, Kent Beck은 필자의 교육학적 접근법을 재고하도록 도와주었고, Katherine Betz는 논의를 간소화시켰으며, Michele Chote는 문체의 실수를 잡아주고, Eric Clayberg는 스몰토크에 관한 새로운 것들을 교육시켜주었다. 내가 아는 역사가인 Dave Collins는 연대표에 관한 정확한 정보를 제공해주었고, Ken Cooper는 어색한 변화 시점을 지적해주었다. Lisa Goetze는 실습문제를 개선하였고, Steve Goetze는 성급한 의견에 대한 반응 테스트 대상으로서 시대정신에 민감하여 불필요한 주장을 빼도록 경고해주었고, Ralph Johnson의 열정과 전술은 필자의 통찰력이 막다른 골목에 다다랐을 때에도 계속해 나갈 수 있도록 도와주었으며, Doug Lea는 기술적 품위가 없었을 때에도 고취시켰고, Ruth Liu는 필자가 말한 것과 실제로 의도한 것을 구별해주었다. Tom Morgan은 구조적, 개념적 결함을 추려내주었고, Larry Smith는 IBM 스몰토크 제품의 성실한 사용자였으며, Dave Tomas는 ANSI 표준화 노력의 동향에 방심하지 않도록 해주었고, Michael Tsuji는 객체를 모르는 사람의 관점에서 전체 원고를 성의껏 반복해서 분석하여 독자가 이해하지 못할 법한 부분을 수없이 강조해주었고, 지극히 예리한 Kirk Wolf의 감성은 객체에 대한 조잡한 주장을 잡아주었다. Kim Arthur, David Bernstein, Wai-Mee Ching, Bill Creager, Amarjeet Garewal, John Granlund, Greg Lee 또한 유용한 의견들을 제공해주었다. 절묘하게 어울리는 일화적 여담을 제공해준 Kent Beck, Roy Campbell, Dave Collins, Erich Gamma, Tami Kinsey, Hal Lorin, Kirk Wolf에 감사한 마음을 전한다.
출판업계의 숨은 영웅들에게도 감사의 말을 전한다: Tommy Barker, Steve Brill, Lee Fitzpatrick, Leslie Haimes, Ted Kennedy, Mary Piergies, 그리고 특히 이 책을 내는 데에 관심을 가져준 Marjan Bace; 이해를 돕고 적극적 원고 정리를 도와준 Dave Lynch; 다듬어지지 않은 원고를 매력적으로 바꾸어준 Sheila Carlisle의 관심과 정교함에도 감사하는 바이다. 또한 이 프로젝트를 시작할 수 있도록 시간을 준 IBM에도 감사한다. 필자나 IBM이나 이렇게 시간이 오래 소요될 줄은 예상하지 못했다.
모든 것에는 근원이 있다고 생각한다 (여차여차한 이유가 아니었다면, 이런저런 일은 절대로 발생하지 않았을 것이다). 따라서 필자를 비롯해 실습 중인 모든 객체 지향 프로그래머는 스몰토크를 개발한 Xerox PARC사의 Learning Research Group에 근무 중인 Alan Kay와 그 동료들, 그리고 C++ counterpoint를 제공해준 Bjarne Stroustrup에 빚을 진 셈이다. 이러한 서로 다른 관점들 간의 변증법은 앞으로 실릴 내용 대다수에 영감이 되었다.
CHAMOND LIU, Clarity Computing
서문
이 책은 스몰토크와 객체를 다소 균형 있게 다룬 책이다. 다시 말해, 독자의 마음이 산만해지지 않도록 중요한 객체 지향 디자인의 발상들을 알려주고 구체화하기에 충분한 스몰토크가 있다는 말이다. 스몰토크는 이를 위한 훌륭한 수단이 되는데 그 이유는 스몰토크는 규모가 작고 간단하여 이에 대한 학습이 디자인의 학습에 방해가 되는 경우는 최소한에 그치기 때문이다. 그와 동시에 학업적 논의로 악화될 수 있는 것은 명확히 할 수 있을 만큼 풍부하다.
스몰토크나 객체에 관한 상급 서적은 결코 아니다. 숙련된 스몰토크 개발자들은 완전히 인식하고 있지만 말로 설명하기에 너무 명백한 것으로 간주하는 문제들에 집중하고자 노력했다. 이러한 문제들은 오늘날 기초적으로 간주하는 내용부터 ("객체란 무엇을 의미하는가?") 복잡한 내용까지 ("객체의 패턴을 재사용할 수 있는가?") 범위로 하지만, 대부분은 중간에 위치한다. 필잔느 이 모든 "명백한" 문제들을 내재화하기까지 얼마나 많은 시간이 (너무 많은 시간이) 걸렸는지 생각해보면서 그 과정에서 적절한 해설들이 있었더라면 문제를 어느 정도 피할 수 있었을 것이란 상상을 한다. 따라서 독자들도 어느 정도 문제를 피해갈 수 있기를 희망한다.
실질적으로 디자인에 관해 말하지 않고서는 객체와 스몰토크를 논할 수 없을 것이다. "디자인"이란 모든 컴퓨터인이 아는 단어이면서도 많은 사람들이 그 의미에 대해서는, 혹은 그것이 생산하는 내용이나 그것이 어디서 시작하고 끝나는지에 대해서는 의견을 일치시키지 못한다. 이 책의 목적을 위해, 디자인이란 대안책을 발견하고, 대안책들을 따져본 후 그 중에서 의식적으로 선택하는 것이라고 밝혀둔다. 삶과 마찬가지로 디자인 또한 올바른 균형을 발견하는 것과 관련된다. 디자인의 이러한 의미에서 우리는 직무 기술(job description)이 우리가 실제로 하는 일과 완전히 다르다 하더라도 디자인을 해야 할 의무가 있다: 객체 분석이나 모델링, 코드 작성, 또는 당근 껍질을 까면서 디자인 대안책을 발견하여 따져보거나 거부할 수 있는 것이다.
여기서 목표는 좀 더 베테랑 소프트웨어 개발자처럼 디자인하는 것이다. 그들은 다년간의 경험을 바탕으로 대안책들 중에서 빠르고 무의식적으로 선택하는데, 그 모습이 마치 말을 움직이는 체스 그랜드 마스터와 같다. 이러한 경험이 부족한 초보자들은 실행 가능한 대안책들을 발견하기가 힘들고, 미묘한 대안책들을 발견하는 데 많은 시간을 소요한다. 그들을 위해 필자는 대안책들과 그것들 간 상충관계(tradeoff)를 입증하여 전문가들과 동일한 디자인 대안책들을 고려할 수 있는 외부의 기회를 제공한다.
여기서 사용된 접근법은 주제를 모두 완전하게 포함한 것이 아니다. 클래스 라이브러리, 스몰토크 환경에 이용 가능한 협력적 개발 도구 또는 시각적 프로그래밍의 논의, 표기법과 방법론에 관한 담론을 체계적으로 살펴보지는 못했다. 표기법은 그 설명만큼이나 모호하게 만들 소지가 있으므로 꼭 필요하기 전까지는 사용을 삼갔다. 오해의 소지가 있을 것 같아 분명히 밝히건대, 이 책은 스몰토크 수법이나 기법을 모은 카탈로그가 아니다.
스몰토크는 객체 지향적 소프트웨어에 관해 사고하는 유일한 방식은 아니다. 가장 널리 알려진 C++는 전체적인 객체 지향적 경험을 풍부하게 해준다는 점에서 스몰토크와 많은 면에서 분명히 상반된다. 따라서 필자는 객체에 대한 당신의 이해를 향상시킬 수 있을 때마다 C++에 대한 설명을 제공할 것이다.
객체에 생소한 사람들은 순서대로 책을 읽는 편이 이해가 빠를 것이다. 반면 필자는 이 책의 일부를 선택적으로 읽는 데 약하기 때문에 많은 장들은 상대적으로 독립적이므로, 앞에 설명된 내용을 소화하지 않고도 접근이 가능하다. 따라서 자신의 배경과 목표에 따라 챕터와 절을 골라 읽을 수 있고, 이해할 수 없는 내용에 부딪히면 (또는 이해하고 싶지 않은) 우선 내버려두고 후에 다시 읽으면 된다. 필요한 첫 두 개의 챕터만 참조하여 즉시 스몰토크로 (챕터 3) 빠지는 것도 가능하다.
가장 단순한 것이 가장 명확하고 놀라운 교훈을 주므로 예제들은 가능한 한 단순하게 구성하였다. 실습문제는 다루는 주제를 이해하기 위해 적극적인 참여가 필요할 때에만 실었기 때문에 불규칙적이다. 스몰토크 작업장을 필요로 하는 프로그래밍 연습과 디자인 연습의 결합도 있다. 해결책에는 충실한 디자인 연습이 따르지만 물론 답안이 있는 연습이라 하더라도 스스로 먼저 시도해볼 것을 권한다.
프로그래밍 연습은 IBM 스몰토크 기반(base)에 작성된다. 이는 IBM 스몰토크의 표준(Standard) 또는 전문가(Professional) 버전이나 VisualAge에서 작업할 수 있다. 그 중 대부분은 그들 자체 또는 변형(variation)을 다른 스몰토크 dialect에서도 작동하기에 충분할만큼 포괄적이지만, 야망이 있는 독자들만 시도해야 한다. 그러한 독자들을 위한 작은 힌트 몇 가지를 부록에서 소개하고 있다. 윈도잉(windowing) 연습은 주목할 만한 예외이다: 이를 다른 dialect로 번역하는 것은 아무리 단호한 독자라 하더라도 자신의 능력 밖의 일일 것이다. 모든 dialect는 고유의 이벤트와 윈도잉 프로토콜을 갖고 있으므로 다른 dialect로 윈도우를 빌드하는 것은 완전히 다른 경험이다.
학습은 사람마다 다르게 발생한다. 이러한 이유로 독자들이 필요에 따라 찾을 수 있도록 구분해 놓았다-필자는 이를 "논평(commentaries)"이라 부른다. 이러한 구분은 다양하게 기술적이거나 (객체를 실행하는 다른 방식과 비교하듯, 특히 C++), 역사적이거나 철학적이다.
이 책을 끝마치고 나면 베테랑처럼 소프트웨어 문제에 대해 생각하고 스몰토크에서 자신의 생각을 실행할 수 있길 바란다. 하지만 능숙하진 않을 것이다. 객체 지향 디자인과 스몰토크를 모두 익히는 것은 실제 실습을 통해서만 이룰 수 있다. 물론 이것들은 자동차 운전부터 피아노 연주까지 모든 활동에 자명한 이치다. 하지만 스몰토크는 대부분 소프트웨어 도구 이상으로 자신을 뛰어들게 하여 언어 및 환경에 빠지도록 요구한다. 모험에 대한 관심이 있다면 운전하는 법을 배울 때보다 더 도움이 되는 것은 확실하다.
구성에 관한 내용
본 저서는 정통적 책이 아니다. 책의 구조 대부분은 일주일마다 약 36시간씩 일반 스몰토크 초보자들의 추진력과 열의를 유지하면서 그들이 정말로 중요한 내용을 학습하도록 도우면서 겪은 필자의 경험으로부터 비롯된 것이다. 예를 들어, 다형성이 공식적인 주제가 되는 것은 14장부터인데, 중요성이 14번째여서가 아니라 그쯤 되어야 학생들이 그로부터 아드레날린이 분출되는 것을 느낄 수 있을 만큼 성숙하기 때문이다.
예측 가능하거나 단조로운 리듬은 찾지 않을 것이다. 사람들은 가끔씩 땀을 흘리면서 스몰토크 깊은 곳에서 프로그래밍을 하고, 또 어떤 때는 가만히 앉아서 개념들이 어떻게 서로 관련되는지를 반성할 때 최상의 학습 효과를 얻는다. 이 책이 코딩 자체보다는 사고하는 방식을 중점으로 둔다는 점을 감안해 어떤 장은 (제 4장) 연습문제로만 구성되어 있다.
이제 내용과 관련해 몇 가지 경고를 해야겠다.
처음부터 15장까지는 모든 실습 개발자들이 스몰토크에서 객체에 관해 완벽히 알아야 하는 기본 내용을 다룬다. 첫 두 장은 완전히 고무적인 방식으로 객체, 클래스, 상속의 기초작업을 구축한다. 모든 미묘한 차이, 역설과 같은 내용은 나중에 위해 남겨둔다.
제 3장은 사실상 이 책에서 유일한 "언어"의 설명이다. 아마도 스몰토크 언어의 95%에 해당할 것이며, 공통적으로 가진 오해(gotcha)를 미리 경고한다. 제 4장은 제 3장의 수업을 가능한 한 많은 요점과 함께 실습할 수 있는 기회에 집중했다. 스몰토크 프로그래밍 환경에서 살아가는 것이 어떤지에 대한 온전한 직관이 드러나야 한다. 이 자료를 최소한 약간은 퍼뜨리는 방법이 정통적인 접근법에 해당하지만 스몰토크에는 한 번에 많은 것을 피하기가 가능하다는 규칙이나 사실은 거의 없다.
제 5장과 6장은 객체 지향의 주요 개념적 문제를 집중 공략하기 시작하는데, 여기에는 추상 클래스, 컨테이너, 그리고 객체 정체성이 포함된다. 다음으로 7장과 8장은 기본 애플리케이션을 디자인하고 구현하는 데에 있어 기본을 따져보고자 한다. 제 9장과 10장은 온전한 객체의 실습에 필수적인 개념들을 논한다. 무엇보다 이 자료는 상속이 언제 올바른 디자인을 생성하는지를 묻는다.
그 다음으로, 11장부터 13장 세 장은 사용자 인터페이스의 주제에 관한 한 단원을 형성한다. 모델-뷰-컨트롤러의 필수 논의부터 시작해 (Smalltalk의 IBM dialect에 특정적인) Motif 프로그래밍으로 이어지고, 사용자 인터페이스를 망치지 않는 방법으로 마무리 짓는다. 13장은 특히 객체에 관한 서적에서는 드문 내용을 싣고 있다. 이는 객체와 사용자 간 연관성을 강조하고, 고개를 숙인 프로그래머들에게 실제 도덕적 의무를 대면시켰다.
제 14장과 15장은 모든 사람이 다형성의 가치와 적용 가능성을 내재화하기에 충분할 만큼 여러 관점에서 다형성을 상세히 설명한다. 이 장들은 필수요소의 범위를 적절하게 마무리하기 때문에 이 부분이 없다면 필자나 독자에게 모두 곤란할 것이다.
제 16장은 메서드 전송(method dispatch), 저장소 관리와 같은 작업을 주로 스몰토크를 강조하여 분명히 설명하면서 관점을 위해 C++와 대조방법을 이용한다. 이 장은 이렇게 대조적인 작업이 객체 지향 언어의 개발 형태에 어떻게 영향을 미치는지 설명하는 데에 있어 그다지 학업적인 접근법은 아니다.
제 17장은 상속의 두 가지 구분된 원리, 즉 필자가 미녀와 야수라고 부르는 이 원리에 대한 인식을 높일 것이다. 원숙한 객체 지향 디나이너는 이 문제에 민감하다는 특징을 갖고 있다. 이번 장에는 일관성에 대해 (201 페이지) 거의 철학적이라고 할만큼 꽤 상세히 논하는데, 이 책에서 가장 의기양양한 부분에 해당할 것이다.
제 18장은 가장 선호하는 디자인 패턴을 몇 가지 소개하고, 스몰토크에서 그러한 패턴을 실현하는 방법을 다룰 것이다. 하지만 너무 많은 개념에 의지하기 때문에 독자는 이전에 발생했던 프로그래밍과 사고를 모두 인식하고 있을 때에만 패턴을 이해할 것이므로 무언가 학습했다는 느낌을 확인할 수 있을 것이다.
제 19장은 객체 지향 프레임워크가 무엇이며 하나의 클라이언트/서버 프레임워크에서 왜 중요한지를 설명한다.
제 20장은 다시 이해를 돕기 위해 작성되었으며, 가장 선택적인 장이다. 프로그래머로부터 구매하는 입장에서 메타클래스의 (class의 클래스) 기본내용을 논할 뿐만 아니라 스몰토크가 객체의 획일화된 뷰를 유지하기 위해 어떠한 일을 하는지도 장황하게 설명한다. 메타클래스는 이 책의 마지막 기술적(technical) 주제로, 독자는 스몰토크를 개념적 기반을 인정하기 전에 그것을 철저히 내재화할 필요가 있으므로 마지막으로 다루었다.
책은 일반적인 객체 지향 개발의 노력에서 무엇이 옳고 그른지를 주관적으로 평가한 내용으로 마무리된다 (제 21장).
인쇄체 규칙
MyClass 와 같이 굵은체는 스몰토크 이름과 코드를 나타낸다. 이탤릭체는 'Display 메뉴 항목을 고르시오'와 같이 강조 내용과 특수 명령어를 나타낸다. 컴퓨터 화면에 표시되는 텍스트는 굵은 이탤릭체로 표시되어 '결과는 다음과 같다' 식으로 표기하였다.
솔직히 터놓겠지만, 스몰토크 브라우저의 스크린숏 모양은 굳이 통일하려 하지 않았다. 브라우저는 물론 dialect마다 다를 수도 있고, 같은 dialect라 하더라도 다를 수 있다 (예: IBM Smalltalk의 표준 브라우저와 Trailblazer 브라우저). 그 점과 관련해서는 프로그래머의 취향에 따라 정보를 표시하거나 숨기도록 설정되었을 수 있다. 책에 실린 브라우저들은 일관성을 위해 모양을 표시하기보다는 필자가 당시 사용하던 브라우저들이다.