7.5 중첩 클래스
class OuterClass { // 외부 클래스
...
class NestedClass { // 내부 클래스
...
}
}
=> 클래스 내 클래스 정의 가능
1) 정적 중첩 클래스
2) 비정적 중첩 클래스
내부 클래스
지역 클래스
익명 클래스
정적 중첩 클래스
: 앞에 static이 붙어서 내장되는 클래스
비정적 중첩 클래스
: static이 붙지 않은 일반적인 중첩 클래스
•내부 클래스 : 클래스의 멤버처럼 선언됨.
•지역 클래스 : 메소드의 몸체 안에서 선언됨.
•익명 클래스 : 수식의 중간에서 선언되고 바로 객체화됨.
내부 클래스
-public, private, protected, package(default) 모두 사용 가능.
•장점
-외부 클래스의 인스턴스 변수와 메소드를 모두 사용 가능. (private으로 돼있어도 접근 가능)
class OuterClass {
private int value = 10;
class InnerClass {
public void myMethod() {
System.out.println("외부 클래스의 private 변수 값: " + value);
}
}
OuterClass() {
InnerClass obj = new InnerClass();
obj.myMethod();
}
}
출력
외부 클래스의 private 변수 값: 10
=> 이처럼 외부 클래스의 생성자에서 내부 클래스의 객체를 생성한 경우, 그냥 내부 클래스의 이름을 그대로 사용하면 된다.
만약, 외부 클래스의 바깥에서 내부 클래스의 객체를 생성하려면
외부 클래스의 객체를 먼저 생성해주어야 내부 클래스의 객체 역시 생성이 가능하다.
(내부 클래스도 외부 클래스의 인스턴스 멤버이기 때문.)
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass(); // outer 객체 안에 정의된 InnerClass라는 의미가 됨.
: 메소드 안에 정의되는 클래스.
-접근 제어 지정자를 가질 수 없다.
-abstract 또는 final로만 지정이 가능하다.
•장점
-지역 클래스는 외부 클래스의 인스턴스 변수뿐만 아니라, 메소드의 지역 변수에도 접근할 수 있음.
*지역변수는 반드시 final로 선언되어야 함.
void outerMethod() {
int num = 10; // 지역 변수
class LocalClass {
void print() {
System.out.println(num); // 지역 변수 접근
}
}
new LocalClass().print();
}
=> 지역 클래스 인스턴스의 생명 주기가 메소드보다 길 수 있기 때문에
지역 변수의 복사본을 지역 클래스에 저장해둠.
이때 원본이 바뀌면 안 되기 때문에 지역변수(num)를 final로 선언해야 한다.
java 8부터는 명시적으로 쓰지 않아도, 값이 한 번만 할당되면 자동으로 final로 간주한다.
-외부 클래스의 멤버가 private으로 선언되어 있더라도 접근 가능
-외부에서 보이지 않음 (정보 은닉)
-익명 클래스는 콜백 메소드??를 작성할 때 아주 편리함