내부 클래스(Inner class) (= 중첩 클래스)

클래스 내부에 선언된 클래스를 말하며, 이 클래스를 감싸고 있는 외부 클래스와 연관이 있는 경우가 많다.
다른 외부 클래스에서 사용할 일이 거의 없는 경우에 내부 클래스로 선언해서 사용한다.
내부 클래스는 private으로 선언해서 사용하는것을 권장한다! 어차피 내부에서만 사용하므로 외부클래스에서 접근이 불가하도록 하는것이 좋다.
내부 클래스에서는 외부클래스의 private 필드의 사용이 가능하다.

내부 클래스의 종류

  • 인스턴스(instance) 내부 클래스
  • 정적(static) 내부 클래스
  • 지역(local) 내부 클래스
  • 익명(anonymous) 내부 클래스 -> 현재 제일 많이 활용되는 내부클래스!

인스턴스 내부 클래스

외부 클래스가 실행되고나서 내부클래스가 실행된다. 그래서 내부 클래스에는 static 전역변수 사용이 불가능하다.

class OutClass{
    class InClass{

    }
}

정적 내부 클래스

외부 클래스 생성과 무관하게 사용할 수 있다. 외부 클래스의 인스턴스 변수는 정적 내부 클래스 안의 메소드에서는 사용이 불가능하다. 내부 클래스의 인스턴스 변수는 사용이 가능함!

class OutClass{
    static class InClass{
        
    }
}

지역 내부 클래스

메소드 내부에서 정의하여 사용하는 클래스. 내부 메소드의 호출이 끝나면 메소드에 사용된 지역변수의 유효성이 사라진다. 정적 필드와 메소드는 선언할 수 없다.

void method{
    class InClass{
      void mehod{

      }   
    }
}

익명 내부 클래스

이름이 없는 클래스.
클래스의 이름을 생략하고 인터페이스나 추상클래스를 구현해서 반환한다.
인터페이스나 추상 클래스 자료형의 변수에 직접 대입하여 클래스를 생성하거나 지역 내부 클래스의 메소드 내부에서 생성하여 반환할 수 있다.