Langauge/JAVA
내부 클래스
유로파니
2020. 5. 21. 15:13
public class InnerEx1 {
public static void main(String[] args) {
Outer.StaticInner si = new Outer.StaticInner();
System.out.println(si.iv);
System.out.println(Outer.StaticInner.cv);
System.out.println(Outer.StaticInner.MAX);
// Outer.InstanceInner ii = new Outer.InstanceInner();
Outer.InstanceInner ii = new Outer().new InstanceInner();
Outer outer = new Outer();
Outer.InstanceInner ii2 = outer.new InstanceInner();
System.out.println(ii2.iv);
System.out.println(ii2.MAX);
System.out.println(Outer.InstanceInner.MAX);
outer.method();
}
}
class Outer {
class InstanceInner { // 인스턴스 내부클래스
int iv = 100; //인스턴스 o
// static int cv = 10; //스태틱 x
final static int MAX = 200; //변수 o
}
static class StaticInner { // 스태틱 내부클래스
int iv = 300; //인스턴스 o
static int cv = 400; //스태틱 o
final static int MAX = 500; //변수 o
}
void method() { // 인스턴스 메서드
class LocalInner { // 지역 내부클래스
int iv = 600; //인스턴스 o
// static int cv = 700; //스태틱 x
final static int MAX = 700; //변수 o
}
LocalInner lc = new LocalInner(); // 지역 내부클래스가 만들어진 메서드 내에서만 사용 O
System.out.println(lc.iv);
System.out.println(lc.MAX);
System.out.println(LocalInner.MAX);
}
void method2() {
// LocalInner lc = new LocalInner(); // 지역 내부클래스는 정의되지 않은 다른 메서드에서 사용 X
}
}
package ch07;
public class InnerEx2 {
public static void main(String[] args) {
Outer2 out = new Outer2();
out.method(1);
Outer2.InstanceInner i2 = out.new InstanceInner();
System.out.println(i2.iiv);
System.out.println(i2.iiv2);
Outer2.StaticInner i3 = new Outer2.StaticInner();
System.out.println(i3.siv);
System.out.println(Outer2.StaticInner.scv);
}
}
class Outer2 {
private int outeriv = 10; // 인스턴스 변수(외부)
private static int outercv = 20; // 스태틱 변수(외부)
class InstanceInner { // 인스턴스 내부클래스
int iiv = outeriv;
int iiv2 = outercv;
}
static class StaticInner { // 스태틱 내부클래스
int siv = new Outer2().outeriv;
static int scv = outercv;
}
static StaticInner cv = new StaticInner();
InstanceInner iv = new InstanceInner();
static InstanceInner cv2 = new Outer2().new InstanceInner();
static StaticInner iv2 = new StaticInner();
void method(final int pv) { //지역내부클래스에서 사용되는 메서드의 지역변수는 final여야함.
int i = 0;
// pv++; //변경불가 (cuz, final)
class LocalInner { // 지역 내부클래스
int liv = outeriv;
int liv2 = outercv;
void method() {
// i = 100; //지역내부클래스에 속한 메서드 안에서 지역변수 변경 X(final로 여겨짐)
// pv++; //변경불가 (cuz, final)
System.out.println("pv = " + pv);
System.out.println(liv + ", " + liv2);
System.out.println(outeriv + ", " + outercv);
}
}
LocalInner li = new LocalInner();
li.method();
}
}