2013년 9월 16일 월요일

자바에서 직접 구현한 스택, 스윙(Stack, Swing스택)을 이용한 GUI 계산기 소스 , 중위표기 -< 후위표기

자바에서 직접 구현한 스택, 스윙(Stack, Swing스택)을 이용한 GUI 계산기 소스 , 중위표기 -< 후위표기

JAVA에서 직접 구현한 스택, 스윙(Stack, Swing)을 이용한 GUI 계산기 소스
1. ArrayStack.java
import java.util.*;
interface Stack {  
            public boolean isEmpty();
            public Object peek();
            public void push(Object theObject);
            public Object pop();
}

 public class ArrayStack implements Stack   {           
             int top;         // current top of stack
             Object [] stack;   // element array
              
             public ArrayStack(int initialCapacity) {
                  if (initialCapacity < 1)
                  throw new IllegalArgumentException
                                        ("initialCapacity must be >= 1");
                  stack = new Object [initialCapacity] ;
                  top = -1;
             }
     
       public ArrayStack() {
      this(10);
       }
      
       public boolean isEmpty( ) {
          return top == -1;
       }      
       
        public Object peek() {
               if (isEmpty() )
                     throw new EmptyStackException();
               return stack[top];
        }    

       
  public void push(Object theElement) {
    // increase array size if necessary   
    if (top == stack.length - 1) ensureCapacity();
        
            // put theElement at the top of the stack 
            stack[++top] = theElement;
      }

 
     public Object pop() {
            if  (isEmpty())
                  throw new EmptyStackException();
            Object topElement = stack[top];
             stack[top--] = null;   // enable garbage collection
             return topElement;
      }   
   private void ensureCapacity()  {
      Object[] larger = new Object[stack.length*2];
      for (int index=0; index < stack.length; index++)
         larger[index] = stack[index];
      stack = larger;
   }
   public String toString() {
    if (isEmpty())
      return "<empty stack>";
    String result = "<stack :";
    for (int i = top; i >= 0; i--)
      result += stack[i] + " ";
    return result + ">";
  } // end toString
}
 

2. MessageBox.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MessageBox extends JDialog implements ActionListener {
 public MessageBox(Frame parent, String title, String message) {
  super(parent, title, true);
  //대화상자를 내부에 위치시킴
  Dimension parentSize = parent.getSize();
  Point p = parent.getLocation();
  setLocation(p.x+parentSize.width/4, p.y+parentSize.height/4);
  //메시지 패널을 생성
  JPanel panel = new JPanel();
  panel.add(new JLabel(message));
  getContentPane().add(panel);
  //버튼패널을 생성한다.
  JPanel bpanel = new JPanel();
  JButton button = new JButton("OK");
  bpanel.add(button);
  button.addActionListener(this);
  getContentPane().add(bpanel, BorderLayout.SOUTH);
  setDefaultCloseOperation(DISPOSE_ON_CLOSE);
  pack();
  setVisible(true); 
 }
 public void actionPerformed(ActionEvent e) {
  setVisible(false);
  dispose();
 }
}
 
3. Calculation.java

