** 클래스 안에 선언된 클래스
1) 중첩 클래스 또는 인스턴스 클래스
2) 내부클래스가 static으로 정의되어 있는 경우
//3) 지역중첩 클래스 또는 지역 클래스(local class)
public class InnerExam3{
public void exec(){ // 메서드 안에 클래스 생성된 경우
static class Cal{
int value = 0;
public void plus(){
value++;
}
}
Cal cal = new Cal(); // 메서드 안에서만 객체 사용 가능
cal.plus();
System.out.println(cal.value);
}
public static void main(String[] args){
InnerExam3 t = new InnerExam3();
t.exec();
}
}
//2)내부클래스가 static으로 정의되어 있는 경우
public class InnerExam2{
static class Cal{ //정적중첩클래스, static 클래스
int value = 0;
public void plus(){
value++;
}
}
public static void main(String[] args){
//static한 필드이기때문에 생성하지 않고 바로 접근 가능
InnerExam2.Cal cal = new InnerExam2.Cal();
cal.plus();
System.ou.println(cal.value);
}
}
//1) 중첩 클래스 또는 인스턴스 클래스
public class InnerExam1{
class Cal{ // Cal이라는 내부(인스턴스) 클래스
int value = 0;
public void plus(){
value++;
}
}
public static void main(String[] args){
//Cal 객체 사용방법
InnerExam1 t = new InnerExam1(); //외부에 있는 클래스 객체 생성
InnerExam1.cal cal = t.new Cal(); // 해당 Cal 객체 생성
바깥쪽클래스.내부타입 변수 = 해당 Cal 객체 생성
cal.plus();
System.out.println(cal.value);
}
}
class Outer{
int value = 10;
class Inner{ // 인스턴스 클래스
int value = 20;
void method2(int value){ //
System.out.println(value); // 넘어온 인자값 출력
System.out.println(this.value); // 20
System.out.println(Outer.this.value); // 10 : Outer class 기준
}
}
static class Inner2{ // static 클래스
}
void method(){
class Inner3{ //지역클래스 : 메서드안에 선언된
}
}
}
public class InnerTest { // 내부클래스
public static void main(String[] args) {
Outer out = new Outer(); // Outer의 객체 필요 class Inner 접근하려면
Outer.Inner in = out.new Inner(); // Inner의 객체가 필요
in.method2(50);
}
}