Inner 클래스와 Outer 클래스
– 다른 클래스 내부에 삽입된 클래스
– 외부 클래스를 Outer 클래스 내부 클래스를 Inner 클래스라고 한다.
– Outer 클래스의 인스턴스가 생성된 후에 Inner 클래스의 인스턴스 생성이 가능하다.
– Outer 클래스의 인스턴스를 기반으로 Inner 클래스의 인스턴스가 생성된다.
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 키워드가 선언된 클래스
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 클래스
– 메소드 내에 정의된 클래스
– 메소드 내에서만 참조변수 선언이 가능하다
public interface Printable { public void print(); }
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 클래스
– 클래스의 이름이 정의되지 않은 클래스
– 인터페이스의 인스턴스를 리턴한다.
public interface Printable { public void print(); }
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); } }; } }