# 내포 클래스
- 클래스 안에 클래스를 정의하는 것을 내포 클래스라고 한다
- 클래스 안에 다른 클래스가 들어가 있는 모습
- 중첩 클래스, 내부 클래스 등으로 불리기도 한다
- 자주 사용되지는 않고, 특수한 경우에 사용된다
- 요새는 내포 클래스를 잘 사용하지 않고, 그냥 클래스마다 파일을 만들곤 한다
- 자바에서는 내포 클래스가 크게 두 가지로 나뉜다
- 정적 내포 클래스
- 비정적 내포 클래스
## 정적 내포 클래스 (static nested class)
- 정적 내포 클래스는 외부 클래스의 정적 멤버처럼 취급된다.
- 외부 클래스의 인스턴스가 생성되지 않아도 사용할 수 있다
- 이 클래스는 외부 클래스의 인스턴스 멤버에 접근할 수 없으며, 외부 클래스의 정적 멤버만 접근 가능하다.
```java
class Outer {
static class Inner {
int iv = 200;
}
}
public class Main {
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner();
System.out.println(inner.iv);
}
}
```
## 비정적 내포 클래스 (non-static nested class)
- 비정적 내포 클래스는 외부 클래스의 인스턴스 멤버처럼 취급된다.
- 외부 클래스의 인스턴스가 생성되어야 사용할 수 있다.
- 이 클래스는 외부 클래스의 인스턴스 멤버에 접근할 수 있으며, 외부 클래스의 정적 멤버도 접근 가능하다.
```java
class Outer {
class Inner {
int iv = 200;
}
}
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
System.out.println(inner.iv);
}
}
```
## 내포 클래스의 용도
- 서로 연관된 클래스들을 그룹지을 수 있음
- 패키지로 그룹 짓는 것도 가능하다
- 하지만 클래스 속에 넣는 것이 더 긴밀한 관계를 나타낼 수 있다
- 내포 클래스는 바깥 클래스의 멤버들을 자유롭게 사용할 수 있다
- private 멤버에도 접근 가능하다
- 반대의 경우에는 불가능하다