Language/Java
[JAVA 34] 내부 클래스 ( Inner Class )
reifier.tistory.com 으로 이전하였습니다.
2018. 2. 19. 14:24
반응형
■ Inner Class ( 내부 클래스 )
1. 클래스 내부에 정의되는 클래스
2. 특징
1) 사용목적
외부클래스의 멤버변수나 메소드 (= 자원 )를 ' 자신의 자원 ' 처럼 이용하기 위해서 사용한다.
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 26 27 28 29 30 31 32 33 34 35 36 37 | class OutterClass1{ private int a = 10; OutterClass1(){ System.out.println("외부클래스의 생성자()"); } private void m1(){ System.out.println("외부클래스의 m1()"); } class InnerClass1{ int b = 20; InnerClass1(){ System.out.println("내부클래스의 생성자()"); } void m2(){ System.out.println("내부클래스의 m2()"); System.out.println(" a : " + a); // 외부클래스의 멤버 변수 a m1(); // 외부 클래스의 메소드 } } } class User1{ public static void main(String[] args){ OutterClass1 out1 = new OutterClass1(); // 외부클래스 객체 생성 OutterClass1.InnerClass1 oi1 = out1.new InnerClass1(); // 외부클래스.내부클래스 객체명 = 외부클래스 객체.new 내부클래스(); System.out.println(" b : " + oi1.b); oi1.m2(); } } | cs |
내부클래스가 있을때 컴파일을 하면,
< 외부클래스명$내부클래스명.class > 라는 이름으로 파일이 생성된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class OutterClass2 { private int a = 10; OutterClass2(){ System.out.println("외부클래스 생성자()"); InnerClass2 in2 = new InnerClass2(this); in2.m2(); } void m1(){ System.out.println("외부클래스 m1()"); } int getA(){ return a; } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class InnerClass2{ int b = 20; OutterClass2 out2; InnerClass2(OutterClass2 out2){ System.out.println("내부클래스 생성자()"); this.out2 = out2; } void m2(){ System.out.println("내부클래스 m2()"); System.out.println(" a : " + out2.getA()); // 외부클래스의 멤버변수 a out2.m1(); // 외부클래스의 메소드 m2(); } } | cs |
2) 모든 접근 제한자가 올 수 있다.
3) static 은 접두 할 수 없다.
4) 내부 클래스 안의 static 자원이 하나라도 있다면, static 내부 클래스가 되어야 한다.
( 내부 클래스 안에 main() 메소드가 존재 하기 위해서는 static 내부 클래스어야 한다. )
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 26 | class OutterClass5{ // OutterClass Study 1 static interface InnerInterface{ int a = 20; void m(); } static class InnerClass5 implements InnerInterface{ public void m(){ System.out.println("1. 내부클래스 m() 오버라이딩"); } } } class User5{ public static void main(String[] args){ OutterClass5.InnerClass5 oi5 = new OutterClass5.InnerClass5(){ public void m(){ System.out.println("2. 메인 m() 오버라이딩"); } }; System.out.println("내부 인터페이스 a : " + oi5.a); oi5.m(); } } | cs |
5) 내부 클래스의 객체 생성 방법
(1) static 내부 클래스
외부클래스.내부클래스 객체명 = new 외부클래스.내부클래스();
(2) 일반 내부 클래스
외부클래스.내부클래스 객체명 = 외부클래스객체.new 내부클래스();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | class OutterClass3{ int a = 10; static class InnerClass3{ static int b = 20; int c = 30; static void m(){ System.out.println(" a : " + new OutterClass3().a); } } } class User3{ public static void main(String[] args){ OutterClass3.InnerClass3 oi3 = new OutterClass3.InnerClass3(); OutterClass3.InnerClass3.m(); oi3.m(); System.out.println(" b : " + OutterClass3.InnerClass3.b); System.out.println(" c : " + oi3.c); } } | cs |
OutterClass3.InnerClass3.m();
oi3.m();
위의 2개는 a : 10 이라는 같은 결과를 도출한다.
6) 내부 인터페이스
클래스 또는 인터페이스 내부에 정의되는 인터페이스를 말한다.
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 | class OutterClass4{ interface InnerInterface{ int a = 10; void m(); } class InnerClass4 implements InnerInterface{ public void m(){ System.out.println("내부인터페이스 m() 오버라이딩"); } } } class User4{ public static void main(String[] args){ OutterClass4 oc4 = new OutterClass4(); OutterClass4.InnerClass4 oi4 = oc4.new InnerClass4(); OutterClass4.InnerInterface oif = (OutterClass4.InnerInterface)oi4; System.out.println(" a : " + oif.a); oif.m(); } } | cs |
반응형