Java
77. 내부클래스의 제어자와 접근성 - 패스트캠퍼스 백엔드 부트캠프 3기
gkss2tpt
2024. 12. 23. 16:22
1. 내부 클래스의 제어자와 접근성
- 내부 클래스의 제어자는 변수에 사용 가능한 제어자와 동일
class Outer {
private class InstanceInner {}
protected static class StaticInner {}
void myMethod() {
class LocalInner {}
}
}
class Ex7_12 {
class InstanceInner {
int iv = 100;
static int cv = 100; // 에러 static 변수를 선언할 수 없다.
final static int CONST = 100; // final static은 상수이므로 허용
}
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; // final static은 상수이므로 허용
}
}
}
2. 예제1
class Outer {
private int outerIv = 0;
static int outerCv = 0;
class InstanceInner {
int iiv = outerIv; // 외부 클래스의 private멤버도 접근가능하다.
int iiv2 = outerCv;
}
static class StaticInner {
int siv = outerIv; // 스태틱 클래스는 외부 클래스의 인스턴스멤버에 접근할 수 없다.
static int scv = outerCv;
}
void myMethod() {
int lv = 0;
final int LV = 0; // JDK1.8부터 final 생략 가능
class LocalInner {
int liv = outerIv;
int liv2 = outerCv;
// 외부 클래스의 지역변수는 final이 붙은 변수(상수)만 접근가능하다.
int liv3 = lv; // 에러 (JDK1.8부터는 에러 아님) 값이 바뀌지 않는 변수는 상수로 간주
int liv4 = LV; // OK.
}
}
}
3. 예제2
class Outer2 {
class InstanceInner {
int iv = 100;
}
static class StaticInner {
int iv = 200;
static int cv = 300;
}
void myMethod() {
class LocalInner {
int iv = 400;
}
}
}
class Ex7_15 {
public static void main(String[] args) {
Outer2 oc = new Outer2(); // 외부 클래스의 인스턴스를 먼저 생성해야 인스턴스 클래스의
Outer2.InstanceInner ii = oc.newInstanceInner(); // 인스턴스를 생성 가능
System.out.println("ii.iv : " + ii.iv);
System.out.pritnln("Outer2.staticInner.cv : " Outer2.StaticInner.cv);
// 스태틱 내부 클래스의 인스턴스는 외부클래스를 먼저 생성하지 않아도 된다.
Outer2.StaticInner si = new Outer2.staticInner();
System.out.println("si.iv : " + si.iv);
}
}