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를 재구성 하였다.
'빅데이터교육과정 > JAVA' 카테고리의 다른 글
DAY13. 네트워크 통신(TCP, 유니캐스트) (0) | 2021.02.23 |
---|---|
DAY 12. 예외처리와 스레드 (0) | 2021.02.23 |
DAY 9. Inner Class 와 AWT 그리고 계산기 (0) | 2021.02.17 |
DAY 8. interface와 추상클래스 (0) | 2021.02.16 |
급여 관리 프로그램 (0) | 2021.02.12 |