코딩은 실력보다 시력이지

빅데이터교육과정/JAVA

DAY 10,11. Generic과 계산기 정리

Listeria 2021. 2. 18. 02:46

Generic 기존에 사용되던 변수형 외에 임의로 변수형을 지정하여 사용하며. type을 상속하거나 인터페이스를 이용하여 변수형으로 사용될 수 있는 것들을 제한할 수 있다.

 

package practice;

class DBox<L,R>{
	private L left;
	private R right;
	public void set(L o, R r) {
		left = o;
		right = r;
	}
	public String toString() {	return left+"-"+right;}
}

class DDBox<DB1,DB2>{
	private DB1 box1;
	private DB2 box2;

	public void set(DB1 a, DB2 b) {
		box1 = a;
		box2 = b;
	}
	public String toString() {
		return box1+"&"+box2;
	}
}

public class GeEx2 {

	public static void main(String[] args) {
		DBox<String, Integer> box1 = new DBox<>();
		box1.set("Apple", 25);
		DBox<String, Integer> box2 = new DBox<>();
		box2.set("Orange", 33);
		
		DDBox<DBox<String,Integer>,DBox<String,Integer>> ddbox = new DDBox<>();
		ddbox.set(box1,box2);
		System.out.println(ddbox);

	}

}

 

package practice;

class Box<T extends Number> {
	private T ob;
	public void set(T o) {
		ob = o;
	}
	public T get() {
		return ob;
	}
}

public class GeEx3 {

	public static void swapBox(Box<Integer> a, Box<Integer> b){
		int b1 = a.get();
		int b2 = b.get();

		a.set(b2);
		b.set(b1);
	}

	public static void main(String[] args) {
		Box<Integer> box1 = new Box<>();
		box1.set(99);
		Box<Integer> box2 = new Box<>();
		box2.set(22);

		System.out.println(box1.get()+"&"+box2.get());
		swapBox(box1,box2);
		System.out.println(box1.get()+"&"+box2.get());

	}

}

import java.awt.*;
import java.awt.event.*;

public class calc2 extends Frame implements TextListener, ActionListener {
	TextField num1 = new TextField(10);
	Label op = new Label("");
	TextField num2 = new TextField(10);
	TextArea ta = new TextArea(999, 999);
	Button exit = new Button("종료");
	Button num[] = { new Button("1"), new Button("2"), new Button("3"), new Button("4"), new Button("5"),
			new Button("6"), new Button("7"), new Button("8"), new Button("9"), new Button("."), new Button("0"),
			new Button("=") };

	Button oper[] = { new Button("+"), new Button("x"), new Button("AC"), new Button("-"), new Button("/"),
			new Button("CE"), new Button("x^2"), new Button("1/x"), new Button("C"), new Button("%"),
			new Button("BS") };
	// 사용될 변수들과 계산기에 들어갈 버튼 생성

	String opsave, n1save, n2save; // 앞의 숫자 뒤의 숫자가 연산되기 전에 저장되는 변수
	String cnt = ""; // 입력되는 값들이 저장됨
	boolean mark = false; // 계산 과정에서 연산자의 입력 여부를 확인.

	public calc2() {
		super("calc2");

		setLayout(new BorderLayout());
		num[11].setEnabled(false);

		Panel p = new Panel();
		Panel key = new Panel();
		Panel keypad = new Panel();
		Panel n = new Panel();
		Panel o = new Panel();
		n.setLayout(new GridLayout(4, 3));
		o.setLayout(new GridLayout(4, 3));
		key.setLayout(new GridLayout(1, 2));
		keypad.setLayout(new GridLayout(1, 2));
		// 계산기의 모양을 Grid를 이용하여 만들었다. n은 숫자판을 o는 연산자 판이다.
		p.add(new Label("연산:"));
		p.add(num1);
		p.add(op);
		p.add(num2);

		for (int i = 0; i < 12; i++) {
			n.add(num[i]);
			num[i].addActionListener(this);
		}
		// 위에서 생성한 버튼을 n이라는 panel에 추가.
		for (int i = 0; i < 11; i++) {
			o.add(oper[i]);
			oper[i].addActionListener(this);
		}
		// 위에서 생성한 연산자 버튼들을 o라는 함수에 추가.

		key.add(n);
		key.add(o);

		keypad.add(key);
		keypad.add(ta);

		add(p, BorderLayout.NORTH);
		add(keypad, BorderLayout.CENTER);
		add(exit, BorderLayout.SOUTH);
		// 위에서 생성한 각 panel을 위치에 맞게 배열
		setBounds(500, 300, 800, 600);
		setVisible(true);

		num1.addTextListener(this);
		num2.addTextListener(this);
		exit.addActionListener(this);
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		// 버튼 혹은 키보드 입력에 반응할 수 있도록 add를 활용하여 활성화.
	}

	public static void main(String args[]) {
		new calc2();
	}

