중첩 클래스(Nested Class)

Language/Java Language
대표 클래스가 공통적인 속성 값만을 가지고 나머지 각기 다른 중첩된 클래스에서 관리하도록 만들기 위해서 중첩 클래스(Nested Class)의 필요성이 생긴다.

예)
class Person{
	private String name;
	private String jumin;
	
	.....
	
	class Grade {
		private int kor, eng, math, total;
		private float average;
	
		.....

	}
}



중첩클래스의 접근 방법


Person person = new Person(); // 외부 클래스(Outer Class) 객체 생성
Person.Grade grade = person.new Inner(); // 내부 클래스(Inner Class) 객체 생성



중첩클래스에서의 내부클래스에서 멤버 접근 법

class Outer{
	private static int x = 1;
	class Inner{
		private int x = 2;
		public void func(){
			System.out.println(Outer.x); // 1 출력
			System.out.println(this.x); // 2 출력
		}
	}
}


정적 중첩 클래스

일반 중첩 클래스와는 달리 Outer클래스의 객체가 없어도 Inner클래스의 객체를 만들 수 있다.
Outer.Inner temp = new Outer.Inner();


정적 중첩클래스는 내부 클래스에 static이라는 예약어만 붙이면 된다.
Outer.Inner 객체 = new Outer.Inner();


지역 중첩 클래스

메서드를 실행할 때에만 필요하고 별로 사용할 경우가 없다면 굳이 외부에 드러나는 형태로 만들 필요가 없다. 그래서 특정 메서드에 한정적인 용도로 사용할 클래스로 지역 중첩 클래스라는 개념이 생겼다. 하지만 이 경우에는 접근 제한자(private, protected, package, public)와 지정 예약어를 사용할 수 없는 형태이다. 그 외에 나머지 기능은 클래스와 동일하다.

지정 예약어
필드
: static, final, static final, transient
메서드 : static, final, static final, abstract, synchronized, native

public class Outer{
	public static void main(String[] ar) {
		int x = 100;
		class Inner{
			int y = 200;
		}
		Inner in = new Inner();
		System.out.println(x);
		System.out.println(in.y);
	}
}




익명 중첩 클래스

지역 중첩클래스의 변형된 형태라 할 수 있다.
class라는 예약어와 클래스명을 가지지 않고 단지 인스턴스의 생성과 내용부의 정의만 가진다.
중첩 클래스는 이미 기존에 존재하는 것이어야 한다.

class Inner{
	int y = 200;
	public Inner(){
		this.disp();
	}
	public void disp(){}
}

public class abc{
	public static void main(String[] ar) {
		final int x = 100; // final이 아닌 경우 compile-error
		new Inner(){
			public void disp(){
				System.out.println("Default 생성자");
				System.out.println("x = " + x);
				System.out.println("y = " + y);
			}
		};
	}
}

 

참조 : 열혈강의 JAVA 프로그래밍

'Language > Java Language' 카테고리의 다른 글

Eclipse .class 파일 build path 에 추가할 때  (0) 2015.03.17
Promotion, Casting  (2) 2011.02.11