import java.util.*;
class Calculation { 
   //-------------------------------------------------------------------
   //스택을 이용하여 중위표현을 후위표현으로 바꾸는 메소드
   //-------------------------------------------------------------------
  String  postfix(String infixExp) {
   Double value;
   //숫자의 끝임을 알려주는 flag
   //소수점 수식도 처리하기 위해서...
      boolean endOfNumber = false;  
    String postfixExp = new String();
   ArrayStack stk = new ArrayStack();
  for(int i = 0; i < infixExp.length(); i++)
  {
    switch(infixExp.charAt(i))
    {
   //피연산자는 그대로 출력한다.
   case '0':
   case '1':
   case '2':
   case '3':
   case '4':
   case '5':
   case '6':
   case '7':
   case '8':
   case '9':
   case '.':
     postfixExp = postfixExp.concat(infixExp.charAt(i)+"");
     endOfNumber = true;
     break;
   //왼쪽괄호인 경우에는 스택에 push 한다.
   case '(':
     if(endOfNumber == true)   {
    postfixExp = postfixExp.concat(" ");
    endOfNumber = false;
     }
     stk.push(new Character('('));
     break;
   //우측괄호인 경우 좌괄호가 나올때까지 pop하여 출력하고
      //좌괄호는 pop하여 버린다.
   case ')':
     if(endOfNumber == true)   {
    postfixExp = postfixExp.concat(" ");
    endOfNumber = false;
     }    
     while(((Character)stk.peek()).charValue() != '(' )
    postfixExp = postfixExp.concat(((Character)stk.pop()).toString());
     Object openParen = stk.pop(); 
     break;
   case '+':
   case '-':
   case '*':
   case '/':
     if(endOfNumber == true)  {
    postfixExp = postfixExp.concat(" ");
    endOfNumber = false;
     }
     //연산자를 만나면 스택에서 그 연산자보다 낮은 우선순위의 연산자를 만날 때까지
              //팝하여 출력한 뒤에 자신을 푸시한다.(우선순위가 같거나 높은것은 팝한다.)
     while ( !stk.isEmpty() && ((Character)stk.peek()).charValue() != '('
               &&  getPrec(infixExp.charAt(i)) <= getPrec(((Character)stk.peek()).charValue()) )  { 
    postfixExp = postfixExp.concat(((Character)stk.pop()).toString());
     }
     stk.push(new Character(infixExp.charAt(i)));
     break;
    }
  }
  if(endOfNumber == true) {
    postfixExp = postfixExp.concat(" ");
    endOfNumber = false;
  }
  //모든 작업이 끝나면 스택에 있는 연산자들을 모두 팝하여 출력한다.
  while( !stk.isEmpty()) {
    postfixExp = postfixExp.concat(((Character)stk.pop()).toString());
  }
  return postfixExp;
  }
  //----------------------------------------------------------------------
  //후위표기 수식을 스택을 이용한 연산을 수행하는 메소드
  //----------------------------------------------------------------------
  Double result(String postfixExp) {
    Double value, buffer;
 String temp = new String();
 ArrayStack stk = new ArrayStack();
    for(int i=0; i<postfixExp.length(); i++)    {
        switch(postfixExp.charAt(i))    {
            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':  
            case '.':
    //여기까지는 아직 공백을 만나지 않았으므로 수식의 끝이 아니다.
                temp = temp.concat(postfixExp.charAt(i)+"");
                break;  
            case ' ':
    //공백을 만나서야 비로서 수식을 스택에 넣는다.
               //공백을 만나기전에 수식이 여러개 있었다면 temp에 붙어서 저장되어 있다.
                stk.push(new Double(temp));
                temp = new String();
                break;
            case '+':
                value = new Double(((Double)stk.pop()).doubleValue() + ((Double)stk.pop()).doubleValue());
                stk.push(value);
                break;
            case '-':
                buffer = new Double(((Double)stk.pop()).doubleValue());
                value = new Double(((Double)stk.pop()).doubleValue() - buffer.doubleValue());
                stk.push(value);
                break;
            case '*':
                value = new Double(((Double)stk.pop()).doubleValue() * ((Double)stk.pop()).doubleValue());
                stk.push(value);
                break;
            case '/':
                buffer = new Double(((Double)stk.pop()).doubleValue());
                value = new Double(((Double)stk.pop()).doubleValue() / buffer.doubleValue());
                stk.push(value);
                break;
        }
    }
 return (Double)stk.peek();
  }
  //------------------------------------------
  //연산자의 우선순위를 Return
  //------------------------------------------
  int getPrec(char op) {
    int prec = 0;
    switch (op)   {
      case '+':
      case '-':
        prec = 1;
        break;
      case '*':
      case '/':
        prec = 2;
        break;
    }
    return prec;
  }
    //-----------------------------------------
    //괄호의 정확성 검사
 //-----------------------------------------
    static boolean bracketsBalance (String exp) {
  ArrayStack stk = new ArrayStack(exp.length() +1);
  for (int i = 0; i < exp.length(); i++) {
    //Scan across the __EXPRESSION__
    char ch = exp.charAt(i);
    if (  ch== '[' || ch == '('  )  {
    stk.push( new Character(ch));
    }        
    else if(ch == ']' || ch == ')')  { 
    //empty means brackets unmatched
    if (stk.isEmpty())   return false;
    char charFromStack = ((Character)stk.pop()).charValue();
    if (  ch == ']' && charFromStack != '['
      ||  (ch == ')' && charFromStack != '(')  )
      return false;
   } // end if
  } // end for loop
  return stk.isEmpty();  //empty means matched,  else unmatched
 }
}

