반응형

1. 내부 클래스(inner class)

  -우리가 만든 클래스 안에 또 하나의 클래스를 만든 것

  -외부 클래스에서는 안쪽 클래스를 객체화 하여 그 객체로 안쪽 클래스의 자원을 사용한다.

  -내부 클래스에서는 바깥쪽 클래스의 자원을 직접 사용 가능하다.

 

public class outer{

	public class inner{  //내부 클래스
    
    }
}
package ClassInner_nested_local_anonymouse;

public class InnerClass {
	int i;
	public InnerClass() {
		System.out.println("바깥클래스 생성자");
	}
	public void outMethod() {
		System.out.println("바깥 클래스의 메서드");
	}
	
		//--------------------- inner class start
		public class Inner{
			int j;
			public Inner() {
				System.out.println("안쪽 클래스의 생성자");
			}
			public void inMethod() {
				System.out.println("안쪽클래스의 생성자");
				System.out.println("안쪽 메서드 바깥변수" + i);
			
			}
		} //---------------------inner class end
	
	public static void main(String[] args) {
		InnerClass t1 = new InnerClass();
		t1.i = 10;
		// t1.j = 10; 안쪽 클래스의 변수는 직접 사용이 불가능
		// t1.inMethod(); 안쪽 클래스의 메서드는 직접 사용이 불가능
		// 바깥 클래스에서 안쪽클래스의 자원을 사용하려면 안쪽 클래스를 객체화 하여 사용
		InnerClass.Inner in = t1.new Inner();
		//안쪽 클래스의 자원 사용
		in.j = 100;
		in.inMethod();
	} //main
} // class

2. Nested Class(중첩 클래스)

 - 안쪽 클래스를 static 변수처럼 사용이 가능합니다.

 - 안쪽 클래스 정의시 static 붙여서 정의 합니다.

 - 외부 클래스 instance 영역은 사용할 수 없습니다.

 - 안쪽 클래스는 객체화하지 않고 사용합니다.(static)

package ClassInner_nested_local_anonymouse;

public class NestedClass {
	int i;
	static int j;
	public NestedClass() {
		System.out.println("외부클래스의 생성자");
	}
	public void outMethod() {
		System.out.println("인스턴스메서드");
	}
	public static void outStaticMethod() {
		System.out.println("외부 클래스의 스태틱메서드");
	}
	
	// --------------중첩 클래스 시작
	static class Nested{
		static int n;
		public Nested() {
			System.out.println("안쪽 생성자");
		}
		public static void inMethod() {
			// i= 10; //static영역에서는 instance 영역의 자원을 직접 사용할 수 없음.
			System.out.println("안쪽 메서드");
			NestedClass.j=10;
			//outMethod(); //static영역에서는 instance영역의 자원을 직접 사용할 수 없음.
			NestedClass.outStaticMethod();
		}//inMethod
	}//class
	//--------------------중첩클래스 end
	
	public static void main(String[] args) {
		Nested.n=10;
		Nested.inMethod();
	}
}

3. 지역 클래스 (Local Class)

 - 메소드 안에서 클래스를 정의할 때

 - 메소드 내부에서만 지역변수처럼 클래스를 사용할 때

 - 지역 클래스는 instance 변수, method를 사용할 수 있지만 지역변수, parameter는 final이 붙은 것만 사용가능.

 - 메소드 바깥에서 사용할 수 없다. (지역변수 처럼)

package ClassInner_nested_local_anonymouse;

public class LocalClass {
	int out_i;
	public LocalClass() {
		System.out.println("바깥 클래스 생성자");
	}
	public void method(int param_i, final int param_j) {
		int local_i= 0;
		final int local_j = 0;
		//지역클래스 시작
		
		class Local{
			int i;
			public Local() {
				System.out.println("지역 클래스의 생성자");
			}
			public void localMethod() {
				System.out.println("외부 클래스의 인스턴스변수= "+out_i);
				
				//final이 붙어 있지 않은 파라미터는 지역클래스에서 사용할 수 없다.
				//system.out.println("파라미터 param_i="+param_i);
				System.out.println("파라미터 param_j= "+param_j);
				
				//final이 붙어 있지 않은 클래스는 지역클래스에서 사용할 수 없다.
				//System.out.println("지역변수 local_i"+local_i);
				System.out.println("지역변수 local_j= "+local_j);
				System.out.println("지역클래스의 메소드");
			}
		}
		Local local = new Local();
		local.i=10;
		local.localMethod();
	}
	public static void main(String[] args) {
		LocalClass lc = new LocalClass();
		lc.method(100, 200);
	}
}

4. 익명 클래스

Test t1 = new Test(){ 
	public int num = 10;
	@Override 
	public int getNum(){ 
	return this.num; 
	} 
};

익명 클래스 참조 : https://mommoo.tistory.com/16

 

반응형
블로그 이미지

꽃꽂이하는개발자

,