Day 21(8/30) InnerClass, Frame, EventHandler
2016. 9. 1. 16:31ㆍProgramming/Java
**오늘 배운 내용**
1) InnerClass 호출법, staticClass 호출법
2) Frame 작성, EventHandler-WindowListener 활용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | import com.javalesson.ch18innerclass.OutClass.InnerClass; class OutClass{ int intVal=0; class InnerClass{ int intVal =10; public void innerMethod(){ int intVal = 100; System.out.println("innerMethod.intVal="+intVal); //100 System.out.println("InnerClass.intVal="+this.intVal); //10 System.out.println("OuterClass.intVal="+OutClass.this.intVal); //0 }//method end }//InnerClass end }//OuterClass end public class L01InnerClass { public static void main(String[] args) { //innerMethod()를 출력 OutClass oc = new OutClass(); InnerClass ic = oc.new InnerClass(); ic.innerMethod(); } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | class OutPrint{ public void println(String a){ System.out.println(a); } public void println(int a){ System.out.println(a); } public void println(boolean a){ System.out.println(a); } } class OuterClass{ int val =0; static int staticVal = 50; public static class StaticClass{ int val =0; //사용하지 않기를 권장 static int staticVal = 50; StaticClass(){}//생성자는 가질 수 있지만 new 연산자로 생성자를 호출할 수 없음 public void a(){ System.out.println("StaticClass.a() 호출"); }//a() end public static void method(){ System.out.println("StaticClass.staticVal="+staticVal); //System.out.println("StaticClass.val="+val); //불가능 System.out.println("InClass.val="+new OuterClass().new InClass().val); //out=>in 차례로 인스턴스 만든 후 System.out.println("OuterClass.val="+new OuterClass().val); System.out.println("OuterClass.staticVal="+OuterClass.staticVal); } }//StaticClass end class InClass{ int val = 10; } public void method(){ System.out.println("StaticClass.staticVal="+OuterClass.StaticClass.staticVal); System.out.println("StaticClass.val="); //불가능 System.out.println("InClass.val="+new OuterClass().new InClass().val); System.out.println("OuterClass.val="+this.val); //static 메소드에선 this로 접근 불가능 System.out.println("OuterClass.staticVal="+OuterClass.staticVal); } }//OuterClass end public class L03InnerClassEx { public static void main(String[] args){ //OuterClass.method() new OuterClass().method(); //static 선언 x 클래스는 main new 실행하기 전까진 뼈밖에 없다. //static으로 선언된 inner 클래스는 컴파일시 메모리에 할당(미리 객체 생성 필요 없음) //StaticClass.method() OuterClass.StaticClass.method(); //OuterClass out println을 실행하세요. OuterClass.out.println("a"); } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.Label; import java.awt.Panel; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; //addWindowListener 들어갈 클래스를 Inner class로 해결 //inner 클래스는 상속을 받을 수 없는 메소드의 한계 때문에 메소드 대신 사용하는 경우가 많다. class FrameDemo extends Frame{ Panel p; Label l1; Label l2; Label l3; public FrameDemo(String frameName){ //생성자 = 설계도? super(frameName); p = new Panel(); p.setBackground(Color.LIGHT_GRAY); //static은 객체 생성 없이, JVM 작동할 때 바로 호출 가능 l1 = new Label("1.Label"); l2 = new Label("2.Label", Label.CENTER); l3 = new Label("3.Label", Label.RIGHT); l1.setBackground(Color.blue); l2.setBackground(Color.DARK_GRAY); l3.setBackground(Color.GREEN); //font 바꾸기, 글씨 색 바꾸기 l1.setFont(new Font("",Font.BOLD,60)); l2.setForeground(Color.red); //frame x 버튼이 작동하도록 p.add(l1); p.add(l2); p.add(l3); this.add(p); this.setSize(600,400); //super와 this는 반대 super.setVisible(true); //this는 자기자신, super는 슈퍼 클래스 지정 this.addWindowListener(new EventHandler(this)); //프레임이나 라벨에 listener를 붙여줌(이벤트 발생 여부를 들음). this/super 모두로 프레임에 접근 가능 l3.addMouseListener(new MouseEventHandler()); } //inner 클래스는 내부 자원 사용 가능 class MouseEventHandler extends MouseAdapter{ public void mouseEntered(MouseEvent e){ l3.setBackground(Color.DARK_GRAY); l3.setText("우와!"); } public void mouseExited(MouseEvent e){ l3.setBackground(Color.GREEN); l3.setText("3.Label"); } } } class EventHandler extends WindowAdapter{ //WindowAdapter는 listener 상속하므로, adapter 써도 무방 //WindowListener를 구현해서 WindowEvent를 설정하는 곳 FrameDemo fd;// 생성자에서 받아보세요 EventHandler(FrameDemo fd){ this.fd=fd; } public void windowClosing(WindowEvent e){ fd.l3.setBackground(Color.red); fd.l3.setText("exit"); e.getWindow().setVisible(false); //화면을 끈다. e.getWindow().dispose(); //메모리를 제거 => 자동 종료됨 System.exit(0); //프로그램 강제 종료 } } public class L02AnonymousClass { public static void main(String[] args) { new FrameDemo("innerClass로 EventHandler 만들기"); } } | cs |
'Programming > Java' 카테고리의 다른 글
Day 23(9/1) sleep, windowClosing (0) | 2016.09.01 |
---|---|
Day 22(8/31) Thread, sleep (0) | 2016.09.01 |
Day 20(8/29) Read(입력 받기) (0) | 2016.08.29 |
Day 19(8/26) 좌석 예약 시스템 (0) | 2016.08.29 |
Day 18(8/25) 숫자 맞추기 게임, 가위바위보 (0) | 2016.08.26 |