Object-Oriented Modeling Tool

Plastic 1.0 for Java

Plastic은 객체지향 모델링 툴로써 객체지향 소프트웨어 개발을 위해서 필요한 절차인 모델링의 작업을 위한 도구 및 환경을 제공하며, 완성된 모델은 Java언어의 프로토타입으로 완전하게 생성해 주는 기능을 가지고 있다. 그리고 C++, Delphi Object Pascal, Oberon-2, Eiffel 언어의 프로토타입도 생성할 수 있으며, 자바 언어 통합 환경을 지원하여 컴파일 및 애플리케이션과 애플릿을 실행을 편리하게 해 준다. 또한 11가지 디자인 패턴을 지원하고, 사용자정의 디자인패턴도 정의할 수 있다. 그외에도 깨끗한 프린팅기능, 브라우저, 모델의 오류 검증 기능, 빠른 도움말 기능으로 편리함을 더해주고 있다.

동아대학교 컴퓨터공학과

이민규

e-mail: niklaus@nownuri.net

homepage: http://www.donga.ac.kr/~leemk/

1997, 8. 16.


Menu Help


Plastic 1.0 for Java Help

Introduction

 Plastic이란?

 Plastic의 기능들

 Plastic의 기능

 Object Model Notation

 Design Patterns

 Supporting java

 Language Translators

 그 밖의 기능


Plastic 1.0 for Java Help

Object Model Notation

 Class Notation

 Interface Notation

 Inheritance Notation

 Association Notation

 Aggregation Notation

 Instantiation Notation

 Comments Notation

 Modeling Example


Plastic 1.0 for Java Help

Plastic Usage

 Plastic의 전체화면 설명

 File Menu

 Edit Menu

 Symbols Menu

 Patterns Menu

 View Menu

 Browser...

 Package...

 Design Information...

 Tool Menu

 Options...

 Options...

 Environment Page

 Diagram Page

 Editor Page

 Java Editor...

 Java Code Generator...

 Translators...

 Help Menu


Plastic 1.0 for Java Help

Modeling with Plastic

 Class, Interface의 표현

 Class Inspector

 From Ancestors Dialog

 Interface Inspector

 Field, Method의 표현

 Attribute Inspector

 Access Modifier

 Constant Inspector

 Method Inspector

 Operation Inspector

 Constructor Inspector

 Argument Inspector

 Type Dialog

 Inheritance의 표현

 Class Extends

 Interface Extends

 Implements

 Association, Aggregation의 표현

 Association Inspector

 Comment 붙이기

 Comment Inspector

 Text Inspector

 Package 설정하기

 Package Window

 Import Window

 Design Information 설정하기

 Design Information Window


Plastic 1.0 for Java Help

Design Patterns

 Design Patterns의 소개

 What Is a Design Pattern

 Plastic에서 Pattern을 작성하고, 삽입하기

 몇가지 Design Pattern

 Factory Method (Class Creational)

 Composite (Object Structural)


Plastic 1.0 for Java Help

Java Editor

 Java Editor의 소개

 Java Editor 이용하기


Plastic 1.0 for Java Help

Examples

 Java Applet Example

 Applet Template

 Applet Demo

 Applet Demo Source

 Applet Demo Result

 Java Application Example

 Application Demo

 Application Demo Source

 Application Demo Result


Plastic이란?
Introduction

Plastic 이란?

Plastic은 객체지향 모델링 툴로써 객체지향 소프트웨어 개발을 위해서 필요한 절차인 모델링의 작업을 위한 도구 및 환경을 제공하며, 완성된 모델은 Java언어의 prototype으로 자동생성해 주는 기능을 가지고 있다.

Plastic은 두가지 측면에서 강점을 가지고 있는데, 첫째로 객체지향 모델링의 측면에서는 새로운 기능인 Design Patterns의 지원을 들 수 있다. 이것은 소프트웨어 모델링에서 자주 발견되는 문제들을 기술하고, 또한 그러한 문제의 해결 방법에 대한 핵심을 기술하여 놓은 것으로써, 문제 해결에 대한 동일한 노력의 반복없이 문제 해결의 효과를 얻을 수 있는 것이다. 즉, 모델링 작업에 있어서 매우 큰 도움이 되어서, 소프트웨어 재사용성 및 빠른 애플리케이션 개발이 용이하다.

둘째로는 Java언어와의 통합된 환경이다. 언어에 독립적인 소프트웨어 모델링의 절차가 끝나면 특정 언어를 이용한 구현을 해야한다. 하지만 결국 모델링 환경을 떠나서 작업을 해야 하므로 매우 불편한 작업을 하게된다. 이것들은 통합시켜 준다면 모델링, 구현, 수정 및 보완 작업을 동일한 환경에서 할 수 있게 되므로 편리하고도 빠르게 작업을 할 수 있다. Plastic에서는 Java Editor 및 Java source code generation 기능을 갖추고 있어서 모델링 작업 이후에 구현작업에서도 많은 부분을 자동화하였고, 또한 편집 환경을 통합하여 이러한 잇점을 얻을 수 있게 되어있다.


Plastic의 기능
Introduction

Plastic의 기능

Plastic은 OMT(Object Modeling Technique)의 OMN(Object Model Notation)을 Java언어에 맞게 확장하였고, 또한 꼭 필요한 부분만을 포섭하여 Design Patterns을 표현할 수 있는 단순한 집합으로 구성하였다. (이하 Modifed OMN이라 칭함) 따라서 표기법의 교육 및 이해가 쉽게 되었다. 그리고 객체지향 소프트웨어 모델링에 있어서 자주 발견되는 패턴들 즉, Design Patterns을 작성하고, 삽입할 수 있는 기능을 가짐으로 생산성 향상, 재사용성, 빠른 애플리케이션의 개발에 큰 도움을 줄 수가 있다. 또한 최근 가장 곽광받고 있는 객체지향 언어인 Java에 대한 prototype을 자동으로 생성해주면서도 컴파일 및 편집기능을 제공하는 통합된 환경을 제공하여 더욱 편리하게 소프트웨어 개발을 할 수가 있다.


Modified OMN
Introduction

Object Model Notation

Java언어에서 제공하는 개념들 class, interface, single class inheritance, multiple interface inheritance 등을 graphical하게 표현할 수 있도록 OMN을 확장하고, Gamma, Helm, Johnson, Vlissides의 Design Patterns을 표현할 수 있도록 하면서도 최소한의 집합으로 구성하였다.

그리고 Modeling작업의 문서화를 위해서 Diagram을 깨끗하게 프린트로 출력해준다. 이러한 문서화된 다이어그램의 공유를 하게되면 프로젝트 팀원들간의 소프트웨어 모델의 이해도를 증진시킬 수 있다.


Design Patterns
Introduction

Design Patterns

pattern이란 소프트웨어의 모델링에서 자주 발견되는 문제들을 기술하고, 또한 그러한 문제의 solution에 대한 핵심을 기술해 놓은 것으로써, 문제 해결에 대한 동일한 노력의 반복없이 문제 해결의 효과를 얻을 수 있는 매우 강력한 장점을 가진 것이다.

Plastic에서는 이러한 pattern들을 사용자가 직접 기술하여 저장할 수 있으며, 또한 쉽게 자신의 모델로 삽입할 수가 있다. 그리고 Gamma, Helm, Johnson, Vlissides가 제안한 여러가지의 patterns을 포함하고 있어서 설계작업에 매우 도움을 줄 수가 있다. 삽입된 pattern도 Java source를 생성하는데 영향을 주기 때문에, pattern을 견고하게 만들어 두면 재사용이란 측면에서도 좋은 결과를 얻을 수 있다.


Supporting Java
Introduction

Supporting Java

Java의 모든 기능들, 예를 들면 final, static, abstract class, interface, synchronized 등, 을 모두 표현하고 편집할 수 있으며 method, constructor에 대한 직접적인 구현도 삽입할 수가 있다. 또한 package를 실질적인 모델링의 단위로 가정하기 때문에, 관리의 측면에서도 더 편리하다. (이러한 단위가 주어지지 않는다면 사용자가 차후에 프로그램 구성에 손을 봐야 하는 일이 생기게 된다.) 이러한 모델링 단위에 타이틀, 작성자 및 주석을 붙일 수가 있고, package에 필요한 정보들도 편집할 수가 있다. 따라서 완전한 Java programming을 하기위한 도구가 모두 제공되며 Java Editor가 포함되어 있고 compile and error reporting을 한번에 할 수 있는 편리함을 갖추고 있다.


