IBM Korea Skip to main content
       IBM 홈    |  제품 & 서비스  |  고객지원 & 다운로드  |  회원가입  

Diagnosing Java Code : 대화식 검사 기능을 제공하는 Repls
소프트웨어를 대화식으로 효과적으로 진단하는 기법 및 툴

Eric E. Allen
박사 과정, 자바 프로그래밍 언어 팀, Rice 대학교
2002년 3월

Column icon 보통 자바 프로그램을 실행시킬 때는 String[] 입력 인수를 사용하여 매개변수들을 전달하면서 main() 메소드로부터 프로그램이 수행되어야 한다. 그러나 프로그램이 아직 디버깅되고 있을 때는 이것이 성가신 작업이 될 수 있다. 이번 달에 Eric Allen은 프로그램의 표현과 구문들을 대화식으로 검사할 때의 이점에 대해 설명하고, 이 작업을 도와주는 몇 가지 자바 repls(read-eval-print-loop 툴)을 제시한다. 그는 또한 대화형 검사 방법이 GUI를 구축하고 새로운 API를 조사하는데 얼마나 유용한지를 설명한다. 이 글을 읽고 나면 여러분은 사전에 디버깅된 프로그램에서 오동작을 대화형으로 진단해야 하는 이유와 그 방법을 알게 될 것이고 여러분의 작업을 도와 줄 몇몇 자바 툴에 접근할 수 있을 것이다.

대부분의 프로그램은 수 많은 클래스 상에 전개되는 다수의 메소드들을 포함하고 있다. 물론, 프로그램의 주 진입점에서 출발하여 이 메소드들을 전부 테스트하는 것은 불가능하진 않다 해도 매우 어려운 일이다.

단위 테스트가 유용한 이유가 바로 이 때문이다. 많은 프로그래머들과 소프트웨어 설계자 (나를 포함하여)들은 강력한 소프트웨어 작성에 있어 단위 테스트의 유용함을 강조한다. 그러나 여러분 프로그램의 다양한 요소들에 좀 더 대화식으로 접근하고 싶다면 하나의 잠재적인 손실을 감수해야 한다.

이와 같은 경우에 각 결과에 대해 새로운 단위 테스트를 작성하고 컴파일하고 실행시키는 것은 성가신 일이 될 수 있다. 나는 주어진 특정 입력 사항에 대해 내 프로그램이 어떻게 행동할지를 미리 알지 못할 때 (예를 들어 인공 지능 프로그램의 경우처럼) 이러한 점이 특히 사실임을 발견했다.

그렇다면 무엇을 해야 할 것인가?

소규모 변경을 위해 땀 흘리지 말라.
유사점을 끌어 내기 위해, 보통 컴파일되는 언어 (자바와 C++ 같이)에서의 프로그래밍과 인터프리터 방식의 언어 (Python과 Scheme)에서의 프로그래밍의 차이를 살펴보자.

컴파일된 언어에서의 모든 작성/테스트/디버깅 주기는 컴파일이라는 추가적인 단계를 반드시 포함하고 있는데, 이는 특히 다수의 소규모 변경에서는 지루한 작업이 될 수 있다. 그래서 우리는 인터프리터 방식의 언어가 훨씬 유동적이어서 더 쉽게 수정된다는 결론을 내리게 된다. (유연성에 대한 대가도 있다. : 인터프리터 방식의 언어는 코드에 대해 유형 검사와 같은 정적인 검사를 덜 수행하는 경향이 있다.)

때때로 골치 아픈 재컴파일 과정을 거치지 않고 프로그램을 변경하고 싶은 것처럼, 우리는 우리의 프로그램 suite에 새로운 단위 테스트를 추가하는 형식을 차리지 않고 프로그램의 일부 요소를 검사하고 싶을 수 있다. 이런 경우 전통적으로 "read-eval-print-loop (repl)"로 알려진 툴을 사용하면 도움이 될 수 있다.

repl 은 하나의 식을 입력사항으로 취해 특정 프로그램의 맥락에서 이를 검사하고 그 결과를 화면에 출력하는 텍스트 기반의 툴이다. 그리고 나서 다른 식을 입력 사항으로 취할 때 까지 기다린 후 위 작업들을 반복한다. 그러한 툴은 리스프(Lisp)와 같은 언어에 뿌리를 두고 있지만, Python과 같은 신규 언어에서도 사용된다.

