코딩은 실력보다 시력이지

빅데이터교육과정/JAVA

DAY 9. Inner Class 와 AWT 그리고 계산기

Listeria 2021. 2. 17. 00:05

  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