Inner 클래스와 Outer 클래스
– 다른 클래스 내부에 삽입된 클래스
– 외부 클래스를 Outer 클래스 내부 클래스를 Inner 클래스라고 한다.
– Outer 클래스의 인스턴스가 생성된 후에 Inner 클래스의 인스턴스 생성이 가능하다.
– Outer 클래스의 인스턴스를 기반으로 Inner 클래스의 인스턴스가 생성된다.


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
public class Test{
 
public static void main(String[] args) {
Outer o1 = new Outer("o1");
Outer o2 = new Outer("o2");
Outer.Inner oi1 = o1.new Inner(); // 외부 참조방법
Outer.Inner oi2 = o2.new Inner(); // Outer 의 참조변수를 기반으로 Inner의 인스턴스를 생성
// Inner의 인스턴스는 Outer의 인스턴스에 종속적이다.
}
}
 
class Outer{
private String name;
public Outer(String name) {
this.name = name;
}
void print(){
System.out.println(name);
}
class Inner{
Inner(){
print();  // Outer 클래스의 메소드 직접접근 가능
}
}
}


Nested 클래스
– Inner 클래스에 static 키워드가 선언된 클래스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Test{
 
public static void main(String[] args) {
Outer o = new Outer();
Outer.Nested on = new Outer.Nested(); // 외부 참조방법
on.print();
}
}
 
class Outer{
 
Outer(){
Nested n = new Nested(); // Outer 클래스에서 객체생성가능
n.print();
}
static class Nested{
public void print(){
System.out.println("nested");
}
}
}


Local 클래스
– 메소드 내에 정의된 클래스
– 메소드 내에서만 참조변수 선언이 가능하다


1
2
3
public interface Printable {
public void print();
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Test{
 
public static void main(String[] args) {
Outer o = new Outer();
Printable p = o.create("print");   // 메소드 내에서만 참조변수 선언이 가능하다.
// 따라서 인터페이스 Printable 을 구현하도록 한후 리턴된 인스턴스를 Printable 참조변수로 참조한다.
p.print(); // Printable 의 print 메소드를 호출하면 오버라이딩에 의해서 Local 클래스의 print 메소드가 호출된다.
}
}
 
class Outer{
public Printable create(final String print){ // final 선언된 변수만 Local 클래스내에서 접근이 가능하다.
class Local implements Printable{
@Override
public void print() {
System.out.println(print);
}
}
return new Local();
}
}


Anonymous 클래스
– 클래스의 이름이 정의되지 않은 클래스

– 인터페이스의 인스턴스를 리턴한다.


1
2
3
public interface Printable {
public void print();
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Test{
 
public static void main(String[] args) {
Outer o = new Outer();
Printable p = o.create("print");  
p.print();
}
}
 
class Outer{
public Printable create(final String print){
return new Printable() {
@Override
public void print() { // Printable 에 정의된 미완성 메소드의 내부를 바로 채워준다면 인터페이스의 인스턴스 생성을 허용하는 java 문법  
System.out.println(print);
}
};
}
}


http://ccm3.net/archives/4679


http://jsnote.tistory.com/21

+ Recent posts