* 내부 클래스 - 클래스 안의 클래스
class A{ // 외부 클래스
class B { //내부 클래스
}
}
장점
1. 내부 클래스에서 외부 클래스의 멤버들 쉽게 접근 가능.
- 서로 다른 클래스일 땐 객체 생성해야 접근 가능.
2. 코드의 복잡성을 줄일 수 있다. (캡슐화)
내부 클래스 종류
- 인스턴스 내부 클래스, 스태틱 내부 클래스, 지역 내부 클래스. 각각 iv, cv, lv 랑 비슷한 특징을 갖는다.
스태틱 내부 클래스만 스태틱 멤버를 가질 수 있다. 나머진 못 가짐.

| 인스턴스 내부 클래스 = iv |
내부 클래스가 들어있는, 외부 클래스 에서만 사용 가능 |
| 스태틱 내부 클래스 = cv |
외부 클래스 생성 없이도 사용 가능. 주로 static 멤버에서 사용될 목적으로 선언 |
| 지역 내부 클래스 = lv |
외부 클래스의 메서드 안에 선언, 선언된 영역 내부에서만 사용 가능. |
| 익명 클래스 | 클래스 선언과 객체의 생성을 동시에 하는 이름없는 클래스 (일회용) |
public class EX7 {
class InstanceInner{
int iv = 100;
//static int cv = 100; // 에러! 인스턴스 내부 클래스에선 static 멤버X
final static int CONST = 100; // 상수는 허용.
}
static class StaticInner{
int iv = 200;
static int cv = 200; // static 클래스에선 static 멤버 사용 가능
}
void myMethod() {
class LocalInner{
int iv = 300;
//static int cv = 300; // 에러! static 멤버 사용 불가
final static int CONST = 300;
}
int i = LocalInner.CONST;
System.out.println(i); // 300
LocalInner LI = new LocalInner();
System.out.println(LI.iv); // 300
}
public static void main(String[] args) {
System.out.println(InstanceInner.CONST);// 100
System.out.println(StaticInner.cv); // 200
EX7 E = new EX7();
E.myMethod(); // 300 300
}
}
* 내부 클래스의 제어자와 접근성
내부 클래스는 접근자 4개 (public, protected, default, private) 모두 가능.
인스턴스 내부 클래스 : 외부 클래스의 private멤버 접근 가능
지역 내부 클래스 : 지역 변수는 접근 불가. 상수는 접근 가능.
지역 변수는 그 지역(메서드)이 종료되면 사라짐. 지역 내부 클래스는 그 보다 오래 존재할 수 있으므로 사용 불가.
상수의 경우 Contant pool에서 따로 관리하기 때문에 사라지지 않음.
class Outer{
private int outerIv = 0;
private static int outerCv = 0;
class InstanceInner{
int iiv = outerIv;
int iiv2 = outerCv;
}
static class StaticInner{
//int siv = outerIv; 스태틱 클래스는 외부 클래스의 인스턴스 멤버 접근 불가.
static int scv = outerCv;
}
void myMethod() {
int lv = 0;
final int lv2 = 0;
lv = 3;
class LocalInner{
int liv = outerIv;
int liv2 = outerCv;
//int liv3 = lv; 지역변수 접근 불가
int liv4 = lv2;
}
LocalInner LII = new LocalInner();
System.out.println(LII.liv);
System.out.println(LII.liv2);
//System.out.println(LII.liv3);
System.out.println(LII.liv4);
}
}
변수 위치에 따른 구별법.
class Outer{
int value = 10; // Outer.this.value
class Inner{
int value = 20; // this.value
void method(){
int value = 30;
}
}
}
* 익명 클래스
- 이름이 없는 일회용 클래스. 정의와 생성을 동시에
new 조상클래스이름(){
//멤버 선언
}'코딩 > JAVA 공부' 카테고리의 다른 글
| [JAVA] 자바의 정석 _ Object, String, StringBuffer, StringBuilder, Math 클래스 / 오토박싱, 언박싱 (0) | 2022.10.12 |
|---|---|
| [JAVA] 자바의 정석 _ 예외 (try-catch 문) (0) | 2022.10.11 |
| [JAVA] 자바의 정석 _ 다형성, 추상 클래스, 인터페이스 (0) | 2022.10.09 |
| [JAVA] 자바의 정석 _ 상속, 포함 (1) | 2022.10.08 |
| [JAVA] 자바의 정석 _ 메서드 (0) | 2022.10.07 |