저를 포함한 초보자분들에게 도움이 됐으면 좋겠습니다.
초보자분들은 수박 겉핥기 식으로 알고 넘어가지 마시고, 조금이라도 왜 이렇게 프로그램이 돌아가는지 알고 가시는 시간이 됐으면 좋겠습니다.

오늘은 내재 클래스(nested class)를 살펴보도록 하죠.
내재 클래스는 간단합니다. Class 안에 또 다른 Class가 들어가 있는 것이죠.
(1) 코드를 보고 설명해보죠!

(1)public class outerClass {
	class innerClass{ // outerClass의 멤버 -----InnerClass
	}
	static class nestedClass{  ----------Nested Class
	}	
}

보시다시피, outerClass 안에  nestedClass,innerClass가 존재합니다. 이게 내재/내부 클래스의 전부입니다. 간단하죠? 그럼 왜 내재/내부 클래스가 나뉘는지 간단히 이야기하고 넘어갑시다.
원래는 static nested Class 와 non-static nested Class로 나누는 것이 맞습니다. 보시다시피 static의 여부에 따라 나눠 놓았죠. 하지만.. 영어 이름이 상당히 깁니다..
이제부턴 non-static nested Class은 내부 클래스, static nested Class는 내재 클래스로 부릅시다.

내재/내부 클래스는 클래스와 동일합니다. 객체를 생성할 수도 있고 멤버로 변수, 메소드를 가질 수 있죠. 별로 다른 것이 없죠. 하지만 왜 클래스 안에 클래스를 넣어 사용을 할까요?
몇 가지 이유가 있습니다. 하나의 예를 들어보죠. A 클래스와 A 클래스만 도와주는 B 클래스가 있다고 합시다. 물론 클래스 A, B를 각각 생성하여 사용하여도 문제는 없습니다. 하지만, 여기서 'B 클래스는 A 클래스만 도와준다'라고 한다면, 굳이 B 클래스. java를 생성할 필요가 있을까요? 하지만 만약  B 클래스를 A 클래스의 내재/내부 클래스로 만들어 사용한다면, 장점이 몇 가지 있습니다. 
1. 클래스를 논리적으로 그룹화할 수 있다는 것입니다. B 클래스는 A 클래스를 도와주는 역할만 하므로 A와 B를 논리적 그룹을 만들 수 있다는 소리죠. 
2. 캡슐화의 향상을 도모할 수 있습니다. B 클래스는 A 클래스의 멤버가 되므로 A 클래스에서만 접근 가능하기에(private로 선언시) 외부에 은닉이 될 수 있는 것이죠. 
3. 판독, 유지 보수에 도움이 됩니다.
논리적으로 그룹화한다는 소리는 코드를 필요한 곳에 가깝게 위치시킬 수 있다는 소리이기에  추후 오류가 있더라도 유지 보수, 판독에 도움이 되죠.

자. 이제 그럼 어떻게 내재/내부 클래스를 접근하고, 객체 생성을 하는지 알아보도록 하죠.
일단은 내부 클래스부터 보시죠!

(2)public class outerClass {
	int k = 1;
	class innerClass{ // outerClass의 멤버
		int k = 3;
		public void say() {
			System.out.println("innerClass");
		}
	}

	public static void main(String args[]) {
		outerClass outerObject = new outerClass(); // outerClass객체 생성 
		innerClass temp = outerObject.new innerClass(); // innerClass객체 생성
		System.out.println(temp.k); // 3
		temp.say(); // innerClass
		
	}
}

클래스 객체를 만들기 위해 new를 사용하는 것을 같습니다. 하지만 다른 점이 눈에 띄네요.
바로 ' outerClass outerObject = new outerClass(); '입니다. 반드시 외부 클래스 객체를 생성한 후 
.new~~로 객체를 생성해야 합니다. 이유는 간단하죠.
innerClass는 outerClass(외부 클래스)의 멤버이기 때문입니다. 자 (2) 코드에서 outerClass에 있는 int k =1;에 접근하기 위해 어떻게 하나요? 객체.k로 접근을 합니다. k가 outerClass의 멤버이기 때문이죠.
이와 마찬가지고 innerClass도 멤버이기에 접근을 하려면 일단 outerClass의 객체가 필요합니다.
그리고 나선 innerClass를 생성하는 것이므로 ' innerClass 변수명'를 선언해주시고 
객체(outerClass 객체).new innerClass()를 해줘야 innerClass가 생기는 것이죠.
처음엔 조금 헷갈릴 수 있습니다. 클래스에 멤버에 접근하기 위해서 어떻게 해야 하는지 다시 한번 잘 생각해보시는 게 좋을 것 같습니다.

마지막으로 내재 클래스입니다.
코드 먼저 보시죠.

(3)public class outerClass {
	int k = 1;

	static class static_innerClass{
		int a = 10;
		public void say() {
			System.out.println("static_innerClass");
		}
	}
	
	public static void main(String args[]) {
//		outerClass.static_innerClass.say(); // X 오류 say()메소드는 static이 아니여서
		static_innerClass temp = new static_innerClass();
		System.out.println(temp.a); // 10
		temp.say(); //static_innerClass
	}
}

(3) 코드는 더 간단합니다. static의 특성을 다시 한번 기억해 보세요. static은 어디서든 접근이 가능합니다. 그래서 내재 클래스는 일반적인 클래스를 선언하는 것처럼 선언해주고 사용하면 끝납니다.
하지만, static은 클래스에만 붙어있습니다. static_innerClass의 멤버는 반드시 객체를 생성해야 접근이 가능하다는 것만 주의해 주시면 될 것 같네요.

자 지금까지 내재(nested)/내부(inner) 클래스에서 대해서 살펴보았습니다.
내재/내부 클래스를 사용함으로써 얻을 수 있는 장점을 다시 한번 되새겨 보시고, 선언하여 사용하는 것은 크게 어렵지 않으니 쉽게 배워 가실 수 있으실 겁니다.

자, 다음번에는 예외 처리에 대해서 살펴보겠습니다.

+ Recent posts