java #19 내부클래스, 중첩클래스, 지역클래스, 익명클래스
* inner class
- Event를 처리하기 위하여 만들어진 클래스
- 클래스안에 정의되는 클래스
- 아래 4가지 형태가 있음.
- 내부클래스(inner class)
- 중첩클래스(nested class)
- 지역클래스(local class)
- 익명클래스(anonymous inner class)
1. 내부 클래스(inner class)
가. 정의
- 안쪽 클래스를 인스턴스 변수처럼 사용하기 위하여 사용한다.
class outer
|
- 바깥 클래스에서 안쪽 클래스를 사용하려면 바깥 클래스의 객체 사용하여 안쪽 클래스를 객체화하고 그 객체로 안쪽 클래스의 자원을 사용한다.
- 안쪽 클래스에서 바깥쪽 클래스의 자원(변수와 메소드)을 직접 사용가능하다. 하지만 바깥쪽 클래스에서 안쪽 클래스의 자원을 사용하려면 반드시 바깥 클래스에서 안쪽 클래스를 객체화하여야만 사용 가능하다.
나. 사용법
- 객체화 하여 사용한다.
다. 예제
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 | package day0226; /** * 안쪽 클래스를 인스턴스변수처럼 사용할 수 있는 InnerClass의 사용 */ public class TestInner { int i; public TestInner() { System.out.println("바깥클래스 생성자"); }// TestInner public void outMethod() { System.out.println("바깥클래스의 메서드"); } // //////////Inner Class의 시작////////////// public class Inner { int j; public Inner() { System.out.println("안쪽클래스의 생성자"); }// Inner public void inMethod() { System.out.println("안쪽클래스의 메서드"); System.out.println("안쪽메서드 바깥변수 i="+i); } }// class // //////////Inner Class의 끝////////////// public static void main(String[] args) { TestInner ti = new TestInner(); ti.i = 10; // ti.j=10;//안쪽 클래스의 변수는 직접 사용 불가능 // ti.inMethod(); //안쪽 클래스의 메서드는 직접 사용 불가능 // 바깥클래스에서 안쪽클래스의 자원을 사용하려면 안쪽클래스를 // 객체화하여 사용 TestInner.Inner in = ti.new Inner(); // 안쪽 클래스의 자원 사용 in.j = 100; in.inMethod(); }// main }// class | cs |
2. Nested Class(중첩클래스)
가. 정의
- 안쪽 클래스를 static 변수처럼 사용
- 안쪽 클래스 정의시 static 붙여서 정의한다.
- 바깥클래스 instance 영역은 사용할 수 없다.
- 안쪽 클래스는 객체화하지 않고 사용한다.(static)
class outer
|
나. 사용법
- 안쪽 클래스는 객체화하여 사용하지 않는다.(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 27 28 29 30 31 32 33 34 35 36 37 38 | package day0226; /** * 안쪽 클래스를 static 변수처럼 사용하는 중첩 클래스의 사용 * */ public class TestNested { int i; static int j; public TestNested(){ System.out.println("바깥클래스의 생성자"); }//TestNested public void outMethod(){ System.out.println("인스턴스메서드"); }//outMethod public static void outStaticMethod(){ System.out.println("바깥 클래스의 스태틱메서드"); }//outstaticMethod ///////////중첩클래스 시작//////////// static class Nested{ static int k; public Nested(){ System.out.println("안쪽생성자"); }//Nested public static void inMethod(){ //i=10; //static영역에서는 instance 영역의 자원을 직접 사용할 수 없음. System.out.println("안쪽 메서드"); TestNested.j=10; // = "j=10;" //outMethod(); //static영역에서는 instance 영역의 자원을 직접 사용할 수 없음. TestNested.outStaticMethod(); // = outStaticMethod(); }//inMethod }//class ///////////중첩클래스 끝//////////// public static void main(String[] args) { //안쪽클래스의 자원 사용 Nested.k=10; Nested.inMethod(); } } | cs |
3. 지역클래스(Local Class)
가. 정의
- 메소드 안에 클래스를 정의할 때
- 메소드 내부에서만 지역변수처럼 클래스를 사용할 때
- 지역클래스는 instance변수, method를 사용할 수 있지만 지역변수, parameter는 final이 붙은 것만 사용할 수 있다.
- 메소드 내부에서만 지역변수처럼 클래스를 사용할 때
- 지역클래스는 instance변수, method를 사용할 수 있지만 지역변수, parameter는 final이 붙은 것만 사용할 수 있다.
- 메소드 바깥에서 사용할 수 없다.(지역변수처럼)
class outer
|
나. 예제
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 38 39 40 41 | package day0226; public class TestLocal { int out_i; public TestLocal(){ System.out.println("바깥 클래스의 생성자"); }//TestLocal public void method(int param_i, final int param_j){ int local_i=0; final int local_j=0; ///////지역클래스 시작////// //바깥클래스명$1안쪽클래스명.class class Local{ int i; public Local(){ System.out.println("지역클래스의 생성자"); }//local public void localMethod(){ System.out.println("바깥클래스의 인스턴스변수"+out_i); //final이 붙어있지 않은 파라메터는 지역클래스에서 사용할 수 없다. //System.out.println("파라메터 param_i="+param_i); System.out.println("파라메터 param_j="+param_j); //final이 붙어있지 않은 클래스는 지역클래스에서 사용할 수 없다. //System.out.println("지역변수 local_i"+local_i); System.out.println("지역변수 local_j="+local_j); System.out.println("지역클래스의 메소드"); }//localMethod }//class Local local = new Local(); local.i=10; local.localMethod(); }//method public static void main(String[] args) { TestLocal tl = new TestLocal(); tl.method(100,200); } } | cs |
4. 익명 클래스(anonymous innerclass)
가. 정의
- 클래스를 값(arguments:메서드 호출시 넣어주는 값)으로 사용하는 클래스
나. 사용법
1 2 3 4 5 6 7 8 9 10 11 12 | method명(new 부모클래스명(){ 메서드 정의 }); ---------------------------- Test t=new Test(); 부모 t.useT(new In(){ 이름이 없는 자식클래스 }); ------------------------ - compile 하면 바깥클래스명$1.class, 바깥클래스명$2.class,... 생성됨 | cs |
다. 예제
interface Fly |
| |||
Fly를 구현하는 클래스 |
|
|
'컴퓨터 관련 > JAVA 강의' 카테고리의 다른 글
java #21 꼭 알아야 할 클래스와 메소드-2- (날짜, 포메터 관련) (0) | 2016.12.18 |
---|---|
java #20 꼭 알아야 할 클래스와 메소드-1- (문자열 관련) (0) | 2016.12.18 |
java #18 개선된 for문 (0) | 2016.12.18 |
java #17 배열(array) (0) | 2016.12.18 |
java #16 문자열, String클래스 메소드 (0) | 2016.12.18 |