yoni

[19][OOP] Amateras UML 툴 설치, 상속(Inheritance), 사용자(개발자) 정의 Exception 본문

java of educational by contents

[19][OOP] Amateras UML 툴 설치, 상속(Inheritance), 사용자(개발자) 정의 Exception

yoni-1117 2018. 12. 2. 16:14

[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 실행됨.");
 
  }
 
}
 
 
 
 
----------------------------------------------------------------------------------- 
 
 
* 객체지향 분석 설계 분야에서 상속은 콤포넌트의 분리를 방해함으로
  사용을 권장하지 않습니다. 부모 자식간에 강한 결합이 발생하여 어떤 쪽에서
  변화가 발생하면 다른쪽도 심하게 영향을 받음(나비 효과).
 


Comments