4. Calc.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
//------------------------------------------------------------------
//
//
//     Main Class
//     - main method
//
//------------------------------------------------------------------
class Calc extends JFrame {
    public static void main(String[] args) {
        JFrame myCalc = new CalcWindow(); // Call the constructor
  //System exit로 종료, 오직 Application에서만 사용가능
        myCalc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myCalc.setVisible(true);
    }
}
 
 

//--------------------------------------------------------------------------------
//  Class Name : CalcWindow
//  Desc :  계산기의 GUI를 구성합니다.
//  Method :
//   Constructot : 생성자에서 GUI 부분을 완성한다.
//   void action_display(ActionEvent e) : 버튼등 만들어진 객체의 실제 이벤트 처리를 합니다.
//
//   아래는 생성자 부분의 리스너를 만드는 부분입니다.
//           ActionListener calcListener = new ActionListener() {
//                 public void actionPerformed(ActionEvent e) {
//                   action_display(e);  // process the
//                 }
//             };
//
//             이부분에서 action_display 메소드를 call 합니다. 즉 버튼등 이벤트
//             처리할것을 만들면 리스너를    addActionListener 명령으로
//             리스너를 Add해야 이벤트 처리가 가능합니다.
//
//
//----------------------------------------------------------------------------------
class CalcWindow extends JFrame {
    JTextField displayField;              // 수식을 입력, 결과 display창
    double     resultValue    = 0.0;    //  스택에 의한 계산 결과값을 받는변수 
 String     postfix;                        // 후위로 바꾸어 이를 보고나하는 변수
    static Font biggerFont = new Font("monspaced", Font.PLAIN, 24);
    public CalcWindow() {
        //--- 상단의 TextField  
        displayField = new JTextField(" ", 12); 
        displayField.setHorizontalAlignment(JTextField.TRAILING);
        displayField.setFont(biggerFont);
        //--- Clear button
        JButton clearButton = new JButton("CLEAR");
        clearButton.setFont(biggerFont);
  //--- 리스너들, 여기서는 clear용및 상단의 displayField 에
  //--- 값을 추가시키는 두가지의 리스너 종류가 존재한다.
  //--- Clear Button 이벤트 처리용 리스너
        clearButton.addActionListener(new ActionListener() {
                  public void actionPerformed(ActionEvent e) {
                      action_clear();
                  }
               });
        //--- 버튼을 누르면 상단의 JTextField에 출력하기 위한 리스너
        ActionListener calcListener = new ActionListener() {
                 public void actionPerformed(ActionEvent e) {
                     action_display(e);  // process the
                 }
             };
        // 계산기 숫자키 및 괄호 키 Button Create
        String buttonOrder = "1234567890().";
        JPanel buttonPanel = new JPanel(new GridLayout(5, 3));
        for (int i = 0; i < buttonOrder.length(); i++) {
            JButton b = new JButton(buttonOrder.substring(i, i+1));
            b.addActionListener(calcListener);
            b.setFont(biggerFont);
            buttonPanel.add(b);
        }

        //--- Create panel, listener, and buttons for all the operations
        JPanel opPanel = new JPanel(new GridLayout(5, 1));
       
        String opOrder = "+-*/=";
        for (int i = 0; i < opOrder.length(); i++) {
            JButton b = new JButton(opOrder.substring(i, i+1));
            b.addActionListener(calcListener);
            b.setFont(biggerFont);
            opPanel.add(b);
        }
        //--- Layout the top-level content panel
        Container content = this.getContentPane();
        content.setLayout(new BorderLayout(4, 4));   //4,4는 hgap, vgap
        content.add(displayField, BorderLayout.NORTH );
        content.add(buttonPanel , BorderLayout.CENTER);
        content.add(opPanel     , BorderLayout.EAST  );
        content.add(clearButton , BorderLayout.SOUTH );
        this.setTitle("Calc");
        this.pack();
    }//end constructor

  
    // Called by the action listener for numeric keys
    void action_display(ActionEvent e) {
        String string = e.getActionCommand(); //눌러진 키 값
        /////////////////////////////////////////////////////등호가 넘어오는 경우엔  스택을 이용하자...
  if (string.equals("="))  {
   Calculation c = new Calculation();
   boolean isOK = c.bracketsBalance(displayField.getText());  //괄호검사
   if (isOK) {
    postfix = c.postfix(displayField.getText());                        //후위표기로 바꿈
    resultValue = c.result(postfix).doubleValue();                   //계산후 결과받음
    displayField.setText("" + resultValue);                              //화면에 뿌려줌
   }
   else {
    MessageBox m = new MessageBox(this, "오류!", "괄호가 잘못 되었습니다...");
    action_clear();
   }
        }
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  else {
            // 등호가 아니라면 텍스트필드에 추가
            displayField.setText(displayField.getText() + string);
        }
    }

