[java] 자바 Inner 클래스, Nested 클래스, Local 클래스 그리고 Anonymous 클래스 에 대한 이해

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);
				
			}
		};
	}
}

 

답글 남기기