CalcView - 리팩토링

지환·2023년 10월 11일
0

JAVA

목록 보기
28/39
post-thumbnail

원본 코드

package com.calculator;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class CalcView implements ActionListener{
	JFrame jf = new JFrame();
	JTextField jtf_display = new JTextField("0");
	JPanel jp = new JPanel();
	JButton jbtnOne = new JButton("1");
	JButton jbtnTwo = new JButton("2");
	JButton jbtnPlus = new JButton("+");
	JButton jbtnEqual = new JButton("=");
	JButton jbtnBack = new JButton("<=");
	JButton jbtnC = new JButton("C");
	// 연산자 누르기 전에 입력된 값 담기 
	String v1 = "";
	
	// 연산자 누르고 난 뒤에 입력된 값 담기
	String v2 = "";
	
	// 연산자(=)를 담는다.(%,-,+,*)
	String op = "";
	
	
	public void initDisplay() {
		//이벤트 처리를 담당하는 핸들러 클래스의 인스턴스변수를 준다.
		jtf_display.setHorizontalAlignment(JTextField.RIGHT);
		
		jbtnOne.addActionListener(this);
		jbtnTwo.addActionListener(this);
		jbtnPlus.addActionListener(this);
		jbtnEqual.addActionListener(this);
		jbtnBack.addActionListener(this);
		jbtnC.addActionListener(this);
		jp.add(jbtnOne);
		jp.add(jbtnTwo);
		jp.add(jbtnPlus);
		jp.add(jbtnEqual);
		jp.add(jbtnBack);
		jp.add(jbtnC);
		jf.add("North",jtf_display);
		jf.add("Center",jp);
		jf.setSize(400, 400);
		jf.setVisible(true);
	}
	

	public static void main(String[] args) {
		CalcView cv = new CalcView();
		cv.initDisplay();
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		String command = e.getActionCommand();
		if("1".equals(command)) {//너 숫자 1 버튼 누른거야?
			if("0".equals(jtf_display.getText()))
			{
				jtf_display.setText("");
			}
			jtf_display.setText(jtf_display.getText()+"1");
			
		}
		else if("2".equals(command)) {//너 숫자 2 버튼 누른거야?
			jtf_display.setText(jtf_display.getText()+"2");			
			if("0".equals(jtf_display.getText()))
			{
				jtf_display.setText("");
			}
		}
		else if("+".equals(command)) {//너 + 버튼 누른거야?
			System.out.println("더하기 버튼");
			v1 = jtf_display.getText();
			op = "+";
			jtf_display.setText("");
		}
		else if("=".equals(command)) {//너 = 버튼 누른거야?
			System.out.println("계산 결과는 얼마");			
			v2 = jtf_display.getText();
			double d1 = Double.parseDouble(v1);
			double d2 = Double.parseDouble(v2);
			String rs = String.valueOf(d1+d2);
			jtf_display.setText(rs);
			
		}		
		else if("<=".equals(command)) {//너 = 버튼 누른거야?
			System.out.println("한글자씩 지우기 구현");		
		}		
		
		else if("C".equals(command))
		{
			jtf_display.setText("");
		}
		
	}

}

필자는 해당 코드를 리팩토링 할 예정이다. 전체적으로 CalcUI, CalcEvent 두가지로 구성했으며, UI에는 실질적인 initDisplay을 구현하며, CalcEvent는 사용자로부터 입력받은 값을 이벤트 하는 클래스로 구성했다.

간단한 예제라 설명은 생략하겠다.

리팩토링

CalcEvent

package com.calculator;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class CalcEvent implements ActionListener{

	// 연산자 누르기 전에 입력된 값 담기 
	String v1 = "";
	
	// 연산자 누르고 난 뒤에 입력된 값 담기
	String v2 = "";
	
	// 연산자(=)를 담는다.(%,-,+,*)
	String op = "";
	
	CalcUI calcUI = null;
	
	public CalcEvent(CalcUI calcUI) {
		this.calcUI = calcUI;
	}


	@Override
	public void actionPerformed(ActionEvent e) {
		String command = e.getActionCommand();
		if("1".equals(command)) {//너 숫자 1 버튼 누른거야?
			if("0".equals(calcUI.jtf_display.getText()))
			{
				calcUI.jtf_display.setText("");
			}
			calcUI.jtf_display.setText(calcUI.jtf_display.getText()+"1");
			
		}
		else if("2".equals(command)) {//너 숫자 2 버튼 누른거야?
			calcUI.jtf_display.setText(calcUI.jtf_display.getText()+"2");			
			if("0".equals(calcUI.jtf_display.getText()))
			{
				calcUI.jtf_display.setText("");
			}
		}
		else if("+".equals(command)) {//너 + 버튼 누른거야?
			System.out.println("더하기 버튼");
			v1 = calcUI.jtf_display.getText();
			op = "+";
			calcUI.jtf_display.setText("");
		}
		else if("=".equals(command)) {//너 = 버튼 누른거야?
			System.out.println("계산 결과는 얼마");			
			v2 = calcUI.jtf_display.getText();
			double d1 = Double.parseDouble(v1);
			double d2 = Double.parseDouble(v2);
			String rs = String.valueOf(d1+d2);
			calcUI.jtf_display.setText(rs);
			
		}		
		else if("<=".equals(command)) {//너 = 버튼 누른거야?
			System.out.println("한글자씩 지우기 구현");		
		}		
		
		else if("C".equals(command))
		{
			calcUI.jtf_display.setText("");
		}
		
	}
}

CalcUI

package com.calculator;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class CalcUI {

	JFrame jf = new JFrame();
	JTextField jtf_display = new JTextField("0");
	JPanel jp = new JPanel();
	JButton jbtnOne = new JButton("1");
	JButton jbtnTwo = new JButton("2");
	JButton jbtnPlus = new JButton("+");
	JButton jbtnEqual = new JButton("=");
	JButton jbtnBack = new JButton("<=");
	JButton jbtnC = new JButton("C");
	
	CalcEvent ce = new CalcEvent(this);

	
	
	public void initDisplay() {
		//이벤트 처리를 담당하는 핸들러 클래스의 인스턴스변수를 준다.
		jtf_display.setHorizontalAlignment(JTextField.RIGHT);
		
		jbtnOne.addActionListener(ce);
		jbtnTwo.addActionListener(ce);
		jbtnPlus.addActionListener(ce);
		jbtnEqual.addActionListener(ce);
		jbtnBack.addActionListener(ce);
		jbtnC.addActionListener(ce);
		jp.add(jbtnOne);
		jp.add(jbtnTwo);
		jp.add(jbtnPlus);
		jp.add(jbtnEqual);
		jp.add(jbtnBack);
		jp.add(jbtnC);
		jf.add("North",jtf_display);
		jf.add("Center",jp);
		jf.setSize(400, 400);
		jf.setVisible(true);
	}
	
	public static void main(String[] args) {
		CalcUI cu = new CalcUI();
		cu.initDisplay();
	}
}
profile
아는만큼보인다.

0개의 댓글