    //clear 버튼 처리시 호출되는 메소드
    void action_clear() {
        displayField.setText(" ");
        resultValue = 0;
    }
}
 



오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터
(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)  

[개강확정 강좌]

Spring3.X, MyBatis, Hibernate실무과정

강좌명
Spring3.X, MyBatis, Hibernate실무과정(평일야간)
교재
자체교재 or PDF 파일 제공
강좌 일정
09월26일(목) ~ 10월15일(화)((평일야간) 19:00~22:00, 12일) 총 36시간
강의 장소
[C강의장]구로디지털단지역2번 출구-> 미니스톱끼고 우회전 -> 100m 직진 후 골목길 끝에서 이마트방향 우회전 -> 50m 직진 후 우체국 옆골목으로 길건너서 직진 -> 150미터 직진 후 JnK 타워에서 우회전 -> 50미터 직진 후 우측에 코오롱빌란트2차 803호 (구로구 구로3동 222-8 코오롱디지털타워 빌란트2차 803호)
수강절차
- 강좌내용 확인
- 전화 또는 홈페이지(www.onjprogramming.co.kr)를 통한 수강지원 및 수강료 결제(무통장입금, 온라인 카드결제)
- 고용보험 가입자(재직자)인 경우 고용보험환급 관련 서류 제출
- 수강전 : 커리큘럼 및 장소에 대해 다시 한번 공지
- 교육 전 설문 작성(간단한 개발 경력, 수강 목적, 강좌진행방식 등)
- 강좌 수강
- 수강후 : 교육 후 설문 작성
수강료
590,000원
[고용주환급]대기업:14만원 전후, 중소기업:187,047 원환급

[개인수강지원(개인환급)]정규직 472,000 ,비정규직:전액환급
대기업(상시근로자 300인 이상 대기업)은 개인환급 불가합니다.

재직자 내일배움카드 : 정부지원금 80% 자기부담금 20%
(구 능력개발카드 명칭이 내일배움카드로 변경 / 연간 총한도 200만원)


* 휴강 :법정공휴일
수강료
입금안내
- 온/오프라인 카드결제, 계좌이체(수강안내->입금안내 참조)
문의사항
02-851-4790 번으로 연락 부탁 드립니다.
교육개요
본과정은 자바 웹개발에서 가장 많이 사용되고 있는 자바기반 프레임워크인 Spring3.2를 학습하는데 스프링이 왜 도입되어야 하는지부터, 기본모듈구성, 아키텍처 DI, DL, IoC, 최근 개발모델의 핵심인 Spring AOP, AspectJ Annotation, 표현언어인 SpEL, Spring MVC, Spring MVC TEST Framework, Spring WebFlow, Spring JDBC, Spring Transaction등 개발에 필요한 부분을 체계적으로 실습을 통해 학습하며 SQLMapper인 MyBatis, Hibernate 까지 학습하는 Spring 최고의 교육 입니다.

