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 클래스와 동일하다.