한 클래스 내에 멤버로서 변수, 메소드, 생성자와 같이 클래스도 정의될 수 있다. 내부 클래스를 갖고 있는 클래스는 외부 클래스로 불리고, 주로 외부클래스에서만 사용된다.
파일명 표시는 OuterClass.class 와 OuterClass$InnerClass.class 로 표시한다.
package JavaExample;
public class OuterClass {
private InnerClass head = null;
private class InnerClass{
private String info;
private InnerClass ic;
private InnerClass(String info) {
this.info=info;
}
}
}
package JavaExample;
public class MyLinkedList {
private Node head = null;
private class Node{
private String data;
private Node link;
public Node(String data) {
this.data = data;
}
}
public void add(String data) {
Node newNode= new Node(data);
if(head == null) {
head = newNode;
}else {
Node next = head;
while(next.link != null) {
next = next.link;
}
next.link = newNode;
}
}
}
- Instance Class
- Static Class
- Local Class
package JavaExample;
public class OuterClass {
class InstanceClass{
}
static class StaticClass{
}
public void method1() {
class LocalClass{
}
}
}
Instance Class는 static 없이 선언된 내부 클래스이고, 외부 클래스를 생성한 후 내부클래스를 생성해야 사용할 수 있다.
public class OuterClass {
class InstanceClass{
int a;
void method2() {
System.out.println("Instance Class : "+a);
}
}
}
선언문
public static void main(String args[]) {
OuterClass outer=new OuterClass();
OuterClass.InstanceClass instance=outer.new InstanceClass();
instance.a=123;
instance.method2();
}
Static Class는 static으로 선언된 내부 클래스이며 외부 클래스 생성없이
외부클래스명.내부클래스명.메서드()형태로 사용가능하다.
public class OuterClass {
static class StaticClass{
int b;
static int c;
void method3() {
System.out.println("Static Class :" + b);
}
static void method4() {
System.out.println("Static Class :" + c);
}
}
}
선언
public static void main(String args[]) {
OuterClass.StaticClass innerStatic = new OuterClass.StaticClass();
innerStatic.b=456;
innerStatic.method3();
OuterClass.StaticClass.c=789;
OuterClass.StaticClass.method4();
}
Local Class는 메서드 안에서 선언된 클래스이며, 메서드 내부에서만 사용 가능하다.
package JavaExample;
public class OuterClass {
public void method1() {
class LocalClass{
int d;
void method5() {
System.out.println("Locals Class : " + d);
}
}
LocalClass inner = new LocalClass();
inner.d=123;
inner.method5();
}
}
- 익명클래스는 인스턴스를 한번만 생성하고 다시 사용할 일이 없는 경우에 사용한다.
- 부모 이름으로 인스턴스를 생성하면서 동시에 클래스 바디를 선언한다.
Messenger test = new Messenger() {
public void setMessage(String msg) {
System.out.println("test에서 메시지 설정"+msg);
}
public String getMessage() {
return "test";
}
};