[특징]
- 실무/실습에 근거한 이론 취득
- 단기간에 스프링 개발자로 양성
- 문답씩 수업으로 수강 효과 극대화
- 이론/실습 과제로 인한 개발력 UP
교육목표
- Spring의 도입배경 및 아키텍처에 대해 이해한다.
(자바빈의 태동부터 EJB, 그리고 현재까지)
- Eclipse, Maven, STS 플러그인에 대한 이해
(개발환경 설정의 이해)
- Spring IoC(DI, DL)의 이해
(실습을 통한 setter,getter,constructor injection의 이해)
- Spring AOP의 이해
(실습을 통한 Spring AOP의 이해, AOP어렵지 않습니다)
- AspectJ Annotation에 대한 이해
(Spring의 AspectJ 지원 및 Annotation 대한 이해 by 실습)
- Spring Web MVC, JDBC의 이해
(실습을 통한 Spring MVC, JDBC의 이해)
- Spring Controller에 대한 이해
(간단한 Controller의 구현을 통한 MVC Font Contrller의 이해)
- Spring Web Flow에 대한 이해
(실습을 통한 Spring Web Flow 및 JSF에 대한 이해)
- SpEL에 대한 이해
(실습을 통한 Spring SpEL의 이해)
- Servlet3 비동기 요청에 대해 이해한다.
(실습을 통한 비동기 서블릿에 대한 이해)
- MyBatis Mapper에 대해 이해한다.
(실습을 통한 MyBatis 구성, 작동원리 이해)
- Hibernate Mapper에 대해 이해한다.
(실습을 통한 Hibernate 구성, 작동원리 이해)
- 실무 개발 환경에 적응력 UP
(Spring, MyBATIS 기반 게시판 작성)
교육대상
- JAVA, JSP 개발자
- 자바개발은 오래 했지만 프레임워크에 대해 자신이 없는 개발자
- 단기간에 스프링을 박살 내고 싶은 개발자.
(스프링 혼자 공부하기는 어렵습니다!!)
선수학습
- JAVA, JSP

Spring3.2
J2EE Framework에 대한 흐름과 Spring Framework에 대한 이해
개발 환경 설정(Eclipse4.3 KEPLER, Tomcat7, Spring3.2 다운로드 및 설치)
Maven, STS 플러그인 설치
Spring IoC
DL(Dependency LookUp) &DI(Dependency Injection)
Dependency Pull, CDL(Contaxtualized Lookup)
Setter/Constructor/Mathod Injection
Spring 설정
Spring AOP 란 ?Code, Advice, JoinPoint, PointCut, Aspect, WeavingProxyFactoryBean
Annotation기반 AOP(AspectJ)
기타 Spring의 선언적 AOP 선언
Spring JDBC
Spring MVC
Spring Controller
Spring Webflow, JSF
Spring 표현언어 SpEL
Servlet3 비동기 요청처리
Spring3.2 Transaction 관리
Spring MVC TEST Framework
MyBatis/hibernate
[MyBatis]
개요 및 소개
개발환경 설정 및 설치
Data Mapper란
sqlMapConfig 이해 및 환경설정
Spring, MyBatis 연동
SQL Map XML File 이해 
SqlMapClient 이해 
SQL의 실행(Insert/update/delete) 이해와 실습
고급 쿼리 사용방법의 이해와 실습 
Spring MyBatis 응용예제 작성

[Hibernate]
Hibernate 소개
SessionFactory 설정
1:1, 1:다 매핑
Session Interface
Hibernate DML
Spring, Hibernate 예제 프로그램 작성




댓글 없음:

댓글 쓰기