[Java] 4대 중첩 클래스(nested class)
정리
중첩 클래스
- 클래스안에 또다른 클래스가 정의되는 것
- 특정 클래스를 자신의 클래스 내부적인 용도로만 사용하고자 할때 효율적
- 중첩클래스를 포함하는 외부 클래스를 Outer 클래스라고 하며 내부에 포함된 클래스를 중첩클래스 또는 Inner 클래스라고 함.
Inner 클래스의 특징
- Outer 클래스의 멤버를 마치 자신의 멤버처럼 사용할 수 있다. 접근지정자가 private 라고 해도 접근 가능
- Inner 클래스 안에는 static 변수를 선언할 수 없다. 단, static Inner 클래스는 선언 가능
- Inner 클래스의 접근은 반드시 Outer 클래스를 통해서 접근 할 수 있다. 단, static Inner 를래스는 바로 접근 가능
- 소스파일을 컴파일하면 Outer$Inner.class 형식으로 생성
Inner 클래스 종류
구분 | 설명 |
---|---|
member | Outer 클래스의 멤버변수나 메소드처럼 클래스가 정의된 경우 |
local | Outer 클래스의 특정 메소드안에서 클래스가 정의된 경우 |
static | static 키워드를 이용해서 클래스가 정의된 경우 |
anonymous | 익명 클래스를 이용해서 클래스가 정의된 경우 |
member Inner 클래스
- 객체를 생성해야만 사용할 수 있는 멤버들과 같은 형태로 정의한 클래스
- Inner 클래스를 사용하기 위해서는 반드시 Outer 클래스를 객체 생성해야 함
member Inner 클래스 형식
public class Outer {
...
class Inner{
}
...
}
member Inner 클래스 사용예
public class Outer {
int a = 10;
private int b = 20;
static int c = 30;
// Inner class
class Inner {
public void print() {
System.out.println(a + " " + b + " " + c);
}
}
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.print();
}
}
local Inner 클래스
- Outer 클래스의 메소드 안에서 정의한 클래스를 의미
- 메소드 안에서 정의되었기 때문에 로컬변수처럼 인식
- 메소드가 호출될 때 생성되며 메소드가 종료될 때 삭제 됨
local Inner 클래스 형식
public class Outer {
..
public void outerMethod(){
class Inner{ }
}
}
local Inner 클래스 사용예
public class Outer {
int a = 10;
private int b = 20;
static int c = 30;
public void outerMethod() {
// Inner class
class Inner {
public void print() {
System.out.println(a + " " + b + " " + c);
}
}
Inner i = new Inner();
i.print();
}
public static void main(String[] args) {
Outer outer = new Outer();
outer.outerMethod();
}
}
static Inner 클래스
- Inner 클래스를 정의할 때 static 키워드를 사용
- 일반 Inner 클래스내에는 static 변수를 포함할 수 없지만, static Inner 클래스로 정의하면 가능
- Outer 클래스를 객체 생성하지 않아도 Inner 클래스에 접근이 가능
- Outer 클래스의 멤버변수와 pirvate 로 선언된 변수는 접근이 불가능
static Inner 클래스 형식
public class Outer {
...
static class Inner{
}
...
}
static Inner 클래스 사용예
public class Outer {
int a = 10;
private int b = 20;
static int c = 30;
static class Inner{
static int d = 40; // static 변수 선언 가능
public void print(){
System.out.println(c); // Outer 클래스의 static 변수만 접근 가능하고 a, b 변수는 접근 불가
}
public static void staticPrint(){ // static 메소드 선언
System.out.println(c);
}
}
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner();
inner.print();
System.out.println(Outer.Inner.d); // static 변수에 대한 접근
Outer.Inner.staticPrint(); // static 메소드에 대한 접근
}
}
anonymous Inner 클래스
- local Inner 클래스의 변형된 형태
- 클래스명을 가지지 않으며 단지 객체 생성과 메소드 선언만을 정의
- 일반적으로 인터페이스 또는 추상클래스를 구현하는 클래스로 자주 사용
anonymous Inner 클래스 사용예
interface Student {
public void getInfo();
}
public class Test {
public static void main(String[] args) {
// anonymous 클래스
Student student = new Student() {
// getInfo 메소드 구현
public void getInfo() {
System.out.println("anonymous class");
}
};
student.getInfo();
}
}