자바 프로그래밍에서 repl의 이점

그러한 툴이 유용하게 사용되는 언어는 이들 뿐이 아니다. 자바 프로그래머들도 repl을 사용해 혜택을 얻을 수 있는데, 이는 디버깅 뿐만 아니라 다른 작업에서도 마찬가지다. .

GUI 구축하기

GUI를 구축할 때는 설계하고 연결해야 할 수 많은 컴포넌트들이 있다. 여러분은 GUI를 구축할 때 다음과 같은 것을 장담할 수 있을 것이다.:

  • 컴포넌트들은 불명확한 방식으로 상호 작용할 것이다.

  • GUI를 실행시키기 전에 GUI의 모든 코드를 작성하는 것은 시간 낭비이다.

  • GUI가 실제로 어떻게 표시되는지를 일단 보면 분명히 여러분은 몇 가지 측면을 변경하고 싶을 것이다.

이 문제에 대한 일반적인 솔루션은 JBuilder, Forte, 및 기타 통합 개발 환경(IDE)에 들어 있는 것과 같은 그래픽 기반의 GUI 생성 툴을 사용하는 것이다. 개인적으로 나는 이 방식을 싫어한다. 툴이 어떤 자바 코드를 생성할 것인지 알기 어렵고 생성된 툴을 수정하려면 GUI 구축 툴과의 호환성을 잃어버릴 위험이 있기 때문이다. (사실 일부 IDE는 강제적으로 사용자가 기계가 생성한 코드의 일부를 수정하지 못하게 하고 있다.)

또한 이 GUI 툴들 중 많은 것이 자바 코드를 생성할 때 독자적인 GUI 라이브러리를 사용하여, 여러분이 작성한 GUI의 호환성을 제한한다.

나는 repl을 사용해 GUI를 구축하는 것이 훨씬 쉽다는 것을 알게 되었다. 간단히 각 GUI 컴포넌트를 대화식으로 정의한 후 이를 차례로 표시하면 된다. 마음에 들지 않는 것은 무엇이든 즉시 고칠 수 있다. 그리고 툴에서 상호작용들을 선택해 내 프로그램에 붙여넣으면 된다.

새 API 탐험하기

자바 언어로 프로그래밍하는 가장 큰 이점 중 하나는 데이터베이스에서 웹 서비스, 텔레비젼에 이르기까지 모든 것들과 인터페이스 할 수 있는 엄청나게 풍부한 API가 있다는 것이다. 그러나 API의 의미론을 배우는 데는 시간이 걸린다.

종종 Javadocs는 API 행동의 모든 측면을 최종적으로 정의해 놓지 않았을 것이다. 이 난처한 상황에 대한 해결방안은 API를 직접 테스트하는 것인데, repl을 사용하면 훨씬 더 빨리 수행할 수 있다. 메소드 호출을 입력하고 결과를 보기만 하면 된다!

또 하나의 부수적인 이점은 repl을 사용해 API를 테스트하면 대부분의 프로그래머의 주요 행태 (우리는 실제로 해봄으로써 제일 많이 배운다)가 강화된다는 것이다.

자바 프로그래밍에 사용할 수 있는 Repls

repls가 그렇게 많은 장점을 가지고 있다면, 분명히 다음 질문은 자바 언어에 사용될 수 있는 repls에는 어떤 것들이 있는가일 것이다.

Jython

Jython (예전에는 JPython이라고 알려짐)은 자바 프로그래밍 언어에 Python (repl 포함)을 구현한 것이다 (순도 100% 보증). Jython은 (다소 장식적인) 자바 소스 코드나 혹은 바이트코드에 직접 Python을 실제로 컴파일한다.

Python의 개념에서 모든 시도는 Jython을 자바와 매끈하게 상호운용시키도록 하기 위한 것이다. Python은 여러분이 자바 언어에서 프로그래밍하는 것처럼 모든 자바 표준 라이브러리에 접근할 수 있게 해 주고 기존 자바 클래스 파일을 사용할 있게 한다. 따라서 여러분은 repl을 이용하여 표준 라이브러리를 사용할 수 있을 뿐 아니라 이미 바이트코드로 컴파일한 여러분의 자바 (Jython) 클래스에 대해서도 작업할 수 있다.

Jython repl을 사용할 때 고려해야 할 중요 사항은 여러분이 자바 식이 아닌 Python 식 을 작성한다는 점이다. 그 결과 Python의 간결함과 멋진 구문을 얻을 수 있는 장점이 있다.

