클래스 안에 클래스를 두는 것을 중첩 클래스라 하는데, static의 유무나 클래스의 위치에 따라 아래와 같은 종류로 나뉜다.

코드로 보자면 아래와 같다.
class Outer {
	...
		//정적 중첩 클래스
		static class StaticNested {
	...
		}
		//내부 클래스
		class Inner {
	...
		}
}
class Outer {
		public void process() {
		
		//지역 변수
		int lcoalVar = 0;
		
		//지역 클래스
		class Local {...}
		Local local = new Local();
		
	}
}
잠깐! 그전에 왜 굳이 클래스 안에 클래스를 둘까?? → 논리적으로 그룹화하고싶을때, 캡슐화의 장점이 있다.
→ 내부 클래스를 포함한 모든 중첩 클래스는 특정 클래스가 다른 하나의 클래스 안에서만 사용되거나, 둘이 아주 긴밀하게 연결되어 있는 특별한 경우에만 사용해야 한다. 외부의 여러 클래스가 특정 중첩 클래스를 사용한다면 중첩 클래스로 만들면 안된다.
웬만하면 나누는 게 좋은 거 같긴한데,,,
먼저 정적 중첩 클래스에 대해서 봐보자! 정적 중첩 클래스는 사실상 다른 바깥클래스(NestedOuter)와 다른 클래스이다! 그래서 자신의 멤버변수나 클래스단(static)의 변수에만 접근 가능하다!
public class NestedOuter {
		private static int outClassValue = 3;
		private int outInstanceValue = 2;
		
	static class Nested {
		private int nestedInstanceValue = 1;
		
		public void print() {
		
		// 자신의 멤버에 접근
		System.out.println(nestedInstanceValue);
		
		// 바깥 클래스의 인스턴스 멤버에는 접근할 수 없다.
		//System.out.println(outInstanceValue);
		
		// 바깥 클래스의 클래스 멤버에는 접근할 수 있다. private도 접근 가능
		System.out.println(NestedOuter.outClassValue);
	}
}
}
그럼 이런 정적 중첩 클래스는 언제 쓸까?
아래의 NetworkMessage(정적 중첩 클래스)는 극명하게 이 Network(외부) 클래스에서만 쓰일 것이다! 이런 클래스는 다른 클래스로 따로 빼버리면 굉장히 지저분해질 수 있고, 논리적으로 한눈에 들어오지 않을 것이다! 지금은 아! NetworkMessage 중첩 클래스는 Network의 메시지 출력을 담당하는 구나! 를 한번에 알아 볼 수 있다! (다른 클래스로 뺏다면 두 클래스를 확 했어야 했을듯!)
public class Network {
	public void sendMessage(String text) {
	
		NetworkMessage networkMessage = new NetworkMessage(text);
		networkMessage.print();
		
	}
	private static class NetworkMessage {
	
		private String content;
		
		public NetworkMessage(String content) {
			this.content = content;
	}
	
	public void print() {
		System.out.println(content);
	}
	
}
}