내부클래스
-클래스 안의 클래스를 의미한다.,
-코드를 간단하게 표현하기위하여 사용한다.
선언위치에 따라
1) Member inner class
-Non-static class
-Static class
2) Local inner calss
-Named local class
-Anonymous class
Outer 클래스, Inner 클래스 예제
package kr.co.kihd.event2;
public class InnerClassTest {
public static void main(String[] args) {
Outer outer = new Outer();
System.out.println("Outer의 aa값 : " + outer.aa);
System.out.println("Outer의 bb값 : " + Outer.bb);
outer.method();
System.out.println("----Inner 클래스 접근하기----");
Outer outer2 = new Outer();
Outer.Inner inner = outer2.new Inner();
System.out.println("Inner의 cc값 = " + inner.cc);
inner.subFunc();
Outer.StaticInner staticInner = new Outer.StaticInner();
System.out.println("StaticInner dd값 = " + staticInner.dd);
staticInner.subFunc1();
//staticInner.subFunc2();
Outer.StaticInner.subFunc2(); //올바른 호출 방법
}
}
//Outer 클래스
class Outer {
int aa = 100; //인스턴스 변수, non-static 변수
static int bb = 200; //클래스 변수, static 변수
public void method() {
System.out.println("-------일반 메서드-------");
}
//Member Inner 클래스(non-static 내부클래스)
class Inner {
int cc = 10;
public void subFunc() {
System.out.println("------Inner Class(non-static)");
//Outer클래스 맴버 호출
System.out.println("외부클래스의 변수 aa = " + aa);
System.out.println("외부클래스의 변수(static) bb = " + bb);
method();
}
}
//Member Inner 클래스(static 내부클래스)
static class StaticInner{
int dd = 20;
static int ee = 30;
public void subFunc1() {
System.out.println("------Inner Class(non-static)");
}
public static void subFunc2() {
System.out.println("------Inner Class(non-static2)");
}
}
}
Outer의 aa값 : 100
Outer의 bb값 : 200
-------일반 메서드-------
----Inner 클래스 접근하기----
Inner의 cc값 = 10
------Inner Class(non-static)
외부클래스의 변수 aa = 100
외부클래스의 변수(static) bb = 200
-------일반 메서드-------
StaticInner dd값 = 20
------Inner Class(non-static)
------Inner Class(non-static2)
Outer 클래스, Inner 클래스 예제2
package kr.co.kihd.event2;
public class InnerClassTest2 {
public static void main(String[] args) {
Outer1 ot1 = new Outer1();
Outer1.Innner oi = ot1.new Innner();
oi.innerFunc();
}
}
class Outer1{
int value = 100;
class Innner{
int value = 200;
void innerFunc() {
int value = 300;
System.out.println("InnerFunc의 value = " + value);
System.out.println("Inner클래스의 value = " + this.value);
System.out.println("Outer1클래스의 value = " + Outer1.this.value);
}
} //Inner class
}//Outer class
InnerFunc의 value = 300
Inner클래스의 value = 200
Outer1클래스의 value = 100
로컬이너클래스 예제
package kr.co.kihd.event2;
public class LocalInnerClassTest {
String str = "멤버 변수 str";
public void method() {
final int aa = 100;
System.out.println(str);
System.out.println(aa);
class LocalInner {
String str1 = "로컬이너 클래스의 변수";
public void show() {
System.out.println("LocalInnerClassTest의 변수 str : " + str);
System.out.println("LocalInner의 변수 str1 : " + str1);
System.out.println("method()의 지역변수 : " + aa);
}
}
LocalInner li = new LocalInner(); //내부에서만 객체생성가능함.
li.show();
}
public static void main(String[] args) {
LocalInnerClassTest local = new LocalInnerClassTest();
local.method();
}
}
멤버 변수 str
100
LocalInnerClassTest의 변수 str : 멤버 변수 str
LocalInner의 변수 str1 : 로컬이너 클래스의 변수
method()의 지역변수 : 100
내부클래스 사용시 별로의 바이너리 파일이 생성된다.
익명클래스(Anonymous Class)
-이름이 없는 로컬이너클래스(Local Inner class)
-클래스의 선언과 객체의 생성을 동시에 한다.
-이름이 없기 떄문에 생성자도 가질수 없다.
-단, 하나의 클래스를 상속받을수 있다.
-단, 하나의 인터페이스를 구현할 수 있다.
Frame 상속 GUI를 가지는 멤버
Anonymous형태로 이벤트 처리 예제
package kr.co.kihd.event2;
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class AnonymousTest extends Frame {
Button btn;
public AnonymousTest() {
setBounds(200, 200, 300, 300);
btn = new Button("Exit");
add(btn, "South");
btn.addActionListener(new ActionListener() {//버튼만 객체이름없이 구현
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
AnonymousTest am = new AnonymousTest();
am.setVisible(true);
}
}
//class EventHandler implements ActionListener{
//
// @Override
// public void actionPerformed(ActionEvent e) {
// System.exit(0);
//
// }
//
//}
TextComponent Test
package kr.co.kihd.event2;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TextComponentTest extends Frame {
TextField textField;
TextArea textArea;
public TextComponentTest(String title) {
super(title);
}
public void textComponentShow() {
this.textArea = new TextArea();
this.textField = new TextField();
//Frame은 원래 BorderLayout이므로 아래와 같이 추가하면 된다.
this.add(textField, "South"); //연결 하면서 위치를 파라미터값으로 설정
this.add(textArea, "Center");
/*
* ActionEvent가 발생하는 4가지가 있다.
* 1)Butten이 클릭되었을 때
* 2)Menu를 클릭했을때
* 3)TextField에서 Enter키를 눌렀을 때
* 4)List의 Item하나를 선택해서 더블클릭했을 때
*/
this.textField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// textField에서 Enter를 치면, txtArea에 입력된 text를
// textArea에 추가한다.
textArea.append(textField.getText() + "\n");
//textField의 내용을 지운다.
textField.setText("");
textField.requestFocus();
}
});
//textArea의 글자를 편집하지 못하게 설정
//필드를 통해서 추가되도록 제한을 함.
this.textArea.setEditable(false);
this.setSize(300, 200);
this.setLocation(500,300);
this.setVisible(true);
//focus가 실행됨과 동시에 textField에 위치하도록 설정
this.textField.requestFocus();
}
}
package kr.co.kihd.event2;
public class TextComponentEventTest {
public static void main(String[] args) {
TextComponentTest tEvent =
new TextComponentTest("Text컴포넌트");
tEvent.textComponentShow();
}
}
어뎁터 클래스
이벤트 리스너 구현에 따른 부담 해소를 위해
리스너의 모든 메소드가 단순 리턴하도록 구현해 놓은 클래스
종료기능 추가
package kr.co.kihd.event2;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TextComponentTest2 extends Frame {
TextField textField;
TextArea textArea;
public TextComponentTest2(String title) {
super(title);
}
public void textComponentShow() {
this.textArea = new TextArea();
this.textField = new TextField();
//Frame은 원래 BorderLayout이므로 아래와 같이 추가하면 된다.
this.add(textField, "South"); //연결 하면서 위치를 파라미터값으로 설정
this.add(textArea, "Center");
/*
* ActionEvent가 발생하는 4가지가 있다.
* 1)Butten이 클릭되었을 때
* 2)Menu를 클릭했을때
* 3)TextField에서 Enter키를 눌렀을 때
* 4)List의 Item하나를 선택해서 더블클릭했을 때
*/
this.textField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// textField에서 Enter를 치면, txtArea에 입력된 text를
// textArea에 추가한다.
textArea.append(textField.getText() + "\n");
//textField의 내용을 지운다.
textField.setText("");
textField.requestFocus();
}
});
//textArea의 글자를 편집하지 못하게 설정
//필드를 통해서 추가되도록 제한을 함.
this.textArea.setEditable(false);
this.setSize(300, 200);
this.setLocation(500,300);
this.setVisible(true);
//focus가 실행됨과 동시에 textField에 위치하도록 설정
this.textField.requestFocus();
//윈도우 이벤트 익명자식객체로 만들어 구현.
WindowAdapter waAdapter = new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
this.addWindowListener(waAdapter);
}
}
package kr.co.kihd.event2;
public class TextComponentEventTest {
public static void main(String[] args) {
TextComponentTest2 tEvent =
new TextComponentTest2("Text컴포넌트");
tEvent.textComponentShow();
}
}
swing test
package kr.or.kihd.swingtest;
import javax.swing.JFrame;
public class SwingTest1 {
public static void main(String[] args) {
JFrame jFrame = new JFrame();
jFrame.setTitle("프레임연습");
jFrame.setSize(300, 300);
jFrame.setVisible(true);
}
}
package kr.or.kihd.swingtest;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class SwingTest2 extends JFrame{
public SwingTest2() {
super("컴포넌트 추가하기");
//프레임이 닫힐때 프로그램이 같이 종료된다.
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.setLayout(new FlowLayout());
contentPane.setBackground(Color.yellow);
setSize(500, 500);
setVisible(true);
contentPane.add(new JButton("확인"));
contentPane.add(new JButton("취소"));
}
public static void main(String[] args) {
new SwingTest2();
}
}
package kr.or.kihd.swingtest;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class SwingTest3 extends JFrame{
Container container;
JButton btn1, btn2, btn3, btn4;
public SwingTest3() {
super("버튼 제작 테스트");
setDefaultCloseOperation(EXIT_ON_CLOSE);
container = getContentPane();
container.setLayout(new FlowLayout());
btn1 = new JButton("일반 버튼");
btn1.addActionListener(new EventHandler());
container.add(btn1);
setSize(300, 300);
setVisible(true);
}
public class EventHandler implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if(obj == btn1) {
System.out.println("위치 : " + btn1.getX() +
", " + btn1.getY() +
" 크기: " + btn1.getSize());
}
}
}
public static void main(String[] args) {
new SwingTest3();
}
}