-
[JAVA 34] 내부 클래스 ( Inner Class )Language/Java 2018. 2. 19. 14:24반응형
■ Inner Class ( 내부 클래스 )
1. 클래스 내부에 정의되는 클래스
2. 특징
1) 사용목적
외부클래스의 멤버변수나 메소드 (= 자원 )를 ' 자신의 자원 ' 처럼 이용하기 위해서 사용한다.
12345678910111213141516171819202122232425262728293031323334353637class 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); // 외부클래스의 멤버 변수 am1(); // 외부 클래스의 메소드}}}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 > 라는 이름으로 파일이 생성된다.
123456789101112131415161718class 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 1234567891011121314151617class 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()); // 외부클래스의 멤버변수 aout2.m1(); // 외부클래스의 메소드 m2();}}cs 2) 모든 접근 제한자가 올 수 있다.
3) static 은 접두 할 수 없다.
4) 내부 클래스 안의 static 자원이 하나라도 있다면, static 내부 클래스가 되어야 한다.
( 내부 클래스 안에 main() 메소드가 존재 하기 위해서는 static 내부 클래스어야 한다. )
1234567891011121314151617181920212223242526class OutterClass5{ // OutterClass Study 1static 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 내부클래스();
123456789101112131415161718192021222324class 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) 내부 인터페이스
클래스 또는 인터페이스 내부에 정의되는 인터페이스를 말한다.
12345678910111213141516171819202122232425class 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 반응형'Language > Java' 카테고리의 다른 글
[JAVA 36] 자바 입출력 ( IO ( Input / Output )) (4) 2018.02.23 [JAVA 35] 자바 쓰레드 ( Thread ) (0) 2018.02.20 [JAVA 33] 자바 패키지 ( package ) (0) 2018.02.17 [JAVA 32] 자바 예외처리 ( Exception / throws ) try{}catch(){}finally{} (0) 2018.02.17 [JAVA 31] 자바 인터페이스 ( Interface ) (0) 2018.02.14