: 클래스 안에 클래스가 정의된 형식
-멤버 변수, 멤버 메서드와 비슷한 성격
-외부 클래스의 객체 생성 이후 접근 가능한 클래스
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;
}
위 메서드와 아래 메서드는 같다.