Nested  class(중첩 클래스) --Static nested class(정적내부클래스)
                           --inner class                     -local inner class
	                                                           -Anonymous inner class

내부 클래스란 특정 클래스 안에서만 사용하기 위해 만든 내부에 정의된 클래스를 의미한다. 외부에 클래스를 만든다면 외부에서 접근하여 사용 될 가능성이 있기 때문에 내부클래스를 만든다. 어떤 객체에 대한 정보를 고유 정보와 공통 정보로 분리할 필요가 있을때 쓰인다.

장점

내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근할 수 있게 됩니다.

서로 관련 있는 클래스를 논리적으로 묶어서 표현함으로써, 코드의 캡슐화를 증가시킵니다.

외부에서는 내부 클래스에 접근할 수 없으므로, 코드의 복잡성을 줄일 수 있습니다

형태

public class A{  //Outer Class

			public  class B{   //Inner  Class
			   
		        	}

	     public static class c{ //Inner Class

							  }
}

내부클래스 ( Inner Class)

Outer Class

외부 클래스

package inner01_basic;

//내부 클래스(inner)-클래스 안에 있는 클래스 
// 			outerclass-내부 클래스를 감싸고 있는 클래스 
//외부클래스 -해당 클래스와 상관없는 클래스

//Outer Class
public class Inner01 {

	//내부(inner)클래스 	
	class Cal{
		int value =0;
		public void plus() {
			value++;
		}
	}
	
	

	public static void main(String[] args) {
		
		Inner01 c = new Inner01();
	    Inner01.Cal cal = c.new Cal();
	    cal.plus();
	    System.out.println(cal.value);
		
	}

}

내부 클래스의 활용

Outer 클래스 내에서 주로 클래스 객체 생성을 하여 사용한다.

특정 클래스에만 타입이 필요한 경우 사용된다.

외부 클래스를 만든다면 특정 클래스 외에 사용할 가능성이 있으며 유기적인 연관성을 찾기가 힘들수 있기 때문에 일반적으로 내부에 클래스를 정의하여 사용한다.

제품 정보의 속성들에 관한 정보를 관리할 때 쓰인다.

버튼의 위치 정보등을 내 타입으로 정의하여 사용하고자 할때 사용된다.

package inner01_basic.mybutton;

//버튼 정보
public class Mybutton {

	private String caption;

	public String getCaption() {
		return caption;
	}
	public void setCaption(String caption) {
		this.caption = caption;
	}
	
	//버튼의 위치,크기를 지정하는 클래스 정의
	
	public class PositionInfo{
		public int x;
		public int y;
		public int width;
		public int height;
		
		@Override
		public String toString() {
			return "PositionInfo [x=" + x + ", y=" + y + ", width=" + width + ", height=" + height + "]";
		}
		
		
	}
	
  //객체 생성(주소값)	
	private PositionInfo psi = new PositionInfo();
	//객체의 주소값을 리턴 메소드
	public PositionInfo getPositionInfo() {
		return psi;		
	}
}