Language Translators
Introduction

Language Translators

Plastic에서는 모두 5가지의 언어의 프로토타입을 생성할 수 있다. Tool메뉴에서 Translators를 선택하면 Java, C++, Delphi Object Pascal, Oberon-2, Eiffel 중 하나를 선택하면 Code Viewer 가 생기면서 프로토타입을 생성해 낸다. C++, Delphi, Oberon-2, Eiffel은 자바의 Built-in 타입에 대하여 자동변환을 해준다. 예를 들어 자바의 int, float은 Oberon-2의 INTEGER, REAL의 타입으로 변환을 해준다.


그 밖의 기능
Introduction

그 밖의 기능

Java Editor는 Modeling의 결과로 부터 생성된 결과를 곧바로 받아서 편집할 수 있도록 해주며, 다중 문서 편집과 JDK와 연계하여 compile 및 error report를 한 번에 할 수 있는 기능을 갖추고 있다. Browser는 편집중인 모델의 classes, interfaces, methods, attributes 등을 Icon으로 일목요연하게 보여주며, 해당 아이템에 대한 Java언어의 표현을 즉시 보여주는 기능을 가지고 있다.


Class Notation
Object Model Notation

Class Notation

class에 대한 표기법은 직사각형의 모양에 오른쪽 하단으로 그림자를 드리운 것이다. 그림자를 넣은 이유는 바로 interface와의 구분 때문인데, class가 interface보다 더 concrete하다는 것은 나타낸 것이다. 직사각형은 3부분으로 나뉘어 있는데, 가장 윗쪽 칸에는 class의 이름을 기입하고, 가운데 부분에는 data field를 가장 아랫부분에는 method를 열거한다.

data fields(C++:data members, Eiffel:attirbutes, Smalltalk: instance variables)부분에는 data type, data field name, initial value 순으로 표현한다. initial value는 경우에 따라서는 생략될 수 있다. 예를 하나 들면, int Color = WHITE; 이런식으로 표현할 수 있다.

method는 return type, method name, argument list 순으로 표현하는데, return type이 업는 경우에는 생략한다. 마찬가지로 argument가 없으면 ()만 존재하게 된다. 특이한 경우로는 constructor에 대한 것이 있는데, 이것은 클래스의 이름과 동일하며 return type이 없다.


Interface Notation
Object Model Notation

Interface Notation

interface는 단순히 그림자 없는 직사각형으로 나타내며, class와 마찬가지로 3부분으로 나뉘는데 name section, constants section, operation section이라 부른다. name section에는 interface의 이름을, constants section에는 그림에서 보는 바와 같이 클래스의 data field와 유사한 형식으로 상수를 정의한다. 단, 상수는 initial value가 생략될 수 없다. operations section에서도 method의 경우와 같은 방법으로 표현한다.


Inheritance Notation
Object Model Notation

Inheritance Notation

상속은 작은 삼각형의 모양을 superclass와 subclasses사이에 두고 뽀죡한 부분이 superclass로, 그렇지않은 부분이 subclasses로 가도록 연결하면 된다. 여기서 주목할 점은 하나의 superclass에 여러개의 subclass가 삼각형 심볼을 하나 두고 서로 같이 연결할 수 있다는 것이다. 이렇게 하면 난잡함을 피할 수 있고, 보기도 쉽다.

이러한 상속관계의 표현은 interfaces사이에도 그대로 적용된다. 단 classes와 interfaces가 서로 연결될 때에는 class는 interface의 super가 될 수 없지만, interface는 class의 super가 될 수 있다는 점에 주의하기 바란다.


Association Notation
Object Model Notation

Association Notation

Association은 실선으로 서로 연관하는 클래스들을 연결하면 된다. 단 화살표 처럼되어 있는 것은 단지 하나의 객체와 연관하는 뜻이고, 채워진 원은 여러개의 객체와 연관할 수 있다는 것을 뜻한다. 실선의 각 끝부분에는 role name을 기록하는데, 이것은 그 객체가 상대 객체에 대해서 어떤 역할을 하게 되는가를 표현하게 된다.

예를 하나 들면, Person은 Company와 연관 관계를 가지는데, 하나의 Company객체는 하나 이상의 Person 객체와 연관할 수 있다. 그리고 Company는 Person에 대해서는 employer이고, Person은 Company에 대해서 employee이다. 이것을 위 그림의 아래쪽에 있는 표현에 적용시켜보면 class-1:Person, class-2:Company, role-1:employee, role-2:employer가 된다.


Aggregation Notation
Object Model Notation

Aggregation Notation

Aggregation은 Association의 표기법과 매우 유사한데, 단지 다이아몬드 형태의 심볼이 들어간다는 것이다. 그림에서 보는 것과 같이 Part부분은 Association과 같이 화살표인 경우 하나의 객체, 채워진 원인경우, 여러개의 객체를 의미하며, Assemply부분에는 다이아몬드 심볼을 넣어주어야 한다. 간단한 예로, 여러개의 Sentence는 하나의 Paragraph에 대해서 Part이고 여러개의 Paragraph는 하나의 Document에 대해서 Part가 된다.


Instantiation Notation
Object Model Notation

Instantiation Notation

점선으로 된 화살표 형태의 표기법은 instance의 생성을 의미한다. 즉, create-class는 instantiate-class의 instance를 생성할 수가 있다는 뜻이다. DollFactory는 Doll의 instance를 생성할 수 있다.


Comments
Object Model Notation

Comments Notation

어떤 클래스에 주석을 달고자 할 때에는 오른쪽 하단부가 약간 접혀 올라간 사각형의 종이처럼 표현을 하고 그 내부에 원하는데로 주석을 달면 된다. 그리고 그것은 해당 클래스와 점선으로 연결을 한다. 이것은 어떤 의미를 가지는 것이 아니라 단지 이해에 도움을 주거나 몇몇 중요한 사항들을 기록하는 용도로 사용한다.


Modeling Example
Object Model Notation

Modeling Example

위 Desktop Publishing System에 대한 Object Diagram이다. 이 예제는 Object-Oriented Modeling and Design(Prentice Hall, ISBN:0-13-629841-9)책의 Page 393에 있는 예제를 인용한 것이며 Plastic을 이용하여 편집한 것이다.


Plastic의 전체화면 설명
Plastic Usage

Plastic의 전체화면 설명

Plastic윈도우의 최상단에는 Main Menu가 있고, 그 바로 아래의 왼쪽에 있는 Speed Buttons부분은 메인메뉴에서 자주 쓰이는 것들은 꺼내어 그룹화 해놓은 것이다. 첫번째 그룹은 Files에 관한 것, 두번째 그룹은 Edit에 관한것, 세번재 그룹은 그 외의 것들이다. 그리고 Select 버튼은 Modeling Area에 이미 편집되어 있는 것들은 선택하거나 이동하기 위해서는 이것이 선택되어 있어야 한다. 그리고 이 오른쪽에 있는 그룹은 Symbol Buttons로써 Main Menu의 Symbols메뉴에 모두 있는 것들이다. 왼쪽에서 차례대로 Class, Interface, Comment, Inheritance, Association, Aggregation, Comment Link, Instantiate, Text 심볼이라고 부른다. Modeling Area는 말 그대로 편집영역이고, Status Bar에는 두가지 정보가 보이는데, 현재 편집중인 파일의 이름과 모델의 Title이 나타난다.


File Menu
Plastic Usage

File Menu

파일에 관련된 메뉴가 모여있는데, New는 현제 편집중인 파일을 닫고, 모든 것을 지우고 초기화 한다. Open... [Ctrl+O] 은 이미 존재하는 설계된 모델을 불러온다. 불러올 수 있는 파일의 형식은 .pla인데, Plastic에서 작업한 모델임을 나타낸다. Save [Ctrl+S] 는 현제 작업중인 모델을 저장한다. 이것은 현제 모델에 파일명이 부여되어 있을 때에만 저장을 하고, 그렇치 않는 경우에는 Save As...메뉴을 실행한다. Save As...는 파일 이름이 부여되어 있지 않거나, 혹은 새로운 파일이름으로 저장하고 싶을때에 사용한다. Print...는 지금 작업중인 모델을 프린터로 출력시켜준다. Print Setup...은 프린터에 관한 설정을 하고 싶을때 선택하면 된다. Exit 는 Plastic을 종료시킨다.


Edit Menu
Plastic Usage

Edit Menu

