메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

자바 교육과정에 대한 재고: Goodbye, HelloWorld!

한빛미디어

|

2002-10-17

|

by HANBIT

5,041

저자: 다니엘 H. 스테인버그(Daniel H. Steinberg), 역 한빛리포터 이상화

본 기사는 신참 프로그래머들에게 자바로 프로그래밍 하는 방법을 가르치는 기사이다. 부분적으로, 이 글은 Extreme Programming(† 역자 주: XP, 소프트웨어 개발 방법론)의 프로그래밍-중심적 실습을 사용하는 객체 지향 프로그래밍을 제안하고 있다. 애플리케이션을 개발할 때 XP가 과연 옳은 방법이 될 수 있는지의 여부는 본 기사에서 논의하지 않는다. 그 대신, 우리는 자바 입문 과정에서 신참 프로그래머들이 반드시 배워야 할 것에 대해 재고할 것이다. 여러분도 이 토론에 참여하기를 부탁한다. 포럼이라는 울타리 안에서 자유롭게 미래의 화제에 대해 제안하고 싶다면 한빛미디어의 분야별 게시판(자바게시판)에서 논의를 계속하기를 바란다.

자바 언어를 처음 배울 때 보게되는 입문 서적, 입문 과정, 온라인 자습서는 C와 같은 문법은 경험있는 프로그래머들이 자바로 쉽게 이동하게 만든다고 강조한다. 물론, 객체 지향 프로그래밍의 장점에 초점을 맞추거나 상속(inheritance)이 세상을 구원할 것이라고 약속하는 많은 책들이 있지만 OAK, 셋탑 박스, 웹에 관한 약간의 언급을 포함하고 있는 간략한 역사가 끝나면 대부분의 서론은 C와 C++ 책에 이미 있는 것들이다.

물론 Kernighan과 Ritchie의 책을 버려서는 안된다. 여기에서 여분의 "객체 특성"을 배울 수 있기 때문이다. 그럭저럭 자바는 더 좋아지려고 만들어 졌을 것이다. 자바가 어떤 포인터도 가지고 있지 않다고 말하지만 아직 많은 이들이 JDK를 다운로드하고 몇 시간 이내에 NullPointerException을 볼 수 있다. 자바 프로그래밍에 대해서 공부를 계속할수록 C는 자바로 가는 올바른 방법이 아닌 것을 발견하게 된다. 이것은 초기 책들이 잘못됐다는 것은 아니지만 그 당시에는 충분히 언급할 필요가 있는 것이었다. 그러한 책들의 내용들은 자바 초심자들이 프로그래밍에도 처음이기 때문에 구식처럼 느껴질 것이다. 만약 자바가 처음 시작하는 프로그래밍 언어라면 우리는 C로부터 자바를 끌어내는 법을 설명하지 않을 것이다. 따라서 우리는 프로그래밍에 접근할 수 있는 최선의 방법에 대해서 재고할 것이다.

지금은 우리의 접근 방법을 재고하기 위해 특별한 관심이 필요한 때이다. 2003년 11월부터 고등학교 우수반 배치고사에서 자바를 컴퓨터 과목으로 이수할 수 있게 된다(† 역자 주: 대학 교과과정을 고등학교에서 미리 이수하는 시험). 대학의 입문 과정도 자바로 가르쳐지기 때문에 교육자들은 교육과정에 대해 많은 재고의 노력을 쏟을 것이다. 린 안드레아 스테인(Lynn Andrea Stein)이 이끄는 프로젝트는 Rethinking CS101 프로젝트와 곧 공개될 웹사이트로 끝났다. 스테인은 MIT에 있는 AI 실험실에서 새로 만들어진 온라인 대학으로 옮겼다.

객체 지향을 소개하는 비 객체 지향적 방법

