void myMethod() {
class LocalInner {
int iv = 300;
// static int cv = 300; // 에러! static 변수 선언할 수 없음.
final static int CONST = 300; // final static은 상수이므로 허용
}
int i = LocalInner.CONST; // 가능
}
public static void main(String args[]) {
System.out.println(LocalInner.CONST); // 불가!
// 지역 내부 클래스는 메소드 내에서만 사용가능
}
void myMethod() {
int lb = 0; // 지역변수 ( 메소드 종료와 함께 소멸)
final int LV = 0; // jdk1.8부터 생략가능
class LocalInner {
int liv = outerIv; // 외부 클래스의 지역변수
int liv2 = lv; // 에러
(외부 클래스의 지역변수는 final이 붙은 변수(상수)만 접근 가능하다. 단, jdk1.8부터 에러아님)
int liv3 = LV; // 가능
}
}
⇒ 지역 내부 클래스의 객체가 지역변수보다 더 오래 존재할 수 있음.
↳ 따라서 상수만 접근 가능. (단, jdk 1.8부턴 final 생략되도 값이 바뀌지 않는 변수는 상수로 간주됨. 웬만하면 붙이는게 좋긴함)
class Outer {
class InstanceInner { // 일반 내부클래스
int iv = 100;
}
static class StaticInner { // static 내부클래스
int iv = 200;
static int cv = 300;
}
void myMethod() { // 메소드
class Local Inner {
int iv = 400;
}
}
}
위와 같은 외부&내부 클래스 코드가 있을 때, main 함수에서 Outer클래스의 내부 클래스를 이용하는 방법.
Outer oc = new Outer();
Outer.InstanceInner ii = oc.new InstanceInner();
Outer.StaticInner si = new Outer.StaticInner();
: 외부 클래스의 객체 생성 없이 바로 인스턴스 만들 수 있음Outer.StaticInner.cv
: 위처럼 객체 만들지 않아도 상수는 static 내부클래스의 상수는 바로 사용 가능출처
- 자바의 정석 기초편 - youtube : ch7 -45~50