본문으로 바로가기

[자바](AWT)+member/anonymous innerClass

category Java 2017. 8. 10. 15:26


안녕하세요 ~~ 이번시간엔 AWT환경에서 맴버이너클래스(Member inner), 어나니머스이너클래스(Anonymous inner) 에 대해 알아보겠습니다.


맴버이너 클래스는 outter 클래스와 inner 클래스로 구성됩니다.


inner 클래스는 outter 클래스의 내부에 선언되는데 이때, outter 클래스의 정보를 사용할수 있습니다.


어나니머스 클래스는 익명 클래스로, 클래스명이 없고 정의와 동시에 사용할수 있습니다.


자세한 내용은 아래 예제를 보고 알아보겠습니다.

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

public class AdapterEx extends Frame implements ActionListener {

	Panel p1, p2, p3;

	TextField tf;
	TextArea ta;

	Button b1, b2;

	public AdapterEx() {

		super("Adapter 테스트");

		p1 = new Panel();
		p2 = new Panel();
		p3 = new Panel();

		tf = new TextField(35);
		ta = new TextArea(10, 35);

		b1 = new Button("Clear");
		b2 = new Button("Exit");

		p1.add(tf);
		p2.add(ta);
		p3.add(b1);
		p3.add(b2);

		add("North", p1);
		add("Center", p2);
		add("South", p3);

		setBounds(300, 200, 300, 300);
		setVisible(true);

		b1.addActionListener(this);
		b2.addActionListener(this);

		tf.addKeyListener(new KeyEventHandler(tf, ta));

		addWindowListener(new WindowEventHandler());
	}

	public void actionPerformed(ActionEvent e) {
		String str = e.getActionCommand();
		if (str.equals("Clear")) {
			ta.setText("");
			tf.setText("");
			tf.requestFocus();
		} else if (str.equals("Exit")) {
			System.exit(0);
		}
	}

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

class KeyEventHandler extends KeyAdapter {
	TextField tf;
	TextArea ta;

	public KeyEventHandler(TextField tf, TextArea ta) {
		this.tf = tf;
		this.ta = ta;
	}

	public void keyTyped(KeyEvent e) {
		if (e.getKeyChar() == KeyEvent.VK_ENTER) {
			ta.append(tf.getText() + "\n");
			tf.setText("");
		}
	}
}

class WindowEventHandler extends WindowAdapter {
	public void windowClosing(WindowEvent e) {
		System.exit(0);
	}
}


위 예제는 AWT로 간단한 텍스트필드값을 출력하는 예제인데요,

이때 윈도우 이벤트(닫기) 와 키이벤트(엔터) 를 구별하는 클래스를 따로 정의한것을 알 수 있습니다.


위 코드중 키이벤트는 맴버 이너클래스로, 윈도우이벤트는 어나니머스 클래스로 바꾸면 아래처럼 되는데요.

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

public class AdapterEx extends Frame implements ActionListener {

	Panel p1, p2, p3;

	TextField tf;
	TextArea ta;

	Button b1, b2;

	public AdapterEx() {

		super("Adapter 테스트");

		KeyEventHandler ke = new KeyEventHandler();
		
		p1 = new Panel();
		p2 = new Panel();
		p3 = new Panel();

		tf = new TextField(35);
		ta = new TextArea(10, 35);

		b1 = new Button("Clear");
		b2 = new Button("Exit");

		p1.add(tf);
		p2.add(ta);
		p3.add(b1);
		p3.add(b2);

		add("North", p1);
		add("Center", p2);
		add("South", p3);

		setBounds(300, 200, 300, 300);
		setVisible(true);

		b1.addActionListener(this);
		b2.addActionListener(this);

		tf.addKeyListener(ke);
		
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	}

	public void actionPerformed(ActionEvent e) {
		String str = e.getActionCommand();
		if (str.equals("Clear")) {
			ta.setText("");
			tf.setText("");
			tf.requestFocus();
		} else if (str.equals("Exit")) {
			System.exit(0);
		}
	}

	public static void main(String[] args) {
		new AdapterEx();
	}
	
	class KeyEventHandler extends KeyAdapter {

		public void keyTyped(KeyEvent e) {
			if (e.getKeyChar() == KeyEvent.VK_ENTER) {
				ta.append(tf.getText() + "\n");
				tf.setText("");
			}
		}
	}
}


다른점이 보이시나요?? 키이벤트는 맴버이너클래스로 바꾸어 outter 클래스의 변수를 사용하여 더욱 간결한 소스로 만들수 있었습니다.


윈도우 이벤트는 어나니머스이너클래스를 이용하여 선언과 동시에 기능을 넣어주어 위쪽 코드보다 짧고 좋은 코드로 만들수 있었는데요.


이렇게 같은코드라도 어떤 방법을 사용하느냐에 따라 코드의 길이도 짧아지고 보기가 좋아질수 있습니다.