예를 들어, 가령 a를 1로, b를 2로, c를 3으로 매핑시키는 새로운 해시 테이블을 작성하려 한다고 해 보자. :


>>> h = {'a':1, 'b':2, 'c':3}

해석기는 각 새 입력 행 앞에 >>>를 표시한다.

Jython 구문은 또한 새로운 GUI 설계할 때 아주 유리하다. 우선, 다음과 같이 GUI 구성 요소의 다양한 필드가 생성자에 대한 키워드 인자로 지정될 수 있다.:


>>> from javax.swing import *
>>> f = JFrame(visible=1)

예는 Jython과 자바 언어간의 몇 가지 차이점을 보여준다.:

  • import 절의 구문이 아주 다르다.

  • boolean 대신 ints 유형이 사용된다. (1은 참이고 0은 거짓이다)

Jython 코드가 여러분의 타이핑을 줄여주는 또 다른 예가 있다. 즉 GUI 구성요소에 action listener를 추가하는 것이다. 보통 그러한 listener는 Command 패턴을 사용하여 익명의 내부 클래스의 인스턴스로 지정된다. Python에서 (그리고 다른 많은 "스크립트 방식의" 언어에서) 그러한 명령어는 대화식의 기능 정의를 사용하여 더 간결하게 지정될 수 있다. 예를 들어, 위의 대화식 세션을 기반으로 삼아 JButton에 간단한 action listener를 추가해보자. :


>>> def listener(event):
...   print 'thank you'
>>>

이것은 Jython에서 함수를 정의하는 예이다. 해석기는 ^ (삽입 지시 기호)에 타원을 인쇄함으로써 구문이 다음 행에 계속될 것임을 알려준다. 이 함수는 하나의 인자를 취하며 표준 출력으로 "thank you"를 표시한다. 우리는 다음과 같이 이것을 action listener로 사용할 수 있다. :


>>> panel = JPanel()
>>> panel.add(JButton('press me', actionPerformed=listener))
>>> f.getContentPane().add(panel)
>>> f.pack()

이제 "press me"라는 버튼이 있는 창이 화면에 나타날 것이고, 이 버튼을 누르면 표준 출력으로 "thank you"가 표시될 것이다. 자바 코드를 사용해 이를 수행하려면 얼마나 장황해질지 상상해 보라.

물론 단점도 있다. 예를 들어 :

  • 정적인 유형 검사를 못한다. (정적인 검사가 repl에서는 아마 틀림없이 거의 가치가 없지만)

  • 여러분이 repl에 입력한 수식은 자바 코드가 아니기 때문에, 먼저 이를 번역하지 않고는 repl로부터 여러분의 프로그램으로 그 수식들을 복사하여 붙여 넣기할 수 없다.

  • Jython을 자바 코드와 사용할 때 여러분은 머리 속에 두 언어를 동시에 교묘하게 다루어야 하는 부담을 안게 된다. (이를 즐기는 사람도 있기는 하다)

DynamicJava

자바에서 사용할 수 있는 또 다른 repl은 DynamicJava이다. DynamicJava는 진정한 자바 기반의(거의 그렇다고 볼 수 있다) 개방형 툴로 다음과 같은 차이점을 가지고 있다.:

  • repl 언어는 정적인 유형의 변수를 선언할 때 이를 명시하지 않아도 되게 해준다.

  • 구문의 끝에 세미콜론(;)을 추가하지 않아도 된다. 해석기는 또한 구문을 검사한 결과로 null을 (엉성하게) 반환한다 (구문이 아무런 값도 반환하지 않는 편이 나을 것이다).

  • repl에서 여러분은 객체들의 private 필드에 제한 없이 접근할 수 있다.

초보 자바 프로그래머에게는 이런 차이들이 혼란을 일으킬 수 있으므로 중요할 것이다. 좀 더 숙련된 프로그래머라면 아마도 일부 제약사항이 완화된 점을 환영할 것이다. 어떤 경우에든 DynamicJava는 강력하고 매우 유용한 소프트웨어 제품이다. (무료라는 점도 일조를 한다)

새로운 자바 IDE