Cut [Ctrl+X]는 현제 모델 중에 선택된(선택된 심볼들은 붉은색으로 나타난다.) 심볼들을 잘라내어 클립보드로 복사한다. Copy [Ctrl+C]는 선택된 심볼들을 그대로 둔체로 클립보드에 복사한다. Paste [Ctrl+V]는 클립보드에 복사되어 있는 심볼들을 현제 모델에 삽입시켜 준다. Delete [Del]는 선택된 심볼들을 삭제한다. 이 때 클립보드에 복사하지는 않는다. Select All는 현제 모델에 포함되어 있는 모든 심볼들을 선택한다. Refresh [F8]는 현제 모델의 모든 심볼들을 모두 지우고 새로 그린다. 이것은 아주 가끔씩 잔상이 생기는 경우에 실행하면 된다.


Symbols Menu
Plastic Usage

Symbols Menu

Select는 현제 모델에서 심볼들을 선택할 수 있는 모드로 전환한다. 심볼 위에서 클릭을 하면 모든 선택이 취소된 후에 클릭된 심볼이 선택된다. 이 때 선택된 심볼은 붉은 색으로 나타난다. 그리고 특정 영역안의 모든 심볼을 선택하고자 한다면 드래그 앤 드롭으로 영역을 지정하여 주면 된다. 그리고 [Shift]키를 누르면서 선택하면, 이전에 선택되어 있는 것들을 유지하면서 선택을 추가할 수가 있다.

Class는 클래스 심볼을 생성하는 모드로, Interface는 인터패이스 심볼을 생성하는 모드로 전환하며, Modeling Area에서 원하는 위치에 클릭을 하면 새로운 심볼이 생기고, Select모드로 다시 전환이 된다. Extends . Implements 는 상속관계를 나타낼 수 있는 모드로 바뀌는데, 반드시 서브클래스(인터패이스)에서 수퍼클래스(인터패이스)로 드래그 앤 드롭을 하여야 한다. Association, Aggregation은 Association Symbol, Aggregation Symbol을 생성하는 모드로 전환하며, Instantiation은 생성관계를 나타낼 수 있는 모드로 전환한다. Comment는 주석심볼을 생성할 수 있으며, Comment Link는 주석심볼을 클래스 또는 인터패이스로 연결할 수 있는 모드로 바뀐다. Text는 한줄짜리 설명을 달 수 있도록 해 준다.


Patterns Menu
Plastic Usage

Patterns Menu

Save As Design Pattern...

지금 편집하고 있는 모델이 Pattern이라면, 이 메뉴를 선택하여 그것을 재사용이 가능한 형태로 저장하여 줄 수 있다. 확장명은 .pat으로 저장이 되는데, 저장이 될 때에는 Package에 관련된 정보나, Design Informations는 모두 저장에서 제외되고 순수하게 모델만이 저장된다.

Insert Design Pattern...

Plastic에서 제공하는 Design Patterns나 사용자가 이미 정의하여 저장해 둔 Patterns를 현제 편집중인 모델에 삽입할 수가 있다. 삽입을 하면 다른 정보에는 전혀 영향을 미치지 않으며, 단지 Pattern에 존재하는 심볼들만이 새롭게 추가될 뿐이다.


Browser...
Plastic Usage

Browser...

Browser는 현제 모델에 있는 클래스와 인터패이스에 관한 리스트와 그것들이 가지고 있는 필드 및 메소드, 생성자들을 트리형태로 보여주고 있다. 또한 보기 쉽게 아이콘 형태로 나타내고 있으며, 아래에는 선택된 클래스, 인터패이스, 필드, 메소드 및 생성자에 Java언어의 표현을 아주 빠르게 보여주고 있다. 그리고 창의 크기 및 경계를 자유롭게 조절할 수 있어서 사용자가 사용하기에 편하도록 하고 있다. 최상단에 있는 3개의 버튼은 차례대로 Refresh, Collapse, Expand인데, Refresh는 브라우저가 열린 이후에 편집된 심볼들을 모두 다시 반영하고 싶을때 사용하며, Collapse는 필드, 메소드, 생성자에 대한 것을 모두 숨겨서 클래스와 인터패이스만을 보여주며, Expand는 반대로 모두다 보여준다.


Package...
Plastic Usage

Package...

패키지에 대한 정보를 설정할 수 있도록 Package Window를 연다.


Design Information...
Plastic Usage

Design Information...

설계에 관한 정보를 기입할 수 있도록 Design Information Window를 열어준다.


Options...
Plastic Usage

Options...

옵션은 Plastic에 대한 환경(Environment Page)에 대한 설정, 모델 다이어그램(Diagram Page)관한 설정 및 JavaEditor(Editor Page)에 관한 설정으로 총 3페이지로 나뉘어 있다. 여기서 설정된 값을 다음에 Plastic을 실행할 때에 모두가 그대로 유지된다.


Environment Page
Plastic Usage

Environment Page

Environment Page를 보면 Java Compiler, Java Code Generate, Browser의 3가지의 그룹으로 구분이다. Java Compiler에는 Java Compiler가 있는 경로명을 설정해주어야 하는데, 이것은 Java Editor에서 Compile메뉴을 선택하였을때, 사용될 것이다. 여기에서는 JDK1.1.1 이상 버젼의 javac.exe를 사용할 것을 권장한다. 그리고 Java Code Generator그룹에서 Include Implementation 체크 박스는 생성할 자바언어의 코드에 구현부분을 포함할 것인지에 대한 여부를, Include Comment는 Comment 심볼에 의한 주석문을 포함할 것인가에 대한 여부를 표시한다. 그리고 Indentation을 생성할 자바언어 코드의 들여쓰기의 공백의 갯수를 설정한다. Browser그룹에는 Browser에서 자바언어의 표현을 보여주는 부분의 폰트 및 색상을 결정할 수 있도록 하였다.


Diagram Page
Plastic Usage

Diagram Page

Diagram Page 에는 화면에 표시되는 각종 심볼의 폰트 모양에 대한 것을 설정할 수 있도록 하는 Font그룹과 Modeling Area의 영역의 크기를 설정할 수 있도록 되어 있는 Size그룹이 있다. Modeling Area의 크기를 변경할 때에는 주의를 요하는데, 크기를 크게 할 때에는 별문제가 없으나, 작게 할 때에는 영역을 벗어나 접근할 수 없는 심볼이 생길 수 있으므로 주의하기 바란다. 그리고 폰트의 모양은 프린팅할 때에도 영향을 미치므로 염두에 두고 있으면 좋을 것이다.


Editor Page
Plastic Usage

Editor Page

Editor Page에는 Java Editor에서 편집하는 부분의 폰트의 모양 및 색상을 정의할 수 있다.


Java Editor...
Plastic Usage

Java Editor...

Java Editor... [F3]는 Java언어의 소스및 html, text 파일을 편집할 수 있도록 Java Editor를 열어준다.


Java Code Generator...
Plastic Usage

Java Code Generator...

Java Code Generator는 현제 모델에서 Package Member인 클래스 및 인터패이스에 대한 Java언어의 소스코드를 자동을 생성시켜준다. 만약 하나의 클래스 또는 인터패이스의 소스코드 생성이 필요하다면 해당 아이템을 선택한 후, Generate One버튼을 누르면 클래스 또는 인터패이스의 이름과 동일한 자바언어의 소스가 Generate Destination Direcroty에서 설정된 디렉토리에 생성이된다. Generate All버튼을 누르면 모든 클래스와 인터패이스에 대하여 코드를 생성하고 Package Name과 동일한 이름의 자바언어 소스가 생성이 된다. Generate Destination Directory는 초기값으로 Package Path로 설정이 되지만 다른 디렉토리에 생성을 원한다면 바꾸어도 무방하다.


Help Menu
Plastic Usage

Translators

Plastic에서는 모두 5가지의 언어의 프로토타입을 생성할 수 있다. Tool메뉴에서 Translators를 선택하면 Java, C++, Delphi Object Pascal, Oberon-2, Eiffel 중 하나를 선택하면 Code Viewer 가 생기면서 프로토타입을 생성해 낸다. C++, Delphi, Oberon-2, Eiffel은 자바의 Built-in 타입에 대하여 자동변환을 해준다. 예를 들어 자바의 int, float은 Oberon-2의 INTEGER, REAL의 타입으로 변환을 해준다.


Translators
Plastic Usage

Help Menu

Contents... 는 도움이 필요할 때 선택한다. 그러면 도움말의 내용이 나타난다. About...는 Plastic에 관한 일반적인 정보가 나타난다.


Class Inspector

Modeling with Plastic

Class Inspector

