: 클래스 안에 클래스가 정의된 형식
-멤버 변수, 멤버 메서드와 비슷한 성격
-외부 클래스의 객체 생성 이후 접근 가능한 클래스
public class Outer {
    int num1 = 10;
    class Inner {  // 인스턴스 내부 클래스
        int num2 = 20;
        public void method() {
            System.out.println("인스턴스 내부 클래스에서 호출");
            System.out.printf("num1 + num2 = %d%n", num1 + num2);
        }
    }
}
public class Ex01 {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.method();
    }
}인스턴스 내부 클래스의 자원도 활용 가능하다.
내부의 메서드를 접근했고, 동일명의 변수가 존재 한다면, 내부 클래스의 자원을 먼저 사용하게 된다.
(만약 외부 클래스의 자원을 사용하고 싶다면 Outer.this.num1 와 같이 Outer.this.자원을 활용해주면 된다.)
System.out.printf("num1 + num2 = %d%n", Outer.this.num1 + num2);
class Inner {  // 인스턴스 내부 클래스
        int num1 = 15;
        int num2 = 20;
        static int num3 = 30;
.
.
.
//접근할때
System.out.println(Outer.Inner.num3);-정적 변수, 정적 메서드와 비슷한 성격
-객체 생성과 상관 X, 접근 가능(외부 클래스명으로 접근 가능)
public class Outer {
    static class Inner {
        public void method() {
            System.out.println("정적 내부 클래스에서 호출!");
        }
    }
}
//Outer 객체를 따로 생성할 필요가 없음
public class Ex01 {
    public static void main(String[] args) {
        Outer.Inner inner = new Outer.Inner()
    }
}-함수 안에 정의된 클래스
public class Outer {
    public Calculator method(int num3) {   //데이터 영역에 num3이 할당됨(상수)
        Calculator cal = new Calculator() {
            public int add(int num1, int num2) {
                return num1 + num2 + num3;
            }
        };
        return cal;
    }
}public class Ex01 {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Calculator cal = outer.method(30);
        int result = cal.add(10,20);  // 60
        System.out.println(result);
        int result2 = cal.add(20, 30);  //80 final int num3 - 지역변수의 상수화
        System.out.println(result2);    //이유 - 제거되지 않기 위해서
    }
}클래스내부의 메서드 안에 객체를 생성함.
return new Calculator() {
            public int add(int num1, int num2) {
                return num1 + num2 + num3;
            }
        };위처럼 바로 반환해줘도 된다.
Calculator cal = new Calculator() {
            @Override
            public int add(int num1, int num2) {
                //num3 = 50;
                return num1 + num2 ;
            }
        };
        
        
 ==
 
 
        Calculator cal2 = (x, y) -> x + y;
    }위 메서드와 아래 메서드는 같다.