Develop/JAVA

자바 내부클래스

soleil.ardent 2011. 12. 6. 08:34

JAVA Inner class

일단 내부 클래스를 정리하기 앞서 부족한 점이 있으면 알려주세요~

자 그럼 Start~

일단 내부클래스 모양부터 한번 살짝 보자고요~ 

// 내부 클래스에서 외부 클래스 변수를 사용  

// class 안에 class 가 있죠~ 요래서 내부 외부 클래스~ ㅎ
class MyOuterClass {
	private int x; // 외부 클래스의 인스턴스 변수 x

	class MyInnerClass {
		void go() {
			x = 7; // x 를 내부 클래스의 변수처럼 사용
		}
	} // 내부 클래스 끝
} // 외부 클래스 끝

Instance (인스턴스) - 일반적으로 어떤 집합에 대해서, 그 집합의 개별적인 요소. - naver

내부클래스는 위에서 노는것 처럼 외부의 인스턴스를 내부에서 가져다 쓰는군요~ 좋다~ ㅎ

그렇다면 외부에서 내부 클래스의 인스턴스를 가지고 놀려면??

class MyOuterClass {
	private int x;
	
	// 내부 클래스의 인스턴스를 만듭니다.
	MyInnerClass inner = new MyInnerClass(); 

	public void check() {
		// 외부 클래스의 check 호출시 x 값 출력
		System.out.printf(" I'm Outer Class :D and x = %d ", x); 
		inner.print(); // 내부 클래스의 메소드를 호출!!
	}

	class MyInnerClass {
		void print() {
			x = 10; // x 를 내부 클래스의 변수처럼 사용
			// 내부 클래스의 print 호출시 x 값 출력
			System.out.printf(" I'm Inner Class :D and x = %d ", x); 
		}
	} // 내부 클래스 끝

	public static void main(String args[]) {
		MyOuterClass outcl = new MyOuterClass();
		outcl.check();
	}
} // 외부 클래스 끝

결과값 :

 I'm Outer Class :D and x = 0
 I'm Inner Class :D and x = 10 
 

위의 소스를 작성하다보니 느낀점이 한가지 작업에 대한 다양한 기능을 부여 할 때 편하겠다라는 생각이 드네요~

내부 클래스는 이벤트 처리에서 특히 내부 클래스의 개념이 많이 사용되는것을 알 수 있었습니다.

 

내부 클래스 특징

1. 반드시 인스턴스를 생성해야한다.

2. 내부 맴버 클래스는 외부 클래스의 맴버 변수와 메서드에 접근이 가능하다.

3. 외부 클래스의 인스턴스가 먼저 생성되어야 한다.

 

일반적으로 자바 클래스에서 한 메소드를 2번 이상 구현 할 수 없습니다... ok?

그런데 내부 클래스를 사용하여 여러 번 구현 할 수 있죠~!

그런데 왜 쓰는거지?
예로 이벤트 핸들러를 생각해보면, 버튼 세개가 있는데 각각 서로 다른 기능을 구현하기 위해서 ActionListener를 구현하는 내부 클래스 세개를 만들면 각 클래스마다 다른 기능이 구현 가능합니다.

Dog 면서 동시에 Button 일 수는 없다. A는 B다 성립이 안됨.

하지만 Dog 객체가 때때로 Button 역할을 해야 한다면 ??

Dog 클래스에 Button 클래스를 확장해서 Dog 대신 Button 역할을 하는 내부 클래스를 집어 넣으면 된다.

그리고 Button 이 필요할 때마다  Dog 에서는 그 내부 객체인 Button 객체를 대신 보내면 된다.

x.takeButton(this) 대신 Dog 객체에서 x.takeButton(new MyInnweButton()) 와 같은 방식으로 하면 된다.

-HeadFirst