Inner class (내부 클래스)
: 독립된 클래스가 아니라. 특정 클래스에서 멤버처럼 사용되고자 만든 클래스
: outer class의 멤버를 자유롭게 사용하기 위해서 씀.
: 이벤트 처리할 때 많이 사용(그래픽처리)
1. member inner class
2. static inner class
3. local inner class
4. anonymous inner class
public class InnerTest {
private int a;
protected int b;
static int c = 10;
static int d=50;
public InnerTest() {
a = 20;
b = 30;
c = 10;
}
abstract class Abs{
abstract void out2();
}
class MemberInner{ //member inner class
public void disp() {
// System.out.println(a);
// System.out.println(b);
// System.out.println(c);
System.out.println(d);
}
}
public void disp() {
/* class LocalInner{ //local inner class
void output() {
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
LocalInner li = new LocalInner();
li.output();
*/
new Abs() { //abstract inner class
void out2() {
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}.out2();
}
public static void main(String[] args){
// InnerTest it = new InnerTest();
// InnerTest.MemberInner mem = it.new MemberInner();
// InnerTest.MemberInner mem = new InnerTest().new MemberInner();
// mem.disp();
// InnerTest.MemberInner mem = new InnerTest.MemberInner();
// mem.disp();
InnerTest it = new InnerTest();
it.disp();
}
}
package Awt;
import java.awt.*;
public class TextFieldEx {
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f = new Frame("txt fd");
Panel p = new Panel();
TextField tf1 = new TextField("id",10);
TextField tf2 = new TextField("pw",10);
tf1.selectAll();
tf2.selectAll();
tf2.setEchoChar('t');
p.add(tf1);
p.add(tf2);
f.add(p);
f.setSize(300,300);
f.setVisible(true);
}
}
Frame을 통해 프로그렘 상단에 이름을 띄우고 Panel을 생성하여 하부 객체들이 전시될 수 있는 공간을 생성한다.
add를 통해 생성한 것들을 p(panel)에 추가하며 p는 f(Frame)에 추가하여 생성된 f가 전시될 수 있도록 한다.
setSize 를 통해 창의 크기를 조절할 수 있으며 setSize(x,y,가로,세로)를 통해 보다 자세한 위치를 선정 할 수 있다.
setVisible을 통해 창을 보이게 할지 안보이게 할지 정할 수 있다.
package Awt;
import java.awt.*;
public class CardLayoutEx extends Frame{
CardLayout card;
Panel first_panel, second_panel, third_panel;
public CardLayoutEx() {
super("Cardlayout test");
card = new CardLayout();
setLayout(card);
first_panel = new Panel();
first_panel.add(new Button("1"));
first_panel.add(new Button("2"));
second_panel = new Panel();
second_panel.add(new Button("3"));
second_panel.add(new Button("4"));
third_panel = new Panel();
third_panel.add(new Button("5"));
third_panel.add(new Button("6"));
add("1",first_panel);
add("2",second_panel);
add("3",third_panel);
}
public void rotate() {
for(int i=0;i<2;i++) {
try {
Thread.sleep(3000);
}catch(Exception e) {
e.printStackTrace();
}
card.next(this);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
CardLayoutEx clt = new CardLayoutEx();
clt.setBounds(200,200,200,100);
clt.setVisible(true);
clt.rotate();
}
}
카드를 넘기듯 생성해둔 panel을 하나씩 불러오는 기능이다.
package Awt;
import java.awt.*;
import java.awt.event.*;
public class ActionEventsEx extends Frame implements ActionListener{
Panel p;
Button input,exit;
TextArea ta;
public ActionEventsEx() {
super("action");
p = new Panel();
input = new Button("input");
exit = new Button("exit");
ta = new TextArea();
input.addActionListener(this); //이벤트가 발생했을때 이벤트를 캐치함. actionPerformed가 있는 위치를 지정해야함. 이번 케이스는 같은 class내에 있어서 this를 사용
exit.addActionListener(this);
p.add(input);
p.add(exit);
add(p,BorderLayout.EAST);
add(ta,BorderLayout.WEST);
setBounds(300,300, 500, 500);
setVisible(true);
}
public void actionPerformed(ActionEvent ae){
String name;
name = ae.getActionCommand();
if(name.equals("input"))
ta.append("have input\n");
else {
ta.append("program end");
try {
Thread.sleep(2000);
}catch(Exception e) {}
System.exit(0);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new ActionEventsEx();
}
}
버튼을 생성하고 그 버튼을 작동시키는거에 따라 반응하게 만든다. new Button을 이용하여 버튼을 생성하며 이 버튼을 앞에서 한것과 마찬가지로 p에 add 그리고 최종적으로 p를 창에 추가하여 display한다.
add(값,BorderLayout,(EAST/WEST/NORTH/SOUTH/CENTER)를 통해 위치를 지정할 수있다.
TextArea는 문자를 출력할 수 있는 공간이다.
package Awt;
import java.awt.*;
import java.awt.event.*;
public class WindowEventEx extends Frame implements WindowListener{
Panel p;
Button input, exit1;
TextArea ta;
public WindowEventEx() {
super("window");
Label exit = new Label("press the End button");
p=new Panel();
ta=new TextArea();
add(ta, BorderLayout.CENTER);
add(exit,BorderLayout.NORTH);
setBounds(300,300,500,500);
setVisible(true);
addWindowListener(this);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new WindowEventEx();
}
public void windowClosing(WindowEvent e) {
ta.append("들어올땐 마음대로지만 나가는건 그렇지 않단다\n");
//System.exit(0);
}
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
}
이름에서 알 수 있듯 윈도우에 기본적으로 제공되는 테두리(window)의 반응에 따라 작동하는 함수이다. 기본적으로 interface로 구성되어 있기 때문에 override를 하지 않더라도 선언해줄 필요가 있다.
package Awt;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class CompositEventEx extends Frame implements WindowListener,TextListener, ActionListener{
TextField num1 = new TextField(10);
TextField op = new TextField(5);
TextField num2 = new TextField(10);
Button input = new Button("입력");
TextArea ta = new TextArea(50,50);
Button exit = new Button("종료");
String opsave, n1save,n2save; //앞의 숫자 뒤의 숫자가 연산되기 전에 저장되는 변수
String cnt=""; //입력되는 값들이 저장됨
int mark; //계산 과정에서 연산자의 입력 여부를 확인.
//사용될 변수들과 계산기에 들어갈 버튼 생성
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("0")};
Button oper[] = {new Button("*"), new Button("/"),new Button("+"),new Button("-"),new Button("%"),
new Button("CE"), new Button("x^2"), new Button("1/x"), new Button("C"), new Button(".")};
public CompositEventEx(){
super("계산기");
setLayout(new BorderLayout());
input.setEnabled(false);
Panel p = new Panel();
Panel n = new Panel();
Panel o = new Panel();
n.setLayout(new GridLayout(4,3,2,2));
o.setLayout(new GridLayout(4,1,2,2));
//계산기의 모양을 Grid를 이용하여 만들었다. n은 숫자판을 o는 연산자 판이다.
p.add(new Label("연산:"));
p.add(num1);
p.add(op);
p.add(num2);
p.add(input);
for(int i =0;i<10;i++) {
n.add(num[i]);
num[i].addActionListener(this);
}
//위에서 생성한 버튼을 n이라는 panel에 추가.
for(int i = 0;i<10;i++) {
o.add(oper[i]);
oper[i].addActionListener(this);
}
//위에서 생성한 연산자 버튼들을 o라는 함수에 추가.
add(p, BorderLayout.NORTH);
add(ta,BorderLayout.EAST);
add(n,BorderLayout.CENTER);
add(o,BorderLayout.WEST);
add(exit,BorderLayout.SOUTH);
//위에서 생성한 각 panel을 위치에 맞게 배열
setBounds(300,300,1000,800);
setVisible(true);
num1.addTextListener(this);
num2.addTextListener(this);
input.addActionListener(this);
exit.addActionListener(this);
addWindowListener(this);
//버튼 혹은 키보드 입력에 반응할 수 있도록 add를 활용하여 활성화.
}
public static void main (String args[]){
new CompositEventEx();
}
public void actionPerformed (ActionEvent e){
String str = e.getActionCommand();
if(str.equals("*")|| str.equals("+")||str.equals("-")||str.equals("/")||str.equals("%")) {
cnt="";
op.setText(str);
mark++;
} //연산자가 입력되면 cnt를 초기화 시키고 연산자가 입력되었음을 알리는 mark에 표시
else if(mark !=0) { //연산자가 입력된후 즉 num2입력과정.
if(str.equals("입력")) {
cnt+=""; //마지막 출력 버튼인 입력이 cnt에 저장되지 않도록한다.
}else if(str.equals("CE")){
num2.setText("");
cnt=""; //CE가 입력되면 num2에 입력된 값을 삭제.
}else if(str.equals("C")) {
num1.setText("");
op.setText("");
num2.setText("");
cnt="";
mark=0;
num1.requestFocus(); //C가 입력되면 모든 입력값 초기화
}
else {
cnt+=str;
num2.setText(cnt);
} //기본적으론 num1자리에 숫자를 입력한다
}
else if(str.equals("C")) { //C가 입력되면 모든 입력값 초기화
num1.setText("");
op.setText("");
num2.setText("");
cnt="";
mark=0;
num1.requestFocus();
}
else if(str.equals("CE")) { //CE가 입력되면 num1에 입력된 값을 삭제.
cnt="";
if(mark ==0) {
num1.setText("");
}
/////////////////연산 과정에는 모두 double로 형변환하여 소숫점 계산을 용이하게 하였다.
}else if(str.equals("x^2")) {
ta.append(String.valueOf((Double.parseDouble(cnt))*(Double.parseDouble(cnt)))+"\n");
cnt="";
num1.setText("");
}else if(str.equals("1/x")) {
ta.append(String.valueOf(1/(Double.parseDouble(cnt)))+"\n");
cnt="";
num1.setText("");
}
else {
cnt+=str;
num1.setText(cnt);
}
if (str.equals("입력")){ //입력을 누르면 기존에 저장한 값들과 연산자로 계산한 값을 출력하고 모두 초기화한다.
n1save=num1.getText();
ta.append(n1save);
num1.setText("");
op.requestFocus();
opsave = op.getText();
ta.append(opsave);
op.setText("");
num2.requestFocus();
n2save=num2.getText();
ta.append(n2save+"=");
num2.setText("");
num1.requestFocus();
if(opsave.equals("*")) {
ta.append(String.valueOf(Double.parseDouble(n1save)*Double.parseDouble(n2save))+"\n");
}else if(opsave.equals("+")) {
ta.append(String.valueOf(Double.parseDouble(n1save)+Double.parseDouble(n2save))+"\n");
}else if(opsave.equals("-")) {
ta.append(String.valueOf(Double.parseDouble(n1save)-Double.parseDouble(n2save))+"\n");
}else if(opsave.equals("/")) {
ta.append(String.valueOf(Double.parseDouble(n1save)/Double.parseDouble(n2save))+".");
ta.append(String.valueOf(Double.parseDouble(n1save)%Double.parseDouble(n2save))+"\n");
}else if(opsave.equals("%")) {
ta.append(String.valueOf(Double.parseDouble(n1save)%Double.parseDouble(n2save))+"\n");
}else {
ta.append("\nWrong input, must input operator\n");
}
cnt="";
mark=0;
}
if (str.equals("종료"))
System.exit(0);
}
public void textValueChanged(TextEvent e){
if (num1.getText().equals("")||num2.getText().equals("")||op.getText().equals(""))
input.setEnabled(false);
else
input.setEnabled(true);
}
public void windowClosing(WindowEvent e) {
System.exit(0);
}
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
}
코드가 복잡하게 꼬이긴 하였지만 계산기를 구성하였다. 이를 깔끔하게 정리할 수 있도록 구상을 새로 해야할듯 하다.
'빅데이터교육과정 > JAVA' 카테고리의 다른 글
DAY 12. 예외처리와 스레드 (0) | 2021.02.23 |
---|---|
DAY 10,11. Generic과 계산기 정리 (0) | 2021.02.18 |
DAY 8. interface와 추상클래스 (0) | 2021.02.16 |
급여 관리 프로그램 (0) | 2021.02.12 |
DAY 6. 상속(is~A) / Override (0) | 2021.02.04 |