Java언어에는 클래스를 기술하는데 몇가지 차이점을 표현하기 위해 abstract, public같은 것들이 붙을 수 있다. abstract키 워드가 붙으면 추상클래스를 나타내며, public이 붙으면 package 외부에서도 클래스를 접근할 수 있게 된다. public이 붙지않으면 package가 된다. 이것은 직접 package라는 예약어를 붙이지 않는데, 클래스가 package내부에서만 접근이 가능하다는 것을 뜻한다.

Java에서는 클래스가 하나 이상의 추상메소드(Abstract Method)를 가진다면 그 클래스는 반드시 추상클래스가 되어야 한다. 이점을 유의하여야 하며 이것을 지키지 않으면 컴파일타임에 에러를 낼 것이다. 다음에 몇가지 클래스에 대한 표현이 있다.

class MyClass { ... }

abstract MyClass { ... } // 추상클래스

public MyClass { ... } // package외부에서 접근 가능.

public abstract MyClass { ... }

Class Inspector는 클래스 심볼을 더블클릭하면 나타난다. 거기에는 여러가지 정보를 보여주고, 또 편집할 수 있도록 해준다. 우선 최상단에 클래스의 이름을 기입하고, 접근제한은 public또는 package로 두는데, public으로 두게되면 생성된 Java소스에서 클래스가 public이라는 예약어를 붙이게 된다. 그렇치 않으면 아무것도 붙지 않는다. Abstract Class라는 체크박스에 표시를 하면 abstract라는 예약어가 붙게된다. 한가지 주목할 것이 있는데 그것은 Package Member에 체크표시를 없에 버리면 Java코드가 생성되지 않고, 또 심볼이 점선으로 표시되게 된다는 점이다. 이것은 모델링에 직접적으로 상관이 없으나, 상속관계 또는 연관관계를 표시하기 위해서만 필요한 경우에 사용하게 된다. 나머지 Show Public Only에 체크를 하면, Fields, Methods 중 public인것만 화면에 표시하여 준다.

Attributes(or Fields)부분에서는 속성들이 리스트박스에 나열이 되며, 더블클릭을 하게 되면 Attribute Inspector윈도우가 열린다. 그리고 오른쪽에 두개의 버튼이 있는데, New는 새로운 속성을 생성하고자 할 때, Delete는 리스트박스에서 선택된 속성을 삭제하고자 할 때 사용하는 것이다.

Methods부분에서도 메소드들이 리스트박스에 나열이 된다. 오른쪽에 있는 4개의 버튼을 설명하면, 우선 Method New는 새로운 메소드를 생성할 때 누르면 Method Inspector가 열리면서 새로운 Method를 작성할 수가 있게 되고, Constructor New는 새로운 생성자를 추가하고자 할 때 사용한다. From Ancestor는 이 클래스의 수퍼클래스 또는 수퍼인터페이스가 있을경우 그것들의 메소드중 하나를 그대로 복사해 올 수 있는 기능이다. 메소드를 override하는 경우 메소드의 프로토타입이 일치해야 하므로 이 기능은 매우 편리하다. Delete는 이미 존재하는 메소드의 삭제이다.

Constructor의 경우, 생성자의 이름은 클래스의 이름과 동일한데, 이것은 Inspector에서는 반영이 되지 않고, OK버튼을 누른 후부터 반영이 되므로 주의해야 한다. Cancel을 선택할 경우 Attributes와 Methods에 대한 처리외에는 모두 무시된다.


From Ancestor Dialog

Modeling with Plastic

From Ancestor Dialog

supertypes 리스트 박스에서는 클래스가 상속받은 모든 클래스 또는 인터패이스가 나타난다. 물론 부모(Parent) 뿐만아니라 선조(Ancestor)까지 모두가 다 나오는데, 아이템을 선택하게 되면 오른쪽의 Methods부분에 해당 아이템의 메소드가 모두 나타내게 되는데 이중에 필요한 것을 선택하여 OK버튼을 누르면 된다. Methods부분에는 나타나는 것들은 Constructor를 제외한 Operations와 Methods이다.


Interface Inspector

Modeling with Plastic

Interface Inspector

인터패이스는 그 어떠한 구현도 가지지 않는다. 인터패이스의 Fields는 모두 static이고 final이다. 하지만 그러한 예약어는 붙이지 않는다. 따라서 이것들은 상수(Constant)가 된다. 그리고 모든 Method는 추상메소드이며, 역시 abstract라는 예약어는 붙이지 않는다. 이것은 전혀 구현을 가지지 않아야 한다. 여기서는 이것을 우리는 Operation이라 부르겠다. 클래스와 마찬가지로 public이 되면 패키지 외부에서의 인터패이스의 접근을 허용한다. 다음에 몇가지 인터패이스의 표현이있다.

interface MyInterface { ... }

public interface MyInterface { ... } // 패키지 외부에서 접근가능.

인터패이스 인스팩터에서 최상단에는 인터패이스의 이름을, Access Modifier에서는 접근허용에 관한 것을 설정하며, Package Member에서는 모델링에 관심이 없는 것이면 체크를 없애고, 클래스의 경우와 마찬가지로 코드생성에서 제외되면서, 인터패이스 심볼이 점선으로 표시되게 된다.

Constant 부분의 리스트박스는 상수에 대한 것을 열거하며, 더블클릭인 경우에 Constant Inspector를 열고, New와 Delete는 상수에 대한 추가와 삭제할 때에 사용한다. 이것은 Operation부분에 대해서도 그대로 적용된다.


Attribute Inspector

Modeling with Plastic

Attribute Inspector

Attribute Inspector가 열리면 새로운 속성을 작성하거나 이미 작성된 속성을 변경할 수가 있다. Attribute Name, Attribute Type, Initial Value는 각각 속성의 이름, 데이터 타입, 초기값을 설정할 수가 있다. 만약 각각의 값을 OS, String, �Windows95�라고 했다면 상응하는 자바의 표현은 String OS = �Windows95� 가 될 것이다. 여기에 static과 final을 설정할 수가 있는데, static은 class variable을 final은 값이 더 이상 바뀔 수 없으므로 상수를 의미한다. Attribute Type 부분의 가장 끝에 붙어있는 ... 버튼을 누르면 타입을 Types Dialog에서 선택할 수 있도록 해 준다.


Access Modifier

Modeling with Plastic

Access Modifier

속성, 메소드 등의 접근 변경자에는 package, private, protected, pulbic의 4가지가 있다. package는 아무런 예약어를 붙이지 않았을 때 해당 속성이나 메소드가 패키지의 내부에서만 접근이 가능하다는 것을 의미한다. 그리고 private는 클래스 내부에서만 접근이 가능하며, protected는 클래스이 내부 및 자손 클래스에 의해서도 접근이 가능하다. public은 클래스의 외부에서도 접근이 가능하다는 것을 의미한다.


Constant Inspector

Modeling with Plastic

Constant Inspector

상수는 암시적으로 static이고 final이다. 따라서 값을 빠꿀 수 없으며 Initial Value란에 값을 꼭 넣어두어야 한다. 예를 들면 float Pi = 3.141592 와 같이 작성할 수 있다. 상수의 타입도 Types Dialog에서 선택할 수 있다. 한가지 주의할 점은 값이 int, float 같은 경우는 255, 3.141592처럼 값을 그대로 넣으면 되지만 String형인 경우에는 반드시 �Lee�, �Kim� 처럼 이중 따옴표를 붙여야 한다.


Method Inspector

Modeling with Plastic

Method Inspector

메소드는 다른 개념에 비해 약간 좀 복잡하다. Method Name, Return Type에는 각각 메소드의 이름과 리턴 값이 있는 경우 리턴 값의 타입을 기입한다. 만약 값이 없다면 void이다. 그리고 throws는 Exception Handling에서 나오는 개념인데, 이 메소드가 발생시킬 수 있는 Exception의 타입을 나열한다. 만약 하나 이상의 예외타입이 발생할 수 있다면 ,(comma)로 서로의 타입을 구분해 준다.

Static Method는 클래스의 멤버임을 의미한다. 보통의 경우 클래스의 인스턴스의 멤머이지만 static의 경우에는 클래스의 멤버이다. Abstract Method는 추상메소드로써 구현을 가지지 않는 메소드임을 의미하며 이 메소드를 상속받은 클래스 중 반드시 하나는 구현이 되어야 한다. 그렇치 않으면 컴파일 타임에 에러를 발생시킬 것이다. final은 이 메소드는 더 이상 override이 될 수 없음을 나타내며, synchronized는 multi thread를 이용하고자 할 때, 메소드가 동시성을 가진다는 것을 나타낸다.

