🔸 클래스 내에 선언된 클래스
- 내부클래스에서 외부클래스의 멤버에 쉽게 접근할 수 있다.
- 불필요한 코드를 감춤으로써 코드를 간결하게 할 수 있다.
🔸 내부클래스의 종류는 변수의 선언위치에 따른 종류와 동일하다.
🔸 내부클래스는 변수와 비슷한 성질과 유효범위를 가진다.
- 인스턴스 클래스 : 외부 클래스 멤버변수 선언위치에 선언, 외부클래스의 인스턴스 멤버와 관련된 작업에 사용
- static 클래스 : 외부 클래스 멤버변수 선언위치에 선언, 외부클래스의 static클래스, 메서드에서 사용
- 지역 클래스 : 외부 클래스의 메서드 혹은 초기화 블럭 내에 선언, 선언된 영역 안에서만 사용
- 익명클래스 : 이름없는 일회용 클래스, 클래스의 선언과 객체의 생성을 동시에 함
/* 외부클래스 */ class Outer{ /* 내부클래스 */ class InstanceInner{} // 인스턴스 클래스 static class StaticInner{} // static클래스 void myMethod(){ class LocalInner{} // 지역클래스 } }
🔸 내부클래스도 일반클래스와 마찬가지로 abstract, final등의 제어자, public, private등의 접근제어자도 사용 가능하다
class Outer{ private class InstanceInner{} protected static class StaticInner{} void myMethod(){ class LocalInner{} } }
🔸 static변수는 static클래스 내에서만 선언이 가능하다
🔸 final과 static이 같이 붙은 경우는 상수이기 때문에 모든 내부클래스에서 정의할 수 있다.
🔸 내부클래스는 변수와 비슷한 유효범위와 성질을 가진다고 했다
➡️ 변수는
🔸 인스턴스 멤버는 같은 클래스에 있는 인스턴스 멤버, static멤버 모두 직접 호출 가능
🔸 static멤버는 인스턴스 멤버를 호출할 수 없음.
➡️ 내부클래스도 변수와 마찬가지로
🔸 인스턴스 클래스는 외부 클래스의 인스턴스 멤버와 static클래스를 객체 생성없이 바로 사용할 수 있음
🔸 static 클래스는 외부 클래스의 인스턴스 멤버와 인스턴스 클래스를 객체 생성없이 사용할 수 없음class Outer{ int value = 50; // Outer.this.value class Inner{ int value = 100; // this.value void method(){ int value = 200; System.out.prinln("value = " + value); System.out.prinln("this.value = " + this.value); System.out.prinln("Outer.this.value = " + Outer.this.value); } } class InstanceInner{ int iv = 100; } static class StaticClass{ int iv = 200; static int cv = 300; } void myMethod(){ class LocalClass{ int iv = 400; } } } class Test{ public static void main(String[] args){ // 인스턴스의 인스턴스를 생성하려면 외부클래스의 인스턴스를 먼저 생성해야한다. Outer outer = new Outer(); // 내부클래스 객체생성 Outer.InstanceInner instanceInner = outer.new InstanceInner(); Outer.Inner inner = Outer.new Inner(); System.out.println(instanceInner.iv); inner.method(); // static클래스는 외부클래스를 먼저 생성하지 않아도 사용가능함. Outer.StaticInner staticInner = new Outer.StaticInner(); System.out.println(staticInner.iv); } }
🔸 이름이 없기 때문에 단 한번만 사용할 수 있고, 하나의 객체만을 생성할 수 있는 일회용. 생성자 또한 가질 수 없다.
new 조상클래스 이름 or 구현인터페이스 이름(){ ... }
class Test{ public static void main(String[] args){ Button button = new Button("시작"); button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ac){ System.out.println("이벤트발생"); } } // 익명 클래스 끝 ); } }