Rice대학의 JavaPLT 연구소(지도 교수 Robert Cartwright)에서 우리는 최근 새롭고, 오픈 소스이며, 일반 공개 라이센스(GPL) 형식으로 된 자바 언어용 개발 환경인 DrJava를 출시하였고, 여기에는 DynamicJava repl의 정리된 버전이 내장 컴포넌트로 들어 있다. 나는 "정리된"이라고 말하였는데 이것은 우리가 위에서 설명한 DynamicJava의 몇 가지 엉성한 기능을 숨겼기 때문이다.

DrJava 프로젝트는 초보 컴퓨터 공학과 학부생의 지도에 사용할 무료의 가벼운 Java IDE를 개발하기 위한 Extreme Programming 프로젝트이다. 이 IDE는 학부생용으로 설계되었지만, 모든 수준의 개발자에게 유용할 수 있는 기능들을 신속하게 개발하고 있다. DrJava 의 숨은 철학은 몇몇 IDE가 실제 코드로부터 프로그래머를 피신시키려 했던 것과는 달리, 프로그래머들이 가지고 있는 언어에 대한 지식을 강력한 개발 툴 제공에 사용하자는 것이다.

이 IDE가 가진 몇몇 훌륭한 기능에는 코멘트와 괄호의 대응을 아주 정확하게 (Emacs보다 훌륭하게) 하이라이트하고 컴파일러 에러를 하이라이트하는 클릭가능한 소스가 있다는 점이 포함된다. 다음과 같이 몇 개의 클릭 가능한 탭이 인터페이스로 제공된다.

  • 상호작용 탭은 여러분이 DynamicJava repl을 가지고 상호작용하여 새로 컴파일된 클래스들을 인스턴스화하고 테스트하도록 해준다.

  • 컴파일러 오류 탭은 여러분이 편집창에서 다양한 컴파일러 에러를 클릭하여 소스 코드 내 에러가 발생한 지점으로 갈 수 있도록 해준다.

  • 콘솔 탭은 System.out과 System.err로 보내지는 모든 메시지를 표시한다.

(DrJava의 screen shot)

이 IDE를 사용해본 우리의 경험에 따르면 상호작용 창을 통해 프로그래머는 복잡한 개발과 디버깅 작업들을 쉽게 수행할 수 있다. 다른 언어에서도 보여지듯, 소스 편집기와 repl를 결합하면 강력한 툴이 만들어진다.

repls에 대한 결론
이 연재가 재컴파일이라는 난항에 빠지지 않고도 자바 프로그램의 수식과 구문을 대화식으로 검사할 수 있게 해 주는 주요 툴인 "read-eval-print-loop (repl)"을 확인하고 입증해 주었기를 바란다. 우리는 또한 GUI를 구축할 때 그리고 여러분이 사용할 수 있는 수많은 Java API를 신속하게 검토하고 싶을 때 repls가 얼마나 중요한지를 설명하였다.

참고 자료

목 차:
소규모 변경 수행하기
Java와 repl
사용가능한 repls
Jython
DynamicJava
repls에 대한 결론
참고 자료
필자 소개
기사에 대한 평가
관련 dW 링크:
Charming Python: .NET용 JPython과 Python 내부
Diagnosing Java Code 컬럼
Subscribe to the developerWorks newsletter
US 원문 읽기
Also in the Java zone:
Tutorials
Tools and products
Code and components
Articles
필자소개
Eric Allen은 Cornell 대학에서 컴퓨터 공학 및 수학 학사 학위를 받았으며 Rice 대학의 자바 프로그래밍 언어팀에서 박사 과정을 밟고 있다. 학위를 마치기 위해 Rice 대학으로 돌아가기 전에 Eric은 Cycorp 사의 선임 자바 소프트웨어 개발자였고, 또한 JavaWorld의 자바 초급자 토론 포럼의 진행자이기도 하다. 그는 자바 언어에서 소스와 바이트코드 레벨 양쪽에서의 의미론적 모델 개발과 정적인 분석 툴에 관심을 가지고 있다. Eric은 Rice 대학이 실험적으로 개발한, 추가된 언어 기능을 가진 자바 언어의 확장판인 NextGen 프로그래밍 언어용 컴파일러의 수석 개발자이기도 했다. 또한 초보자용으로 설계된 오픈 소스 Java IDE인 DrJava의 프로젝트 관리자이다.
이 기사에 대하여 어떻게 생각하십니까?

정말 좋다 (5) 좋다 (4) 그저그렇다 (3) 수정보완이 필요하다(2) 형편없다 (1)

  회사소개  |  개인정보 보호정책  |  법률  |  문의