메소드가 하나 이상의 인자(argument)를 가질 경우 Argument 부분의 New버튼을 누름으로써 새로운 인자를 추가할 수 있고, Delete버튼으로 이미 존재하는 인자를 삭제할 수 있다. 그리고 Implementation부분에는 메소드의 구현을 삽입할 수가 있다. 이 부분은 자바 코드 생성에서 그대로 복사되어 들어가므로 주의하여 코딩해야 한다. 다음에는 Java언어를 생성한 예의 골격을 보여 주고 있다.

protected final void method_name(int value)

throws exception1, exception2

{

implementation

...

}


Operation Inspector

Modeling with Plastic

Operation Inspector

인터패이스의 메소드는 구현을 가지지 않는다. 따라서 추상메소드라고 볼 수가 있다. 그래서 Method Inspector와는 달리 구현부를 가지지 않는다. 단지 Operation Name, Return Type 그리고 Arguments 부분만을 가진다. 리턴 타입에 대해서는 Types Dialog를 이용할 수가 있다. 오퍼레이션에 대한 몇가지의 예가 아래에 있다.

String AsString();

void Store(Writer writer);

void Clone();


Constructor Inspector

Modeling with Plastic

Constructor Inspector

생성자는 이름도 리턴타입도 어떤한 Access Modifier도 없다. 왜냐하면 그런 것들은 의미가 없기 때문이다. 이름은 클래스의 이름과 동일해야 하고, 리턴 타입은 없으며 Access Modifier는 반드시 public이기 때문에 굳이 기입할 필요가 전혀없다. 하지만 Implementation은 가질 수가 있다.

생성자는 여러개의 인자들을 가질 수가 있는데, 인자들의 타입이나, 갯수에 따라서 서로 다은 생성자가 된다. 즉, 하나의 클래스는 여러개의 생성자를 가질 수 있다. 그리고 생성자들은 상속되지 않는다. 생성자가 없는 경우 자바에서는 인자가 없는 디폴트 생성자를 자동으로 추가시켜준다. 하지만 생성자가 있는 경우에는 그러한 일을 하지 않는다. 아래에 생성자에 대한 예가 있다.

class MyClass {

int MyValue;

MyClass() {

MyValue = 500;

...

}

...

}

...

MyClass myObject = new MyClass();


Argument Inspector

Modeling with Plastic

Argument Inspector

인자(Argument)는 인자의 이름 및 인자의 타입만 기술할 수 있으면 된다. 타입을 기술하기 위해 Types Dialog를 이용할 수가 있다. 자바에서는 메소드에 대한 모든 인자들은 Call By Value의 원칙에 따른다.


Types Dialog

Modeling with Plastic

Types Dialog

Types Dialog는 타입이름을 나열하고 있어서 자주 발생하는 작업인 타입의 이름을 기술하는데 많은 편리함을 제공해 준다. 이것은 자바에서 제공하는 Built-in Type뿐만 아니라 그들에 대한 Wrapper Class 및 현재의 모델에 존재하는 Class나 Interface에 대한 이름까지 포함하고 있어서 간단하게 타입의 이름을 기술할 수 있도록 도와준다.


Class Extends

Modeling with Plastic

Class Extends

클래스를 확장(extend)하는 것은 간단하다. extends라는 예약어 뒤에 수퍼클래스의 이름을 적어주면 그것으로 끝이다. 이렇게 하면 수퍼클래스의 일부 속성 및 메소드들(protected, public인 것들)을 아무런 노력없이 상속받을 수 있다. 자바에서 클래스에 대해서는 수퍼클래스를 단지 하나만 허용한다. 위의 그림에 나타난 형태를 Java언어로 바꾸면 아래와 같다.

class subclass extends superclass { ... }

Plastic에서는 Inheritance 심볼을 선택한 후에 서브클래스에서 부터 수퍼클래스로 드래그 앤 드롭(Drag & Drop)을 하면 새로운 삼각형 심볼이 생기면서 연결이 된다.  만약 하나의 수퍼클래스에 여러개의 서브클래스를 연결하고자 한다면, 최초의 서브클래스는 위와 같은 방법으로 하고 나머지 서브클래스를 연결할 때에는 드래그 앤 드롭에서 드롭(Drop)행위를 삼각형 심볼 위에다가 하면(마우스 버튼을 삼각형 심볼에서 놓으면) 보기 좋게 삼각형 심볼을 공유하면서 서로 연결을 할 수가 있다.


Interface Extends

Modeling with Plastic

Interface Extends

인터패이스의 상속의 표기법은 클래스와 동일하지만 클래스의 것과는 약간 다르다. 인터패이스는 수퍼인터패이스를 하나 이상을 허용한다. 이렇게 해서 만들어진 서브인터패이스는 모든 수퍼인터패이스의 특징을 물려받으며, 수퍼인터패이스를 요구하는 문맥에 서브인터패이스가 대신 쓰일수 있다. (Substitutability)

interface subinterface extends superinterface1, superinterface2 {

// new properties...

}


Implements

Modeling with Plastic

Implements

클래스는 하나 이상의 인터패이스로부터 상속을 받을 수가 있다. (역은 불가능!) 단지, 수퍼인터패이스의 오퍼레이션을 모두 구현해야만 한다. 몇가지 구현되지 않은 것이 있다면 그 클래스는 추상클래스(abstract class)이어야 하고 그 자손클래스에는 완전히 구현되어야만 한다. 서브클래스의 인스턴스(instance)는 수퍼인터패이스 인터패이스를 요구하는 자리에 대신 사용될 수 있다.

class subclass implements superinterface1, superinterface2 {

...

// implements operations of superinterfaces.

}


Association Inspector

Modeling with Plastic

Association Inspector

객체간의 연관을 표시하기 위해서는 Association 또는 Aggregation 심볼을 선택한 후에 From Class에서 To Class로 드래그 앤 드롭을 하면 생성된다. From Class와 To Class에 공통적으로 들어가 있는 것은 Role Name과 Access Modifier인데, 객체가 연관 하는 다른 객체에 대해서 어떠한 역할을 하는지에 대한 이름을 써 넣은 곳이고, Access Modifier는 객체간의 연관이 밖으로 드러나는 정도를 표현할 수 있다.

From Class에서는 One 또는 Many중에 선택할 수가 있는데, From Class의 객체가 단지 하나만 연관에 관여하는지 아니면 여러개가 관여하는지를 나타낼 수 있다. To Class에서는 그 연관의 형태가 Association인지 아니면 Aggregation인지를 선택하도록 되어있다. Plastic에서는 근본적으로 Association Symbol과 Aggregation Symbol간의 차이가 없으나, 생성한 직후에 결정되는 연관의 형태가 다르다.

Person과 Company에 대한 연관을 나타내면 From Class가 Person이되고 To Class가 Company가 되는데, Person은 Company에 대해서 피고용인(employee) 이므로 Role Name은 employee, Company는 Person에 대해서 고용인(employer)이므로 Role Name은 employer가 된다. 또한 Person은 Company의 Part가 아니므로 연관의 형태는 Association이다.

class Person {

        Company employer;

}

class Company {

        Person[] employee = new Person[]; // reference

}


Comment Inspector

Modeling with Plastic

Comment Inspector

어떤 클래스나 인터패이스에 주석을 붙이고자 한다면 우선 Comment 심볼을 선택하여 Comment를 하나 생성하고, 그것을 터블클릭하여 Comment Inspector를 연 다음에 설명을 써 넣는다. 그리고 Comment Link 심볼을 선택하여 Comment로부터 주석을 붙일 클래스나 인터패이스로 드래그 앤 드롭을 한다. 만약 주석을 �this is a class�라는 설명을 붙였다면 아래와 같이 자바언어가 생성될 것이다.

// this is a class

class Something { ... }


Text Inspector

Modeling with Plastic

Text Inspector

Text는 어떠한 의미도 가지지 않지만 가장 필수적인 것이라 하겠다. 이것은 설계된 구석구석에 설명을 달수가 있다. 이것은 단지 한 줄만 가능하다. 되도록이면 이것을 많이 사용할 것을 권장한다. 왜냐하면 설명을 많이 달수록 이해하는데 도움이 되기 때문이다. Java언어의 생성에는 전혀 영향을 미치지 않는다.


Package Window

Modeling with Plastic

Package Window

