read

자바에서 클래스 정의할 때 static 키워드를 붙여서 정의하는 경우가 있다. static class 는 일반 class 와 뭐가 다를까? 어떤 경우에 static 키워드가 붙는가?

먼저 자바의 클래스 종류들을 살펴보면 크게 두가지 분류가 있다. Top-level classes, Inner classes.

Top-level classes 는 패키지를 구성원이며, 컴파일하고 나면 각각 하나의 *.class 파일이 생긴다.

Inner classes 는 Top-level class 내부에 선언되는 클래스로 그 종류는 아래와 같다.

  • Anonymous : 한 문장 안에서 선언되고, instantiated 되는 클래스다. 해당 문장이 실행되는 그 한 번 밖에 사용되지 않는다.
    • okButton.addActionListener( new ActionListener(){
         public void actionPerformed(ActionEvent e){
            dispose();
         }
      });
  • Local : 코드 블락 안에 선언된 클래스이다. scope 안에서만 마음껏 사용가능하다. public, protected, private, static 등의 accessor 가 소용 없다.
    • //some code block .......{
         class ListListener implements ItemListener {
            List list;
            public ListListener(List l) {
               list = l;
            }
            public void itemStateChanged(ItemEvent e) {
               String s = l.getItemSelected();
               doSomething(s);
            }
         }
         List list1 = new List();
         list list2 = new List();
         list1.addItemListener(new ListListener(list1));
         list2.addItemListener(new ListListener(list2));
      }
  • Member : 멤버 클래스는 한 클래스 내부에 멤버 변수들처럼 선언된 내부 클래스를 말한다. 위의 Local 클래스와는 다르다. Static 키워드와 함께 선언될 수 있는 클래스가 바로 member class 이다. 이 경우 member class 는 아래에 있는 Nested top-level 클래스로 바뀌게 된다.
    • class ParentClass
      {
          public String sayHello()
          {
              // Local class
              class HelloString
              {
                  public String getStr() { return "HELLO"; }
              }
              HelloString str = new HelloString();
              return str.getStr();
          }
      
          // Member class
          class WorldString
          {
              public String getStr() { return "WORLD"; }
          }
      
          public String sayWorld()
          {
              WorldString w = new WorldString();
              return w.getStr();
          }
      
          public static void main (String [] args)
          {
              ParentClass c = new ParentClass();
              System.out.println(c.sayHello());
              System.out.println(c.sayWorld());
          }
      }
  • Nested top-level : 다른 클래스의 내부에 선언되어 있다는 것 말고 top-level 클래스와 동일하다.

출처 : Static class declarations - JavaWorld

Blog Logo

Ki Sung Bae


Published

Image

Gsong's Blog

Developer + Entrepreneur = Entreveloper

Back to Overview