2013. 12. 19. 23:17

Java 자바 4대 중첩클래스 (instance class, static class, local class, anonymous class)

 

1. 일반 중첩클래스

 

중첩클래스는 효율적인 관리를 위한 하나의 형식이다. 프로그램에서는 하나의 대표 클래스 내에 다른 클래스들을 넣어 관리할 수 있는 형식을 제공한다. 그것은 대표 클래스가 그들 모두에 있어 공통적인 속성 값만 가지고 나머지는 각기 다른 중첩 클래스에서 관리하도록 만드는 것이다. 즉, 중첩클래스란 하나의 클래스 내부에 또 다른 클래스를 사용할 수 있는 것이다. 당연히 중첩되는 클래스는 하나 이상일 수 있다.

 

그렇다면 클래스 외부에서 중첩클래스 내부의 멤버들에는 어떻게 접근할까? 우선 바깥쪾에 있는 클래슬 Outer

클래스라 하고 안쪽에 있는 클래슬 Inner클래스라 하자. 

 

■ 중첩클래스 접근 형식

Outer 객체1 = new Outer();  <=Outer클래스 객체 생성 방법

Outer.Inner 객체 2 = 객체 1.new Inner(); <=Inner클래스 객체 생성 방법

 

간단한 코딩을 통해 내부 멤버에 접근해 보자.

 

 

 

 

여기서 중첩 클래스에는 각각 Outter클래스에 x의 멤버를 Inner클래스에는 y의 멤버를 배치해 두었다. 각 데이터를 사용하는 방법은 x는 Outter클래스 멤버이기 때문에 Outer클래스의 객체를 발생시키고, y는 Inner클래스 멤버이기 때문에 Inner클래스 객체를 발생시켜 접근하면 된다.

 

또한 Inner클래스에서는 Outer클래스의 멤버를 이용할 수 있다. 아래 코딩을 보면 객체 생성없이 바로 Inner클래스에서 Outter클래스의 멤버를 이용할수 있음을 알 수 있다.

 

 

 

 

 하지만 Outer클래스에서는 Inner클래스의 멤버를 사용할 수 없다.

사용하고 싶다면 객체를 직접 발생시켜야 한다 . 다음 코딩을 보면 Outer클래스 Inner클래스를 사용하기

위해서 객체를 발생시키는걸 알 수 있다.

 

 

 

 

 

 

 

2. 정적 중첩 클래스

 

다음으로 살펴볼 것은 중첩 클래스 내부에서 static과 관련된 멤버를 선안할 수 있는 클래스이다.

이것은 단순히 클래스 이름 앞에 static이라는 예약어만 붙이면 되고, 이런 클래스를 정적(static)

중첩 클래스라고 한다.

 

class Outer{

     static class Inner{

...........

}

}

 

정적 중첩클래스는 static의 특성상 객체를 독립적으로 만들 수 있다.

 

■ 정적 중첩클래스의 객체 생성 방법

Outer.Inner  객체 = new Outer.Inner();

 

일반 중첩 클래스와 달리 Outer클래스의 객체가 없어도 Inner클래스의 객체를 만들 수 있다. 또한 static멤버를

선언할 수 있고, static메서드도 만들어 사용할 수 있다. 그래서 반드시 Inner클래스에 static을 선언하여 사용하고

싶다면 정적 중첩클래스를 사용해야 한다. 또한 객체의 선언 방식은 일반 중첩클래스의 객체 선언 방식을 사용할 수 없고 위와 같이 Outer.Inner 객체 = newr Outer.Inner(); 로만 객체를 발생시킬 수 있다. 문제는 Outer클래스의 멤버를 끌어다 쓰는 것이 문제인데, 끌어다 쓰려는 Outer클래스의 멤버가 static인 경우에만 사용할 수 있다.

 

그렇다면 만인 main()메서드를 Inner클래스에 사용하고 싶다면 어떻게 해야 할까? 먼저 main()메서드는 그 자체가 static이기 때문에 정적 중첩 클래스를 사용해야 한다.

 

 

 

 

3. 지역 중첩 클래스

 

일반적으로 클래스라는 것은 재상용을 염두해 두고 만들어진 것인데 이런 클래스가 특정 메서드를 실행할 때에만 필요하고 별로 사용할 경우가 없다면 그것을 굳이 외부에 드러나는 형태로 만들 필요는 없을 것이다. 그래서 특정 메서드에 한정적인 용도로 사용할 클래스로 지역 중첩 클래스라는 개념이 등장하였다. 그러나 이 경우는 접근 제한자와 지정 예약어를 사용할 수 없는 형태이다.

 

 

 

위의 코딩을 보면 main()메서드 안에 Inner클래스가 들어가 있는 상황이다. 여기서 만일 일반 중첩 클래스처럼 main()메서드의 멤버인 x를 사용하려면 그 멤버는 반드시 final로 선언되어 있어야 한다.

 

 

4. 익명 중첩 클래스

 

익명 중첩 클래슨느 지역 중첩 클래스의 변형된 형태라고 할 수 있다. 이것은 이름에서 알 수 있듯이 class라는 예약어와 클래스명을 가지지 않고 단지 instance의 생성과 내용부의 정의만 가진다. 한가지 주의할 점은 여기에 사용되는 중첩 클래스는 이미 기존에 존재하는 것이어야 한다. 또한 이 내부에서 사용할 수 있는 외부 멤버도 역시 final로 선언되어 있어야 한다.

 

 


출저: http://kwy1052.tistory.com/41?viewbar

Posted by hoonihoon