Plastic에서는 하나의 모델은 곧 하나의 패키지를 의미한다. 따라서 연관성이 있는 객체들간의 모임에 관심을 둔다. 위의 그림에서 보듯이 Package 윈도우에서는 패키지에 관한 정보를 기술할 수 있으면 그 패키지를 구현하기 위해서 다른 패키지의 수입(Import)을 관리할 수 있다. 만약 지금 설계하고 있는 것이 기하학에 관한 것이라면 그 패키지의 이름을 Geomatric이라고 둘 수가 있겠고, 또 생성된 자바언어와 컴파일된 클래스 파일이 저장될 경로명을 기입할 수가 있다. 위의 그림과 같이 설정이 되었다면 생성되는 자바언어의 소스에 다음과 같이 포함될 것이다.

package Geomatric;

import java.math.*;

import java.graphics.*


Import Window

Modeling with Plastic

Import Window

Import할 패키지가 있다면 Import 윈도우를 사용할 수가 있다. 이것은 자바에서 기본적으로 제공하는 대부분의 패키지에 대한 기술을 포함하고 있어, 많은 경우에 있어서 바로 선택하여 삽입할 수 있다. 만약 없는 경우에는 Edit박스에 직접 기입할 수 있다.


Design Information Window

Modeling with Plastic

Design Information Window

설계에 관한 정보들도 설정할 수가 있는데, Title, Author, Comments가 그것들이다. Title에는 모델의 이름을, Author에는 저자(개발자)의 이름, 그리고 Comments란에는 대충의 설명이나, 그 외의 어떤 것도 올 수가 있다. 이것은 자바언어의 생성에서 주석문으로 들어가게 되는데, Comments부분은 특별한 주석의 형태인 /** ... */ 으로 들어가게 된다. 이 형태는 특정 유틸리티에 의해서 자동으로 문서화가 될 수 있는 장점이 있다. 그리고 마지막에 보이는 표형태는 몇가지의 정보를 보여주는데, 클래스의 개수, 인터패이스의 개수, 연관의 개수 등 여러가지의 정보를 나타내어 준다. 만약 위와 같이 편집되었다면 아래와 같은 주석문이 삽입될 것이다.

/*

 * This program was generated by PLASTIC

 *

 * Author : Hong Gil-Dong

 * Title : Geomatric Library Project

 * Generated Date : 97-07-18

 */

...

/**

 * Copyright(c) 1996. 4 ~ 1997. 7 All Rights Reserved.

 * Dong-A University.

 */


What Is a Design Patterns.

Design Patterns

What Is a Design Pattern.

Design Pattern이란 소프트웨어의 모델링에서 자주 발견되는 문제들을 기술하고, 또한 그러한 문제의 해결에 대한 핵심을 기술해 놓은 것으로써, 문제 해결에 대한 동일한 노력의 반복없이 문제 해결의 효과를 얻을 수 있는 매우 강력한 장점을 가진 것이다.

Design Patterns의 종류는 많이 있는데 크게 Creational Patterns, Structural Patterns, Behavioral Patterns로 나누고 각각에 대해서 여러개의 패턴이 존재한다. 우선 Creational Patterns에는 Abstract Factory, Builder, Factory Method, Prototype, Singleton이 있고, Structural Patterns에는 Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy가 있으며, Behavioral Patterns에는 Chain of Responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy, Template Method, Visitor가 있다.

※ 여기에 나오는 Design Patterns에 관한 대부분의 내용은 Design Patterns: Elements of Reusable Object-Oriented Software (저자: Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. 출판사:Addison-Wesley) 책을 인용하거나 참고했음을 밝힌다.


Plastic에서 Pattern을 작성하고, 삽입하기

Design Patterns

Plastic에서 Pattern을 작성하고,삽입하기

Plastic에서는 사용자 정의 Pattern을 저장하거나, 이미 존재하는 Pattern을 현재 모델로 삽입할 수 있는 기능이 있다. 사용자 정의 Pattern을 생성하려면 다른 것을 제외한 순수하게 패턴에 대한 것만을 편집한 후 Patterns메뉴에서 Save As Design Pattern을 선택하여 저장하면 확장자가 .pat인 파일이 생성되게 된다. 그리고 Pattern을 삽입하고자 한다면 Patterns메뉴에서 Insert Design Pattern을 선택하여 파일명을 지정해주면 현재 모델에 삽입이 된다.


Factory Method

Design Patterns

Factory Method (Class Creational)

Factory Method 패턴은 Virtual Constructor라고도 알려져 있는데, 객체를 생성하기 위한 인터패이스를 제공한다. 하지만 어떤 클래스의 인스턴스를 생성할 것인지는 이것의 서브클래스가 결정한다. Factory Method는 클래스가 인스턴스의 생성을 서브클래스로 미루도록 한다.

위 그림에서 Creator의 FactoryMethod()는 추상메소드로써 그것은 어떤 것도 생성하지 않고 다만 그것의 서브클래스인 ConcreteCreator의 FactoryMethod()를 재정의 함으로써 어떤 클래스의 인스턴스를 생성할 것인지를 결정한다. 그것은 바로 ConcreteProduct 의 인스턴스 이다. 아래에 간단한 자바 언어로 대충의 골격을 나타내었고 간단한 예가 있다.

abstract class Creator {

        public abstract void FactoryMethod();

        public void AnOperation() {

                ...

        }

}

class ConcreteCreator extends Creator {

        /* It Creates Instance of ConcreteProduct Class */

        public void FactoryMethod() {

                return new ConcreteProduct();

        }

}


Composite

Design Patterns

Composite (Object Structural)

객체들을 부분-및-전체의 게층구조를 나타내기 위하여 트리구조로써 구성한다. Composite는 클라이언트가 개개의 객체와 그 객체의 조합(composition)을 균일하게 다룰 수 있도록 해 준다.

위 그림에서 Client는 Component를 접근하고 Composite는 Component의 서브클래스이다. Operation을 호출했 때, 만약 그 객체가 Left의 인스턴스라면 개별적인 어떤 작업을 수행하고, Composite의 인스턴스라면 그것이 포함하고 있는 Component 객체들에 대한 모든 작업을 균일하게 수행하게 될 것이다. 다음에 자바언어의 골격과 예제가 있다.

class Component {

        public void Operation() {

                ...

        }

}

class Leaf extends Component {

        public void Operation() {

                ...

        }

}

class Composite extends Component {

        List children = new List();

        public void Operation() {

                // for g all in children g.Operation();

                ...

        }

        public void Add(Component AComponent) {

                List.Add(AComponent);

        }

        public void Remove(Component AComponent) {

                List.Remove(AComponent);

        }

        public int GetChild() {

                return List.Count;

        }

}


Java Editor의 소개

Java Editor

Java Editor의 소개

Java Editor는 Plastic에 포함되어 있는 자바언어를 위한 에디터이다. 이것은 텍스트 문서를 편집할 수 있도록 고안되어 있는데, 확장자 .java, .htm, .html, .txt 등을 불러올 수 있다. 여러개의 문서를 한꺼번에 편집할 수 있는데, 이것은 MDI(Multiple Document Interface)에 기반한 방법이 아닌 Page Tab을 이용한 것이라 MDI에 비해 문서작업의 전환이 빠르며 오히려 더 편리하다.

그리고 자바 컴파일러의 옵션을 설정하면 버튼 하나로 컴파일을 할 수 있으며, Compile Error는 Message Window가 나타내어 주는데 에디트 윈도우 바로 아래에 생겨서 디버깅도 편리하게 할 수 있도록 도와준다.

자바 에디터는 기존의 에디터와 비슷한 메뉴를 가지는데, File, Edit, Search, Compile, Help 정도의 메뉴를 가지고 있고, 빠른 작업을 위해 Speed Buttons을 자주 쓰는 메뉴에 할당해 놓았다. 스피트 버튼은 왼쪽에서 차례대로, New, Open, Save, Print, Cut, Copy, Paste, Find, Find Next, Replace, Compile이다. 그리고 편집 윈도우의 탭에는 파일의 이름이 나타난다. 아래의 상태바에는 현재 편집중인 곳의 Column과 Row를 나타나며, 그 오른쪽에는 변경의 여부를 Modified라는 문자를 통해서 나타내며, 그 옆에는 편집중인 파일의 완전한 경로가 나타난다.


Java Editor 이용하기

Java Editor

Java Editor 이용하기