만약 여러분이 자바를 사용해서 객체 지향 프로그래밍 과정을 시작해야 한다면, 어디서부터 시작해야 할까? 명백하게 아래와 같은 코드부터 시작해야 할 것이다.
public class HelloWorld {
  public static void main( String [] args) { 
    System.out.println("Hello, world.");
  }
}
제이슨 헌터(Jason Hunter)가 자신의 책 『자바 서블릿 프로그래밍, 개정판』에서 주석을 달았듯이, HelloWorld는 B언어(C언어 보다 앞선 언어) 이후 최초의 프로그램으로 사용되어 왔다. 자바에서 JSP, 서블릿, JDBC까지의 모든 소개는 몇몇 종류의 HelloWorld 예제 프로그램과 함께 시작되었다. 그것은 간단하며, 눈에 보이는 즉각적인 결과를 갖는 작성하기 쉬운 프로그램이다. 초보자라도 여섯 줄의 소스 코드를 작성하거나 저장하기 위해 통합 도구를 사용할 수 있고 컴파일 하는 방법과 프로그램을 실행시키는 방법을 알게된다. 어느 누구라도 도스 창에 "Hello World"란 단어가 나타나면 작업이 성공적으로 완료 됐다는 것을 알 수 있다.


자바 서블릿 프로그래밍, 개정판

참고 도서

자바 서블릿 프로그래밍, 개정판
제이슨 헌터, 윌리엄 크로포드




반면에 객체 지향 프로그래밍 과정을 시작하기 위한 가장 최악의 방법을 HelloWorld라고 보는 사람도 많다. 가장 주된 이유는, 객체 지향 프로그램이 다른 객체와 메시지를 주고받는 높은 응집성의 객체들로 구성되어 있어야 하기 때문이다. 예를 들면 응용 프로그램의 GUI부분으로서 JButton을 클릭하게 되면 JButton이 언제 클릭 되는지 알기 원하는 모든 객체들은 그에 관해서 통지를 받게 될 것이다. 그런 다음 이러한 객체들은 아마도 객체간 메시지를 보냄으로서 필요한 일을 할 것이다.

다시 HelloWorld로 돌아가 보면 HelloWorld 클래스는 main() 이외에 어떠한 메소드도 가지고 있지 않다. HelloWorld는 존재할 이유가 없는 클래스이고, 여기서 객체 지향 프로그래밍에 대한 논의가 이루어져야 한다. 만약 여러분이 아주 관대한 사람이라면 system 패키지에 있는 out 클래스의 println() 메소드가 요청되었기 때문에 HelloWorld에 대해 객체 지향적인 점수를 줄 수도 있을 것이다.

빅뱅

이제 객체 지향 프로그램이란 메시지를 앞뒤로 전달함으로서 서로 상호 작용하는 객체들에 관한 모든 것이라 할 수 있다. 여기서 마주치게 되는 교육적인 딜레마는 이러한 상호작용이 설명되어야 하지만 객체 지향 프로그래밍이 상호작용에 대한 모든 설명으로 시작되어야 하는 것은 아니라는 것이다. 다시 말해 프로그램을 시작하기 위해서 main()이 필요한 것은 사실이지만 반드시 main()의 모든 구성 요소에 대한 설명을 하는 것으로 수업을 시작해야 하는 것은 아니라는 것이다.

