[01] Amateras UML 툴 설치
1. Eclipse 모델링 프레임웍 다운로드
1) Eclipse를 종료합니다.
2) http://www.eclipse.org/gef/ -> Download
or
http://www.eclipse.org/gef/downloads/index.php
3) GEF4 Update Site ->'GEF4-Update-4.0.0.zip' 다운로드
4) 'GEF4-Update-4.0.0' 폴더에 압축을 풉니다.
5) 'GEF4-Update-4.0.0' 폴더의 모든 내용을 '/eclipse' 폴더에 복사하여 덮어 씁니다.
2015-08-18 오후 02:28 <DIR> features
2015-08-18 오후 02:28 <DIR> plugins
2015-07-09 오후 03:51 4,108 artifacts.jar
2015-07-09 오후 03:51 41,974 content.jar
2. Amateras UML 다운로드
http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi
-> 왼쪽 상단 Download 클릭
- AmaterasUML_1.3.4.zip 다운로드
압축 파일을 선택하고 '여기에 풀기'를 실행합니다.
net.java.amateras.umleditor.java_1.3.4.jar
net.java.amateras.umleditor_1.3.4.jar
net.java.amateras.xstream_1.3.4.jar
위의 3개의 파일을 '/eclipse/plugins' 폴더에 복사합니다.
3. Eclipse를 다시 시작 합니다.
4. 설치가 성공적으로 되었습니다.
- 'AmaterasUML'이 출력되면 설치 성공입니다.
[02] 상속(Inheritance)
- 부모(Parent) 클래스의 메소드와 필드(변수)등이 자식(Child) 클래스로 자동으로 전달된다.
. 필드(변수)는 private 선언을 주로함으로 상속이되지 않습니다.
- 클래스들이 공통적으로 사용하는 기능을 부모 클래스에 저장 한 후
상속받아 사용하면 개발 속도를 향상 시킬 수 있다.
- 소스 재사용으로 인한 개발자의 개발 부담이 감소된다.
- JAVA의 아버지격인 C++은 상속을 여러 클래스로부터 받을 수 있어 개발시
소스 분석에 어려움이 있으나 자바는 하나의 클래스로부터만 상속을 받을 수
있습니다. - 개발시에 상속을 권장하지 않는데 그 이유는 2개 이상의 클래스가
서로 결합되어 객체지향이라는 독립성을 위배하기 때문에 사용을
추천하지 않습니다.
예) 부모 클래스와 자식 클래스가 서로 관련되어 자식 클래스가 독립적으로
기능을 실행할 수 없습니다. 소스 변경시 예상하지 못한 다른곳에서 에러 발생
- JAVA API는 20년이상 오랫동안 많은 변화를 거치면서 세부분류가 많이 발생하고
기능이 추가되어 상속이 많이 발생합니다.
상속을 개발시에 사용하지 않더라도 자바 API를 사용하기위해 위해 상속을
알아야합니다.
- 형식: public class 본인(자식 클래스) extends 부모 클래스{ ... }
1. 새로운 기능이 추가되며 부모 기능을 상속하는 경우
[실행 화면]
모토롤라
전화 기능
문자 기능
---------------------
Samsung
전화 기능
문자 기능
멀티미디어 메시지
300만 화소 지원
---------------------
Android
전화 기능
문자 기능
멀티미디어 메시지
300만 화소 지원
제3자 컨텐츠 유통
인터넷
모바일 웹
---------------------
전화 기능
문자 기능
멀티미디어 메시지
300만 화소 지원
제3자 컨텐츠 유통
인터넷
모바일 웹
사물 인터넷 지원
대규모 데이터 발생 및 분석
데이터를 통한 미래 예측, 확률
▷ oop2.Phone.java-----------------------------------------------------------------------------------
package oop2;
public class Phone {
String phone_name = "모토롤라";
public void tel() {
System.out.println("전화 기능");
}
public void sms() {
System.out.println("문자 기능");
}
}
-----------------------------------------------------------------------------------
▷ oop2.PDA.java-----------------------------------------------------------------------------------
package oop2;
public class PDA{
String pda_name = "Samsung";
public void mms() {
System.out.println("멀티미디어 메시지");
}
public void camera() {
System.out.println("300만 화소 지원");
}
}
-----------------------------------------------------------------------------------
▷ oop2.Smart.java-----------------------------------------------------------------------------------
package oop2;
public class Smart{
String smart_name = "Android"; // 70% 소득
public void market() {
System.out.println("제3자 컨텐츠 유통");
}
public void internet() {
System.out.println("인터넷");
}
public void mweb() {
System.out.println("모바일 웹");
}
}
-----------------------------------------------------------------------------------
▷ oop2.FIR.java-----------------------------------------------------------------------------------
package oop2;
// FIR: 4IR, Fourth Industrial Revolution, 4차 산업 혁명
public class FIR {
public void iot() {
System.out.println("사물 인터넷 지원");
}
public void bigdata() {
System.out.println("대규모 데이터 발생 및 분석");
}
public void ai() {
System.out.println("데이터를 통한 미래 예측, 확률");
}
}
-----------------------------------------------------------------------------------
▷ oop2.Inhe.java-----------------------------------------------------------------------------------
package oop2;
public class Inhe {
public static void main(String[] args) {
.....
}
}
-----------------------------------------------------------------------------------
2. 상속 UML 제작하기: class diagram
- 파일명: /ws_java/oop/src/oop2/Inhe.cld
3. 공통 기능을 공유하며 다양한 유형으로 기능이 분류되는 경우
[실행 화면]상품명: 짜장면
가격: 5000
수량: 2
결재 금액: 10000
현금 결재를 합니다.
-------------------------
상품명: 김밥
가격: 2000
수량: 5
결재 금액: 10000
카드 결재를 합니다.
50 포인트 지급 예정(0.5%)
-------------------------
상품명: 라면
가격: 3500
수량: 2
결재 금액: 7000
모바일 결재를 합니다.
-------------------------
상품명: 아메리카노
가격: 2000
수량: 3
결재 금액: 6000
포인트 결재를 합니다.
▷ oop2.Payment.java-----------------------------------------------------------------------------------package oop2;
public class Payment {
String name = ""; // 상품명
int price = 0; // 가격
int count = 0; // 갯수
int total = 0; // 결재 금액
public void order(String name, int price, int count) {
this.name = name;
this.price = price;
this.count = count;
}
public void calc() {
this.total = this.price * this.count;
System.out.println("상품명: " + name);
System.out.println("가격: " + price);
System.out.println("수량: " + count);
System.out.println("결재 금액: " + this.total);
}
}
----------------------------------------------------------------------------------- ▷ oop2.Cash.java-----------------------------------------------------------------------------------package oop2;
public class Cash{
public void cash() {
System.out.println("현금 결재를 합니다.");
}
}
----------------------------------------------------------------------------------- ▷ oop2.Card.java-----------------------------------------------------------------------------------package oop2;
public class Card {
public void card() {
System.out.println("카드 결재를 합니다.");
System.out.println((int)(total * 0.005) + " 포인트 지급 예정(0.5%)");
}
}
-----------------------------------------------------------------------------------
▷ oop2.Mobile.java-----------------------------------------------------------------------------------
package oop2;
public class Mobile {
public void mobile() {
System.out.println("모바일 결재를 합니다.");
}
}
-----------------------------------------------------------------------------------
▷ oop2.Point.java-----------------------------------------------------------------------------------package oop2;
public class Point {
public void point() {
System.out.println("포인트 결재를 합니다.");
}
}
-----------------------------------------------------------------------------------
▷ oop2.PaymentUse.java-----------------------------------------------------------------------------------package oop2;
public class PaymentUse {
public static void main(String[] args) {
.....
}
}
-----------------------------------------------------------------------------------
4. 상속 UML 제작하기: class diagram
- 파일명: /ws_java/oop/src/oop2/PaymentUse.cld
5. 생성자와 상속의 관계
- 자식 클래스 객체 생성시 부모 클래스가 먼저 객체가 생성되고 생성자가 호출된다.
[출력 화면]1) ASIA created.
2) KOREA created.
3) Seoul created.
4) 종로 생성됨.
5) 1가 생성됨.
▷ oop2.InheTest2.java
-----------------------------------------------------------------------------------package oop2;
class ASIA{
public ASIA(){
super();
System.out.println("1) ASIA created.");
}
}
class KOREA extends ASIA{
public KOREA(){
super();
System.out.println("2) KOREA created.");
}
}
class Seoul extends KOREA{
public Seoul(){
super();
System.out.println("3) Seoul created.");
}
}
class Jongro extends Seoul {
public Jongro(){
super();
System.out.println("4) 종로 생성됨.");
}
}
class Street1 extends Jongro {
public Street1() {
// super(); // 생략 가능
System.out.println("5) 1가 생성됨.");
}
}
public class InheTest2 {
public static void main(String[] args) {
Street1 street1 = new Street1();
}
}
-----------------------------------------------------------------------------------
6. 부모 메소드의 상속을 무시하고 메소드 재정의(Method Overriding)
- 부모 클래스로부터 상속되는 메소드를 상속받지 않고 새로운 기능으로
재정의하는 경우.
- @Override: 상속을 무시한다는 선언문, 에노테이션(Annotation), 생략 가능
- 하나의 JAVA 파일에 2개 이상의 Class를 선언가능하나 권장하지 않으며,
main() 메소드가 있는 클래스가 파일명이 된다.
[출력 화면]JAVA 책을 주문합니다.
인문 고전 책을 주문합니다.
▷ oop2.InheTest3.java-----------------------------------------------------------------------------------package oop2;
class BookStore {
public void print(){
System.out.println("인문 고전 책을 주문합니다.");
}
}
class Java extends BookStore {
// 상속 무시되고 호출됨.
@Override
public void print(){
System.out.println("JAVA 책을 주문합니다.");
}
}
public class InheTest3 {
public static void main(String[] args) {
Java java = new Java();
java.print();
BookStore book = new BookStore();
book.print();
}
}
-----------------------------------------------------------------------------------
7. 상속을 선언하지 않아도 모든 클래스는 Object class를 자동으로 상속받습니다.
- 최고 부모 타입으로 모든 클래스의 객체를 할당 받을 수 있습니다.
예) Object obj = new Date();
Object obj2 = "JAVA";
▷ oop2.InheTest4.java-----------------------------------------------------------------------------------package oop2;
class Book2 { // Object class 자동 상속
// class Book2 extends Object { // 선언하지 않아도 상속됨으로 권장 아님
// class Book2 extends Object, FIR { // 하나의 class 만 상속 가능
// class Book2 extends FIR {
}
public class InheTest4 {
public static void main(String[] args) {
Book2 book = new Book2();
System.out.println(book.hashCode());
}
}
-----------------------------------------------------------------------------------
[참고] 개발자(사용자) 정의 Exception
- Exception은 자바 API 상에 체계적으로 정의가 되어 있으나 특정 업무에 해당하는
Exception은 정의되지 않았음으로 개발자가 개발시에 정의해서 사용해야합니다.
- Exception class를 상속받아 구현, 상속 수업이 진행되지 않았음으로 기능을 실행만 할 것.▷ PeriodException.java
-----------------------------------------------------------------------------------package oop2;
public class PeriodException extends Exception {
public PeriodException() {
System.out.println("입력 가능한 연도는 2017 ~ 2023년입니다.");
}
public PeriodException(int year) {
System.out.println("입력 가능한 연도는 2017 ~ 2023년입니다.");
System.out.println("입력된 연도: " + year + " 년");
}
}
-----------------------------------------------------------------------------------
▷ ZeroException.java
-----------------------------------------------------------------------------------package oop2;
public class ZeroException extends Exception {
public ZeroException() {
System.out.println("0은 입력 할 수 없습니다.");
}
}
-----------------------------------------------------------------------------------
▷ ExceptionUse.java
-----------------------------------------------------------------------------------package oop2;
public class ExceptionUse {
// MaxException만 전달 가능
// public void use(int year) throws MaxException {
// 모든 Exception 전달 가능
public void use(int year) throws Exception {
if (year < 2017 || year > 2023) {
// year >= 2017 && year <= 2023가 아닐 경우 Exception을 생성
throw new PeriodException(); // 기간을 벗어났음으로 예외 발생
} else if ( year == 0) {
throw new ZeroException(); // 특정 조건에 맞는 Exception을 생성
}
}
public void use2(int year) throws PeriodException {
if (year < 2017 || year > 2023) {
throw new PeriodException(year); // 초기값 전달
}
}
}
-----------------------------------------------------------------------------------
▷ UserException1.java
[실행 화면]C:\ai3\ws_java\oop\bin>java oop2.UserException1
Exception 발생됨.
Main 실행됨.
C:\ai3\ws_java\oop\bin>java oop2.UserException1 0
0은 입력 할 수 없습니다.
ZeroException 발생됨.
Main 실행됨.
C:\ai3\ws_java\oop\bin>java oop2.UserException1 2015
입력 가능한 연도는 2017 ~ 2023년입니다.
PeriodException 발생됨.
Main 실행됨.
C:\ai3\ws_java\oop\bin>java oop2.UserException1 2025
입력 가능한 연도는 2017 ~ 2023년입니다.
PeriodException 발생됨.
Main 실행됨.
C:\ai3\ws_java\oop\bin>java oop2.UserException1 2019
Main 실행됨.
-----------------------------------------------------------------------------------package oop2;
public class UserException1 {
public static void main(String[] args) {
try {
ExceptionUse max = new ExceptionUse();
int year = Integer.parseInt(args[0]);
max.use(year);
} catch (PeriodException e) {
System.out.println("PeriodException 발생됨.");
} catch (ZeroException e) {
System.out.println("ZeroException 발생됨.");
} catch (Exception e) {
System.out.println("Exception 발생됨.");
}
System.out.println("Main 실행됨.");
}
}
-----------------------------------------------------------------------------------
▷ UserException2.java
[실행 화면]C:\ai3\ws_java\oop\bin>java oop2.UserException2
Exception 발생됨.
Main 실행됨.
C:\ai3\ws_java\oop\bin>java oop2.UserException2 0
입력 가능한 연도는 2017 ~ 2023년입니다.
입력된 연도: 0 년
PeriodException 발생됨.
Main 실행됨.
C:\ai3\ws_java\oop\bin>java oop2.UserException2 2015
입력 가능한 연도는 2017 ~ 2023년입니다.
입력된 연도: 2015 년
PeriodException 발생됨.
Main 실행됨.
C:\ai3\ws_java\oop\bin>java oop2.UserException2 2019
Main 실행됨.
-----------------------------------------------------------------------------------package oop2;
public class UserException2 {
public static void main(String[] args) {
try {
ExceptionUse max = new ExceptionUse();
int year = Integer.parseInt(args[0]);
max.use2(year);
} catch (PeriodException e) {
System.out.println("PeriodException 발생됨.");
} catch (Exception e) {
System.out.println("Exception 발생됨.");
}
System.out.println("Main 실행됨.");
}
}
-----------------------------------------------------------------------------------
* 객체지향 분석 설계 분야에서 상속은 콤포넌트의 분리를 방해함으로
사용을 권장하지 않습니다. 부모 자식간에 강한 결합이 발생하여 어떤 쪽에서
변화가 발생하면 다른쪽도 심하게 영향을 받음(나비 효과).