새 문서를 생성할 때에는 File | New 메뉴를 선택하거나, 스피트 버튼 중에 New라는 힌트(Hint)가 나타나는 버튼을 누르면 된다. 이 때 확장자는 기본적으로 .java이다. 그리고 하나 이상의 문서가 이미 열려있다면, 마우스의 오른쪽 버튼을 눌러서 나타난 팝업 메뉴에 New Edit Page를 선택해도 된다. 문서를 열고자 할 때에는 File | Open을 선택하거나 해당 스피트 버튼을 선택한다. 그리고 문서 닫기를 원할때에도 File | Close를 선택하거나 오른쪽 버튼을 눌러 팝업메뉴가 나타나게 한 다음 Close Page를 선택해도 된다.

편집 중인 자바 언어를 컴파일 하고자 한다면 단지 [F8]을 누르거나 Compile을 선택하면 된다. 그런데 이렇게 하기 이전에 Plastic의 Option메뉴의 Environment Page에서 자바컴파일러의 경로를 반드시 설정해주어야 한다. 컴파일이 끝났을 때 만약 에러가 있다면 아래쪽에 새로운 리스트박스가 나타나면서 붉은 색으로 에러를 알려줄것이다. 그렇치 않다면 Compile Completely라는 메시지가 나오면서 컴파일에 성공했다는 메시지를 보여줄 것이다.

글꼴 및 색상바꾸기을 바꾸고 싶다면 Plastic의 Option의 Editor Page에서 그것을 설정할 수가 있다. 그리고 프린트로 출력을 원한다면 File | Print...를 선택하면 된다. 자바 에디터는 독립적인 애플리케이션이 아니기 때문에 그것의 크기와 위치 그리고 글꼴 및 색상이 모두 다음번 실행때에도 유지가 되므로, 자신에게 편리한 위치와 크기를 설정해 두면 좋다.


Applet Template

Examples

Applet Template

Plastic은 자바의 Applet개발에 도움이 될 수 있는 애플릿 템플릿(AppletTemplate.pla)를 제공하고 있다. 이것은 애플릿에 관련된 클래스 및 인터패이스와 그것이 가지고 있는 메소드들을 보여주고 있어서 애플릿개발에 많은 도움을 준다. Applet, AppletContext, AppletStub, AudioClip은 java.applet 패키지에 포함되어 있는 것들이다. 그래서 Package Window를 연 후, Import부분을 보면 java.applet.*가 삽입되어 있는 것을 볼 수 있을 것이다. 자바의 애플릿은 Applet클래스로부터 상속을 받아야 한다. MyApplet부분에 자신이 원하는 애플릿으로 추가, 확장하기만 하면 된다.


Applet Demo

Examples

Applet Demo

애플릿 템플릿을 이용하여 간단한 애플릿 예제(AppletDemo.pla)를 볼 수 있다. 이것을 열면 위의 그림과 같이 나오는데, MyApplet이 GraphicsApplet으로 확장되어 있는 것을 알 수 있다. 이것을 Java Code Generator를 이용하여 Java Source로 만들고, 컴파일하면 GraphicsApplet.class가 나오는데 이것이 바로 완성된 애플릿이 된다.


Applet Demo Source

Examples

Applet Demo Source

/*

 * This program was generated by PLASTIC

 *

 * Author : Min-Kyu Lee

 * Title : GraphicsApplet

 * Generated Date : 97-07-22

 */

package GraphicsApplet;

import java.awt.*;

import java.applet.*;

/**

 * This example is from :

 *

 * HOOKED ON JAVA

 * Arthur van Hoff, Sami Shaio, Orca Starbuck.

 * Addison-Wesley Publishing Company.

 *

 * An applet that draws different shapes depending

 * on the configuration of the HTML tag. It

 * accepts the following attributes in addition

 * to the standard attributes:

 *

 * SHAPE - on of "Line", "Rectangle", "String" or "Image"

 * COLOR - which foreground color to use.

 * TEXT - If SHAPE is "String" this is the text to draw.

 * IMAGE - If SHAPE is "Image" this is the image to draw.

 */

public class GraphicsApplet extends Applet {

        Font appFont;

        Color appColor;

        String appShape;

        String appText;

        Image image;

        public void init() {

                appFont = new Font("Helvetica", Font.BOLD, 14);

                String arg = getParameter("COLOR");

                if (arg != null) {

                        appColor = colorFromString(arg, Color.red);

                }

                appShape = getParameter("SHAPE");

                if (appShape == null) {

                        appShape = "Line";

                }

                appText = getParameter("TEXT");

                if (appText == null) {

                        appText = "Graphics";

                }

                arg = getParameter("IMAGE");

                if (arg != null) {

                        image = getImage(getDocumentBase(), arg);

                }

        }

        public Color colorFromString(String s, Color defaultColor) {

                Integer i;

                try {

                        i = Integer.valueOf(s, 16);

                        return new Color(i.intValue());

                } catch (NumberFormatException e) {

                        return defaultColor;

                }

        }

        public void drawCenteredString(String s, Graphics g, Dimension r) {

                FontMetrics fm = g.getFontMetrics(appFont);

.	drawString(s,

                        (r.width - fm.stringWidth(s)) / 2,

                        (r.height - fm.getHeight()) / 2);

        }

        public void paint(Graphics g) {

                Dimension r = size();

                g.setColor(appColor);

                if (appShape.equalsIgnoreCase("line")) {

                        g.drawLine(0, 0, r.width, r.height);

                } else if (appShape.equalsIgnoreCase("rectangle")) {

                        g.drawRect(0, 0, r.width - 1, r.height - 1);

                } else if (appShape.equalsIgnoreCase("image")) {

                        g.drawImage(image, 0, 0, r.width, r.height, this);

                } else if (appShape.equalsIgnoreCase("string")) {

                        g.setFont(appFont);

                        drawCenteredString(appText, g, r);

                }

        }

}


Applet Demo Result

Examples

Applet Demo Result

완성된 애플릿을 보기위해서는 JDK의 appletviewer나 Netscape Navigator, Internet Explorer 같은 웹브라우저를 이용할 수가 있겠는데, 웹브라우저에서 볼 수 있도록 GraphicsApplet.html이 제공되고 있다. 다음에 Netscape에서의 실행결과 화면과 HTML 소스를 볼 수 있다.

<HTML>

<HEAD>

  <TITLE>GraphicsApplet Demo</TITLE>

</HEAD>

<BODY>

  <H1>GraphicsApplet</H1>

  This Applet was generated by Plastic 1.0 for Java.<br>

  Author : Min-Kyu Lee<br>

  Title : GraphicsApplet<br>

  Generated Date : 97-07-21<br>

  <HR>

  <APPLET code="GraphicsApplet.class" width=350 height=50>

    <PARAM NAME="SHAPE" VALUE="Rectangle">

    <PARAM NAME="COLOR" VALUE="ffffff">

  </APPLET>

  <BR>

  <APPLET code="GraphicsApplet.class" width=350 height=50>

    <PARAM NAME="SHAPE" VALUE="String">

    <PARAM NAME="COLOR" VALUE="ff0000">

    <PARAM NAME="TEXT" VALUE="Object-Oriented Modeling Tool - Plastic 1.0">

  </APPLET>

  <BR>

  <APPLET code="GraphicsApplet.class" width=350 height=50>

    <PARAM NAME="SHAPE" VALUE="String">

    <PARAM NAME="COLOR" VALUE="0000ff">

    <PARAM NAME="TEXT" VALUE="Java AppletDemo (using AppletTemplate.pla)">

  </APPLET>

</BODY>

</HTML>


Application Demo

Examples

Application Demo

자바에서 애플리케이션을 위한 예제도 제공된다. ApplicationDemo.pla는 Red, Green, Blue의 조절을 통하여 그것들의 조합이 만들어내는 색상을 보여주는 프로그램이다. 이것을 애플릿이 아니므로 웹브라우저나, appletviewer에서는 실행해 볼 수 없고, JDK의 java 등의 프로그램을 이용해야 한다.

이 애플리케이션은 윈도우를 열어야 하므로 Frame으로부터 상속을 받았다. 그리고 main이 실행되게 된다. handleEvent는 사용자가 할 수 있는 행동에 대한 이벤트 처리를 하고 있고, paint는 화면에 그려질 때 불리는 메소드이다. 여기서는 몇가지 컨트롤(Control)들을 이용하고 있는데, Panel, Label, Scrollbar 등이 그것들이다.


Application Demo Source

Examples

Application Demo Source

/*

 * This program was generated by PLASTIC

 *

 * Author : Min-Kyu Lee

 * Title : RGB Color Test

 * Generated Date : 97-07-22

 */

import java.awt.*;