마찬가지로 물리학을 보면 일반적으로 수업의 시작이 물리적 객체가 어떻게 상호 작용하는가에 대한 설명으로 시작하지 빅뱅이나 우주의 탄생에 대한 설명으로 시작하지는 않는다는 것을 알 수 있다. 이러한 것에 대해서는 뉴튼의 운동 법칙을 설명하거나 증명하는 것이 더 쉽다. 자바 프로그램 안에서 최초 객체를 생성하는 "빅뱅"이란 바로 main() 메소드를 뜻한다.
public static void main( String [] args );
일단 각 키워드가 무엇을 의미하는지 설명함으로서 수업을 시작할 수 있다. 이는 곧 다음과 같은 것들을 설명하는 것으로 수업을 시작해야 한다는 것을 의미한다.
  • 접근자(accessors): 학생들이 객체와 클래스간의 차이를 이해하기 전에, 하나의 객체 또는 클래스로 이루어진 프로그램을 보기 전에, 접근의 단계를 설명해야 할 것이다. HelloWorld 클래스가 패키지 안에 있지는 않지만 여러분들은 public, protected, private들을 구별하기 위해 패키징(packaging)과 계층 관계(hierarchies)에 관련된 사항과 이름을 가지고 있지 않는 접근 단계에 대해서 얘기해야 한다.
  • 클래스 메소드: static 키워드의 용법은 학생들이 어떤 메소드와 속성이 클래스에 속해야 하고 어떤 것들은 객체에 속해야 하는가에 대한 이해에 달려있다. 앞서 언급했듯이 이 시점에서 학생들은 클래스와 객체의 차이를 모른다. (숙련된 자바 개발자의 경우, 이러한 차이점을 이해하는데 얼마나 어려웠다는 것을 기억하지 못할 수도 있다.) HelloWorld 클래스가 하나의 메소드를 가지고 있다는 것에 주의해라. static 키워드의 main()HelloWorld 타입의 객체가 생성되기 전에 호출되어야 하는 것이기 때문에 main()static인지 아닌지는 클래스와 객체의 개념적인 차이점과는 별로 상관이 없다.
  • 리턴 타입: 메소드의 리턴 타입을 설명하는 수업이라고 생각해 보자. add() 메소드가 int형의 i와 j 합을 리턴 한다는 것을 설명하기 위해 int add(int i, int j) 같은 것을 선택할 것이다. 곱셈을 가르칠 때 0부터 예를 들어 곱셈을 하지 않듯이 main() 같은 아무런 값도 리턴 하지 않는 메소드를 선택하지는 않을 것이다.
  • 명령어 라인 인수: main() 메소드의 파라미터는 명령어 라인 인수들이다. 종종 HelloWorld의 예제들은 조금 더 정교해져 java HelloWorld myName과 같이 파라미터를 입력하면 Hello myName을 볼 수 있게끔 만들어져 있다. 하지만 이러한 예제들을 지금 당장 포함하기를 원하는가? 문제는 이것과 이미 언급한 다른 항목들이 중요한 가의 여부가 아니라, 자바로 객체 지향 프로그래밍을 가르치기 위한 과정을 설계하는데 필요한 화제라는 것이다.
  • 문자열 배열: args 변수는 String 배열이다. 필자는 HellowWorld 예제를 막다른 골목으로 몰고 싶지는 않지만, 대부분은 main() 메소드의 용법을 적절하게 설명하기 위해 배열을 설명하고 싶지는 않을 것이다. 또한 int 형의 값을 원할 때 그것을 String 형으로 읽은 다음 래퍼(wrapper) 클래스의 static 메소드를 사용하여 최종 값을 얻는 과정을 얘기하고 싶지는 않을 것이다.
main() 메소드는 자바 프로그램의 실행을 시작하기 위해서는 필요 하지만 자바 프로그램의 설명을 위해서는 적절하지 않다.

도전

이제 여러분은 무엇을 생각하고 있는가? HelloWorld 프로그램을 포기할 준비가 되었는가? 아니면 한쪽을 편들어 이익을 보겠는가? main()에 대해서는 어떤가? main()이 필요하다면 어떻게 접근할 것인가? 학생들에게 "그냥 똑같이 작성해보고, 모든 용어는 이후에 배우게 될 것이다."라고 말할 것인가? 아니면 위에서 언급한 키워드를 각각 설명하고 수업을 그만두지 않는 3명의 학생들과 함께 학기를 계속할 것인가?

이제 객체 지향 프로그래밍을 설명하기 위해 자바를 어떻게 소개할 것인가?
다니엘 H. 스테인버그(Daniel H. Steinberg)는 자바 개발자이자 기술관련 전문 작가로 활동하고 있다.
TAG :
댓글 입력
자료실