	public void actionPerformed(ActionEvent e) {
		String str = e.getActionCommand();

		if (str.equals("x") || str.equals("+") || str.equals("-") || str.equals("/") || str.equals("%")) {
			if (cnt != "") {
				cnt = "";
				op.setText(str);
				mark = true;
				num2.requestFocus();
			} else {
				num1.requestFocus();
			}
		} else if (str.equals("C")) { // C가 입력되면 모든 입력값 초기화
			num1.setText("");
			op.setText("");
			num2.setText("");
			num1.requestFocus();
			cnt = "";
			mark = false;
		} else if (str.equals("CE")) { // CE가 입력되면 num에 입력된 값을 삭제.
			if (mark == false) {
				num1.setText("");
			} else if (mark == true) {
				num2.setText("");
			}
			cnt = "";
		} else if (str.equals("AC")) { // AC가 입력되면 전체 초기화
			num1.setText("");
			num2.setText("");
			op.setText("");
			num1.requestFocus();
			cnt = "";
			mark = false;
		} else if (str.equals("x^2")) { // 연산 과정에는 모두 double로 형변환하여 소숫점 계산을 용이하게 하였다.
			ta.append(String.valueOf((Double.parseDouble(cnt)) * (Double.parseDouble(cnt))) + "\n");
			num1.setText("");
			cnt = "";
			mark = false;
		} else if (str.equals("1/x")) {
			ta.append(String.valueOf(1 / (Double.parseDouble(cnt))) + "\n");
			num1.setText("");
			cnt = "";
			mark = false;
		} else if (str.equals("=")) { // 입력을 누르면 기존에 저장한 값들과 연산자로 계산한 값을 출력하고 모두 초기화한다.
			ta.append(num1.getText());
			ta.append(op.getText());
			ta.append(num2.getText() + "=");

			num1.requestFocus();

			///////////////// 연산 과정에는 모두 double로 형변환하여 소숫점 계산을 용이하게 하였다.

			if (op.getText().equals("x")) {
				ta.append(
						String.valueOf(Double.parseDouble(num1.getText()) * Double.parseDouble(num2.getText())) + "\n");
			} else if (op.getText().equals("+")) {
				ta.append(
						String.valueOf(Double.parseDouble(num1.getText()) + Double.parseDouble(num2.getText())) + "\n");
			} else if (op.getText().equals("-")) {
				ta.append(
						String.valueOf(Double.parseDouble(num1.getText()) - Double.parseDouble(num2.getText())) + "\n");
			} else if (op.getText().equals("/")) {
				ta.append(
						String.valueOf(Double.parseDouble(num1.getText()) / Double.parseDouble(num2.getText())) + "\n");
			} else if (op.getText().equals("%")) {
				ta.append(
						String.valueOf(Double.parseDouble(num1.getText()) % Double.parseDouble(num2.getText())) + "\n");
			} else {
				ta.append("\nWrong input, must input operator\n");
			}
			num1.setText("");
			op.setText("");
			num2.setText("");
			cnt = "";
			mark = false;
		} else if (str.equals("BS")) {

		} else {
			cnt += str;
			if (mark == false) {
				num1.setText(cnt);
			} else if (mark == true) {
				num2.setText(cnt);
			}
		}

		if (str.equals("종료"))
			System.exit(0);
	}

	public void textValueChanged(TextEvent e) {
		if (num1.getText().equals("") || num2.getText().equals("") || op.getText().equals(""))
			num[11].setEnabled(false);
		else
			num[11].setEnabled(true);
	}
}

 

계산기 코드를 정리했을 뿐만 아니라 anonymous adapter를 이용하여 windowlistener를 따로 만들지 않고 바로 생성되도록 하였다.

 


package GenericEx;
import java.util.Scanner;


public class AbsQuiz {

	public static void main(String[] args) {

		int select;

		@SuppressWarnings("resource")
		Scanner sc = new Scanner(System.in);
		
		MyQueue myQ = new MyQueue();
		MyStack myS = new MyStack();
		
		Memory mem = null;
		
		do {    
		System.out.println("1. Stack\t2.Queue\t3.End");
		select = sc.nextInt();
		
		if(select == 1) 	{	mem = myS;	}
		else if(select ==2) {	mem = myQ;	}
		else break;

			do {
				System.out.println("1.Push\t2.Pop\t3.stop");
				select = sc.nextInt();
				if(select == 1) {
					System.out.println("1. num, 2. str, 3. end");
					select = sc.nextInt();
					if(select == 1) {
						System.out.println("숫자를 입력하세요.");						
						mem.push(sc.nextInt());
					}
					else if(select == 2) {
						System.out.println("문자를 입력하세요.");						
						mem.push(sc.next());
					}
					else {break;}
				}
				
				else if(select == 2) {	System.out.println(mem.pop());	}
				else {break;}
			}while(true);

		}while(true);

	}
}

package GenericEx;

public abstract class Memory<T> {

	protected Object[] num ;
	protected int end;
	
	public Memory() {
		num = new Object[5];
		end =  0;
	}
	
	public void push(T i) {
		num[end++] = i;									
	}
	public abstract Object pop();
	
}
package GenericEx;

public class MyQueue extends Memory {
	
	private int front;

	@Override
	public Object pop() {		
		return num[front++];	
	}
}
package GenericEx;

public class MyStack extends Memory {
	
	@Override
	public Object pop() {
		
		return num[--end];
	}
}

 

제네릭을 이용하여 앞서 만들었던 Stack queue를 재구성 하였다.