/**

 * This examples is "BLUETTE 0.62" Exmaple.

 * By Hyoung-Gook Kim.

 */

public class ColorTest extends Frame {

        boolean fForm_Create;

        Panel Panel1;

        Label Label1;

        Label Label2;

        Label Label3;

        Label RedLabel;

        Label GreenLabel;

        Label BlueLabel;

        Scrollbar ScrollBar1;

        Scrollbar ScrollBar2;

        Scrollbar ScrollBar3;

        ColorTest() {

                // Frame Initialization

                setForeground(Color.black);

                setBackground(Color.lightGray);

                setFont(new Font("Dialog",Font.BOLD,12));

                setTitle("ColorTest");

                setLayout(null);

                // Component Initialization

                Panel1 = new Panel();

                Panel1.setLayout(null);

                Panel1.setForeground(Color.black);

                Panel1.setBackground(Color.black);

                Panel1.setFont(new Font("Dialog",Font.BOLD,12));

                Label1 = new Label("Red :",Label.LEFT);

                Label1.setFont(new Font("Dialog",Font.BOLD,12));

                Label2 = new Label("Green :",Label.LEFT);

                Label2.setFont(new Font("Dialog",Font.BOLD,12));

                Label3 = new Label("Blue :",Label.LEFT);

                Label3.setFont(new Font("Dialog",Font.BOLD,12));

                RedLabel = new Label("0",Label.LEFT);

                RedLabel.setFont(new Font("Dialog",Font.BOLD,12));

                GreenLabel = new Label("0",Label.LEFT);

                GreenLabel.setFont(new Font("Dialog",Font.BOLD,12));

                BlueLabel = new Label("0",Label.LEFT);

                BlueLabel.setFont(new Font("Dialog",Font.BOLD,12));

                ScrollBar1 = new Scrollbar(Scrollbar.HORIZONTAL);

                ScrollBar1.setValues(0,22,0,255);

                ScrollBar1.setBackground(Color.lightGray);

                ScrollBar2 = new Scrollbar(Scrollbar.HORIZONTAL);

                ScrollBar2.setValues(0,22,0,255);

                ScrollBar2.setBackground(Color.lightGray);

                ScrollBar3 = new Scrollbar(Scrollbar.HORIZONTAL);

                ScrollBar3.setValues(0,22,0,255);

                ScrollBar3.setBackground(Color.lightGray);

                // Add()s

                add(ScrollBar3);

                add(ScrollBar2);

                add(ScrollBar1);

                add(BlueLabel);

                add(GreenLabel);

                add(RedLabel);

                add(Label3);

                add(Label2);

                add(Label1);

                add(Panel1);

                fForm_Create = true;

        }

        void InitialPositionSet() {

                reshape(191,107,283,229);

                Panel1.reshape(11,29,262,95);

                Label1.reshape(26,143,48,16);

                Label2.reshape(13,167,64,16);

                Label3.reshape(22,192,54,16);

                RedLabel.reshape(76,143,55,16);

                GreenLabel.reshape(77,168,50,16);

                BlueLabel.reshape(77,194,54,16);

                ScrollBar1.reshape(142,141,121,16);

                ScrollBar2.reshape(142,168,121,16);

                ScrollBar3.reshape(142,195,121,16);

                fForm_Create = false;

        }

        public boolean handleEvent(Event evt) {

                // handleEvent()

                if (evt.id == Event.WINDOW_DESTROY && evt.target == this)

                        ColorTest_WindowDestroy(evt.target);

                else if (evt.id == Event.SCROLL_ABSOLUTE && evt.target == ScrollBar1)

                        ScrollBar1_ScrollAbsolute(evt.target,

                                ((Scrollbar)(evt.target)).getValue());

                else if (evt.id == Event.SCROLL_LINE_DOWN && evt.target == ScrollBar1)

                        ScrollBar1_ScrollAbsolute(evt.target,

                                ((Scrollbar)(evt.target)).getValue());

                else if (evt.id == Event.SCROLL_LINE_UP && evt.target == ScrollBar1)

                        ScrollBar1_ScrollAbsolute(evt.target,

                                ((Scrollbar)(evt.target)).getValue());

                else if (evt.id == Event.SCROLL_PAGE_DOWN && evt.target == ScrollBar1)

                        ScrollBar1_ScrollAbsolute(evt.target,

                                ((Scrollbar)(evt.target)).getValue());

                else if (evt.id == Event.SCROLL_PAGE_UP && evt.target == ScrollBar1)

                        ScrollBar1_ScrollAbsolute(evt.target,

                                ((Scrollbar)(evt.target)).getValue());

                else if (evt.id == Event.SCROLL_ABSOLUTE && evt.target == ScrollBar2)

                        ScrollBar2_ScrollAbsolute(evt.target,

                                ((Scrollbar)(evt.target)).getValue());

                else if (evt.id == Event.SCROLL_LINE_DOWN && evt.target == ScrollBar2)

                        ScrollBar2_ScrollAbsolute(evt.target,

                                ((Scrollbar)(evt.target)).getValue());

                else if (evt.id == Event.SCROLL_LINE_UP && evt.target == ScrollBar2)

                        ScrollBar2_ScrollAbsolute(evt.target,

                                ((Scrollbar)(evt.target)).getValue());

                else if (evt.id == Event.SCROLL_PAGE_DOWN && evt.target == ScrollBar2)

                        ScrollBar2_ScrollAbsolute(evt.target,

                                ((Scrollbar)(evt.target)).getValue());

                else if (evt.id == Event.SCROLL_PAGE_UP && evt.target == ScrollBar2)

                        ScrollBar2_ScrollAbsolute(evt.target,

                                ((Scrollbar)(evt.target)).getValue());

                else if (evt.id == Event.SCROLL_ABSOLUTE && evt.target == ScrollBar3)

                        ScrollBar3_ScrollAbsolute(evt.target,

                                ((Scrollbar)(evt.target)).getValue());

                else if (evt.id == Event.SCROLL_LINE_DOWN && evt.target == ScrollBar3)

                        ScrollBar3_ScrollAbsolute(evt.target,

                                ((Scrollbar)(evt.target)).getValue());

                else if (evt.id == Event.SCROLL_LINE_UP && evt.target == ScrollBar3)

                        ScrollBar3_ScrollAbsolute(evt.target,

                                ((Scrollbar)(evt.target)).getValue());

                else if (evt.id == Event.SCROLL_PAGE_DOWN && evt.target == ScrollBar3)

                        ScrollBar3_ScrollAbsolute(evt.target,

                                ((Scrollbar)(evt.target)).getValue());

                else if (evt.id == Event.SCROLL_PAGE_UP && evt.target == ScrollBar3)

                        ScrollBar3_ScrollAbsolute(evt.target,

                                ((Scrollbar)(evt.target)).getValue());

                return super.handleEvent(evt);

        }

        public void paint(Graphics g) {

                if (fForm_Create) InitialPositionSet();

        }

        public static void main(String args[]) {

                ColorTest ColorTest = new ColorTest();

                ColorTest.show();

        }

        void ColorTest_WindowDestroy(Object target) {

                System.exit(0);

        }

        void ScrollBar1_ScrollAbsolute(Object target, int value) {

                RedLabel.setText(""+ScrollBar1.getValue());

                Panel1.setBackground(new

                        Color(ScrollBar1.getValue(),

                                ScrollBar2.getValue(),

                                ScrollBar3.getValue()));

                Panel1.repaint();

        }

        void ScrollBar2_ScrollAbsolute(Object target, int value) {

                GreenLabel.setText(""+ScrollBar2.getValue());

                Panel1.setBackground(new

                        Color(ScrollBar1.getValue(),

                                ScrollBar2.getValue(),

                                ScrollBar3.getValue()));

                Panel1.repaint();

        }

        void ScrollBar3_ScrollAbsolute(Object target, int value) {

                BlueLabel.setText(""+ScrollBar3.getValue());

                Panel1.setBackground(new

                        Color(ScrollBar1.getValue(),

                                ScrollBar2.getValue(),

                                ScrollBar3.getValue()));

                Panel1.repaint();

        }

}


Application Demo Result

Examples

Application Demo Result

생성된 자바 소스코드를 Java Editor의 Compile 기능으로 컴파일하면 ColorTest.class가 생성이 되는데, 이것을 JDK의 java로 실행해 볼 수 있다. (예, c:\jdk1.1.1\bin\java ColorTest) 그것을 실행하면 다음 그림과 같이 새로운 윈도우가 열리면서 애플리케이션이 실행된다.