내부클래스
class A{ // 외부클래스
class B{} // 내부클래스
}
- 클래스 내에 선언된 또 다른 클래스
- 내부클래스를 선언하면 두 클래스 멤버들 간 접근이 용이해짐
- 코드를 간단하게 만들 수 있음
- 내부클래스(B)는 외부클래스(A)를 제외하고는 잘 사용되지 않아야함
내부클래스 종류와 특징
- 변수 선언위치에 따른 종류와 같음(인스턴스, 스태틱, 로컬, 익명)
인스턴스내부클래스
- 외부 클래스의 멤버변수 위치에 선언
- 보편적으로 사용됨
- 인스턴스 변수/메서드, 스태틱 변수/메서드 전부 사용 가능
public class Outer{
int x, y;
public void InstanceInner(){}
}
스태틱내부클래스
- 외부클래스의 멤버변수 위치에 선언
- 스태틱변수, 스태틱메서드만 다룰 수 있음
public class Outer{
int x,y;
static int z;
public static void StaticInner(){}
}
로컬내부클래스
- 외부클래스의 메서드나 초기화 블럭 안에 선언
- 해당 영역 실행 중에만 사용 가능
- 외부클래스의 모든 구성요소를 자유롭게 사용 가능
public class Outer{
int x,y;
public void sample(){
class LocalInner{
int a,b;
}
}
}
내부클래스의 선언
- 내부클래스는 선언 위치에 따라 같은 속성의 변수와 동일한 유효범위와 접근성을 가짐
1. 변수
class Outer{
int iv = 0;
static int cv = 0;
void myMethod(){
int lv = 0;
}
2. 내부클래스
class Outer{
class InstanceInner{}
static class StaticInner{}
void myMethod(){
class LocalInner{}
}
- 제3의 클래스에서 내부클래스를 사용 할 때
- 인스턴스클래스: 외부클래스로 객체 생성이 선행되어야 함
- 스태틱클래스: 객체 생성없이 바로 호출 가능
class Outer{
class Ins{}
static class stat{}
}
class Outer2{
Outer o = new Outer();
Outer.Ins ins = o.new Ins(); // 인스턴스 클래스. 객체생성 선행
Outer.Stat stat = new Outer.stat(); // 스태틱클래스. 객체생성X
내부클래스는 되도록 하나의 클래스에서 문제를 해결하기 위하여 만드는 것이므로
이런식으로 따로 클래스를 벗어나는 것은 적절하지 못하므로 참고만 할 것