- 다른 클래스 안에 정의된 클래스
- 정적 멤버 클래스, (비정적) 멤버 클래스, 익명 클래스, 지역 클래스
- 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외의 쓰임새가 있다면 톱레벨 클래스로 만든다.
- 다른 클래스 안에 선언된다.
- 바깥 클래스의 private 멤버에도 접근할 수 있다.
- public 도우미 클래스(helper class)에 자주 사용된다.
- 어댑터를 정의할 때 자주 쓰인다.
- 어댑터 패턴: 호환되지 않는 인터페이스들을 연결하는 디자인 패턴. 기존의 클래스를 수정하지 않고도, 특정 인터페이스를 필요로 하는 코드에서 사용할 수 있게 해준다. [출처]
- 바깥 클래스의 인스턴스를, 완전히 다른 클래스의 인스턴스처럼 보이도록 한다.
- 비정적 멤버 클래스의 인스턴스는 바깥 클래스의 인스턴스와 숨은 참조를 갖게 된다.
- 비정적 멤버 클래스는 바깥 인스턴스 없이는 생성할 수 없다.
클래스명.this
로 바깥 인스턴스의 메서드를 호출하거나 참조를 가져올 수 있다.
- 중첩 클래스에서 바깥 인스턴스에 접근할 일이 없다면 무조건
static
을 붙여서 정적 멤버 클래스로 만들자.- 문제점 1: 숨은 참조 → 문제의 원인을 찾기가 어려움
- 문제점 2: GC가 바깥 클래스의 인스턴스 수거 X → 메모리 누수 발생
static
을 빠뜨렸을 때 동작한다고 하더라도 치명적인 문제점이 발생할 수 있으므로 주의
- 선언과 동시에 인스턴스가 만들어지며, 코드의 어디서든 만들 수 있다.
- 이름이 없기 때문에 이름을 쓸 일이 있다면(
instanceof
등) 적합하지 않다. - 단 한 곳에만 쓰임 + 해당 타입으로 쓰기에 적합한 클래스나 인터페이스가 이미 존재할 때 사용
- 가독성을 위해 짧게 작성해야 한다.
- 람다로 대체 가능한 경우도 있다.
- 가장 드물게 사용된다.
- 이름이 있고 반복적으로 사용이 가능하다.
- 지역 변수를 선언할 수 있는 곳이라면 어디든 선언할 수 있다.
- 가독성을 위해 짧게 작성해야 한다.
- 단 한 곳에만 쓰임 + 적합한 클래스나 인터페이스가 없을 때 사용
- static 멤버 클래스: 바깥 클래스에 접근할 일이 없을 때
- nonstatic 멤버 클래스: 바깥 클래스의 인스턴스를 참조할 때
- 익명 클래스: 한 곳에서만 쓰이고 해당 타입의 클래스, 인터페이스가 이미 있을 때
- 지역 클래스: 한 곳에서만 쓰이고 해당 타입의 클래스, 인터페이스가 없을 때