내부클래스란 클래스 내에 또 다른 클래스가 정의 된 것을 의미합니다.
내부클래스를 이용하면 내부클래스에서 외부클래스의 멤버돌을 쉽게 접근할 수가 있습니다.
내부클래스는 종류와 특징만 정리 하겠습니다.
내부클래스는 변수의 종류와 마찬가지로 선언 위치에 따라 4가지 종류가 있습니다.
- 외부클래스의 멤버변수의 위치에 선언합니다.
InnerClassDemo.java
| public class InnerClassDemo { public static void main(String[] args) { Outter ot = new Outter(); Outter.Inner in = ot.new Inner(); //Inner클래스에 접근하기 //Outter.Inner in = new Outter().new Inner(); in.method_A(); } } | cs |
Outter.java
| public class Outter { // 외부클래스 int val = 100; public class Inner{ // 내부클래스 int val = 20; public void method_A(){ int val =30; System.out.println(val); // 30 System.out.println(this.val); // 20 System.out.println(Outter.this.val); // 100 } } } | cs |
- 인스턴스 클래스와 마찬가지로 외부클래스의 멤버변수의 위치에 선언합니다.
- 내부클래스안에 static변수를 가지고 있다면 어쩔 수 없이 내부클래스는 static으로 선언이 되어야 합니다.
InnerClassDemo_1.java
| public class InnerClassDemo_1 { public static void main(String[] args) { System.out.println(Outter_1.Inner_1.val); // 100 Outter_1.Inner_1 c = new Outter_1.Inner_1(); System.out.println(c.val_1); // 50 } } | cs |
Outter_1.java
| public class Outter_1 { //내부 클래스인 Inner_1클래스안에 static변수가 존재하므로 static 내부클래스로 정의 static class Inner_1{ static int val = 100; int val_1 = 50; } } | cs |
- 메소드 안에서 정의되는 클래스입니다. 즉, 메소드 안에서 선언되는 지역변수와 같은 것이죠.
InnerClassDemo_3.java
| public class InnerClassDemo_2 { public static void main(String[] args) { Outter_2 ot2 = new Outter_2(); ot2.test(); } } | cs |
Outter_2.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class Outter_2 { int val = 30; public void test(){ int val = 40; class Inner_2{ int val = 50; public void result(){ System.out.println(val); System.out.println(Outter_2.this.val); // 내부메소드가 있는 메소드의 지역변수는 호출을 할 수 없다. } } Inner_2 i = new Inner_2(); i.result(); } } | cs |
- 이름이 없는 클래스 입니다.( 일회용 )
- 클래스의 선언과 객체의 생성을 동시에 하며, 하나의 객체만을 생성하는 일회용 클래스입니다.
저는 처음봤을때 왜 이렇게 생겼나 했습니다.. 처음 보는거라 많이 어색하더군요;
AnonymousDemo.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public class AnonymousDemo { public static void main(String[] args) { class Test extends Overriding{ public void method(){ System.out.println("내부클래스 Test에서 method()재정의"); } } Test t = new Test(); t.method(); // 익명내부클래스 Overriding od = new Overriding(){ public void method(){ System.out.println("익명내부클래스에서의 method()재정의"); } }; // 세미콜론!! od.method(); } } class Overriding{ public void method(){ System.out.println("Overriding클래스의 method()입니다."); } } | cs |
12번라인부터 16번라인을 잘 봐야합니다.