Day 21(8/30) InnerClass, Frame, EventHandler

2016. 9. 1. 16:31Programming/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