내부 클래스
내부클래스의 제어자와 접근성Permalink
클래스 앞에 쓸수있는건 public (default) 이지만
내부클래스에는 public protected default private 4개 다 가능하다
class Outer {
private int iv = 0;
protected static in cv = 0;
void myMethod() {
int lv = 0;
}
}
---
clas Outer { //클래스
privatate class InstanceInner {} //내부클래스
protected static class StaticInner {} //스태틱 내부 클래스
void myMethod() {
class LocalInner {}
}
}
클래스 > 내부클래스 > static 정적 클래스 > 지역메소드호출시 > (지역클래스)
class Ex7_12 {
//클래스가 생성될때 ,내부클래스,static 클래스는 생성된다
class InstanceInner { // 인스턴스 내부클래스
int iv = 100;
// static int cv = 100; // 에러! static 변수 는 static 클래스내에서만 가능하다
final static int CONST = 100; // final static 은 상수이므로 허용가능
}
static class StaticInner { // static 내부클래스 static 이아니면 인스턴스 내부클래스가된다.
int iv = 200;
static int cv = 200; // 핵심은 static 클래스만 static 멤버를 정의할수있다.
}
void myMethod() { // 따로 메서드가 호출되어야만 지역클래스가 생성된다
class LocalInner { //지역내부클래스
int iv = 300; //지역변수 JDK 1.8 부터는 final 생략가능하지만 final 작성해야한다 중요
// static int cv = 300; // 에러! static 변수 선언 핧수없다 . static 클래스가 아니므로.
final static int CONST = 300; // final static 은 상수이므로 허용 <지역클래스 내부의 메서드 내에서만 가능
}
int i = LocalInner.CONST; // 2번 ok
}
public static void main(String args[]) {
System.out.println(InstanceInner.CONST);
System.out.println(StaticInner.cv);
//System.out.println(LocalInner.CONST); // 1번 에러 지역클래스 내에서만 가능
}
}
+------------------+
| Ex7_12 | //클래스
+------------------+
| InstanceInner | // 내부클래스 (외부 , 내부, 스태틱 사용가능 )
| StaticInner | // 스태틱 내부클래스 (자기것만 사용가능 , 외부클래스의cv 가능)
|------------------|
| myMethod() | // * 외부클래스만사용가능 < 혼동주의 지역 메소드 호출해야지만 생성되어서 지역클래스 사용가능
+------------------+
|
| // 메서드내에 선언된 지역클래스 이기떄문이다 < 중요
v
+------------------+
| LocalInner | // 지역클래스 (생성된이후에는 > 외부 사용가능)
// final이붙은 상수만 접근가능 > 이유는 값이변경되지않는다는 보장을 컴파일러가하기때문에
+------------------+
결론Permalink
-
내부클래스에서 > 외부클래스의 private 멤버도 접근가능하다
- LocalInner(지역내부클래스)는 final 상수만 사용가능하다 (JDK 1.8부터는 생략가능해졌지만 final을 붙이자 )
- LocalInner클래스에서 outerIv와 outerCv를 사용되는 이유는, myMethod()가 Outer 클래스의 메소드이기때문이다
- meMethod()가 Outer 꺼 이기 떄문에 outerIv, outerCv 가능 // meMethod()로 호출하면 종료되기때문에 상수로변경시킨뒤 값을 없애지말자 (그안의 변수는 final 상수만 사용가능하다 )
MyMethod() 호출전 이미 Outer(outerIv와 outerCv)는 생성되어있어서 final이 안붙어도된다
myMethod()입장에서는 > InstanceInner,StaticInner 이접근가능하다 하지만
LocalInner 입장에서는 > Outer 의 인스턴스 멤버만 접근가능하다
프로그램실행 유지 > 클래스 > 객체생성(객채의변수,메서드) 복사 > 메서드는 호출될때만 실행>종료 > 클래스는 종료되지않음
한마디로 메서드(); 안에것들은 호출해서사용하는거기떄문에 원본클래스만 사용가능하며 final이없어도된다
Leave a comment