1. 내부 클래스란?
class ABC {
class DEF {
}
}
1. 1. 내부클래스 장점
- 내부 클래스에서 외부 클래스 멤버들을 쉽게 접근 가능
- DEF클래스가 ABC 클래스 안에서만 사용되면 단독으로 둘 필요가 없어 내부클래스로 만들어 코드 복잡성 줄임
2. 내부 클래스의 종류와 특징
2.1. 특징
2.2. 종류
2.2.1. 인스턴스 내부 클래스
- 인스턴스 변수 선언 위치와 같음
- 다른 외부 클래스에서 사용할 일이 없는 경우 내부 인스턴스 클래스로 정의
- 내부 클래스를 private으로 선언했다면 다른 클래스에서 사용할 수 없음
- 외부 클래스가 생성한 이후에 사용해야 하기 때문에 정적 변수, 정적 메서드 선언할 수 없음
class OutClass {
private InClass inClass;
public OutClass() {
inClass = new InClass();
}
class InClass {
void inTest() {
System.out.println("test");
}
}
public void usingClass() {
inClass.inTest();
}
}
...
OutClass outClass = new OutClass();
outClass.usingClass();
OutClass outClass = new OutClass();
outClass.InClass inClass = outClass.new InClass();
2.2.2. 정적 내부 클래스
- 외부 클래스 생성과 무관하게 사용하려면 정적 내부 클래스 사용
- 인스턴스 변수 위치에 정의하며 static 사용
- 정적 내부 클래스에 선언한 메서드나 변수는 private가 아닌 경우 다른 클래스에서 바로 사용
class OutClass {
private static int sNum = 20;
static class InStaticClass {
void inTest() {
System.out.println("inTest");
}
static void sTest() {
System.out.println("sTest");
}
}
}
...
OutClass.InStaticClass sInClass = new OutClass.InStaticClass();
sInClass.inTest();
sInClass.sTest();
OutClass.InStaticClass.sTest();
2.2.3. 지역 내부 클래스
- 지역 변수처럼 메서드 내부에 클래스를 정의하여 사용(메서드 안에서만 사용)
- 지역 내부 클래스에서 사용하는 지역 변수는 상수처리가 됨
class OutClass{
Runnable getRunnable() {
int i = 10;
class InClass implements Runnable{
public void testMethod() {
System.out.println("testMethod");
}
@Override
public void run() {
System.out.println("run");
}
}
return new InClass();
}
}
...
OutClass outClass = new OutClass();
Runnable runner = outClass.getRunnable();
runner.run();
3. 내부 클래스의 선언
class OutClass {
class InClass {
}
static class StaticInClass {
}
public void method() {
class LocalInClass{
}
}
}
4. 내부 클래스의 제어자와 접근성
- 내부 클래스의 제어자는 변수에 사용 가능한 제어자와 동일
- 클래스는 default, public만 가능하지만 내부 클래스에는 모든 접근 제어자가 가능
class OutClass {
private int privateIv = 11;
static int staticIv = 22;
int value = 100;
class InClass {
int iv = 10;
final static int CONST = 30;
int value = 200;
int v1 = privateIv;
int v2 = staticIv;
void method(){
int value = 300;
System.out.println(value);
System.out.println(this.value);
System.out.println(OutClass.this.value);
}
}
static class StaticInClass {
int iv = 100;
static int cv = 200;
int v2 = staticIv;
}
public void method() {
int lv = 10;
class LocalInClass{
int iv = 1000;
final static int CONST = 3000;
int v1 = privateIv;
int v2 = staticIv;
int v3 = lv;
}
}
static void staticMethod() {
StaticInClass sic = new StaticInClass();
}
void instanceMethod() {
InClass ic = new InClass();
StaticInClass sic = new StaticInClass();
}
}
...
System.out.println(InClass.CONST);
System.out.println(StaticInClass.cv);
5. 익명 클래스(anonymous class)
- 이름이 없고 정의와 생성을 동시에 하는 일회용 클래스
- 주로 자바 UI에서 이벤트 처리 시 사용
- 안드로이드 프로그래밍에서 위젯 이벤트 처리 핸들러 구현 시 사용
class Outer {
Runnable runner() {
return new Runnable() {
@Override
public void run() {
System.out.println("run");
}
}
};
}