

멤버 클래스 : 인스턴스 멤버 클래스 / 정적 멤버 클래스
로컬 클래스 : 메소드 안에서 동작하는 클래스(static 붙일 수 X)
A a = new A();
A.B b = a.new B();
b.field1 = 3;
b.method1();
일단 B클래스의 객체를 만들고 나면
b.method 이렇게 접근 가능! but 정적 멤버 클래스는
A.C.method 이렇게 접근함. 밑에 나옴.
public class A {
A() {
System.out.println("A객체가 생성됨");
B b = new B();
}
}
class B {
int field1;
static int field2; >>static ❌
B(){
System.out.println("B객체가 생성됨");
}
void method1() { }
static void method2() { } >>static ❌
}
C클래스
public class C {
public static void main(String[] args) {
A a = new A();
A.B b = new B(); >>❌ B객체를 먼저 만들어야함
B b = a.new B();
b.field1 = 3;
b.nethod();
}
}
A.C c = new A.C();
c.field1 = 3;
c.method1();
A.C.field2 = 3;
A.C.method2();
C.method(); 이렇게 못함!! ✅인스턴스 멤버 클래스와 메소드/필드 호출 방법이 다름
D d = new D();
d.field1 = 3;
public class A {
class B { }
static class C { }
//인스턴스 필드
B field1 = new B(); //B타입의 필드
C field2 = new C(); //C타입의 필드
//인스턴스 메소드
void method1() {
B var1 = new B();
C var2 = new C();
}
//정적 필드
//static B field3 = new B(); //static이기 때문에 A객체 없이도 B클래스가 사용되어야 함.
//하지만 B 클래스는 A객체 없이는 호출될 수 없음.
static C field4 = new C();
//정적 메소드
static void method2() {
B var1 = new B(); //같은 이유
}
}
인스턴스 필드와 인스턴스 메소드는 인스턴스 멤버 클래스든 정적 멤버 클래스든 다 사용할 수 있는 반면
정적 필드와 정적 메소드는 정적 멤버 클래스만 사용할 수 있다.



public void method2(int arg) {
int localVariable = 1;
arg = 100;❌
localVariable = 100; ❌
class Innter {
public void method() {
inr result = arg + localVariable;
}
}
}
arg와 localVariable는 final을 안 붙여도 final 특성을 가짐.
method1 실행 후 끝나면, 저 변수들이 사라지게 됨. 그런데 아직 내부에있는 Inner 클래스는 돌아가고 있다면, 그 값들이 사라져서 작동할 거리가 없어짐. 그러니까 없어지면 안되므로 final로 붙박아놓음.

class A {
interface I {
void method();
}
}
구현 (이거 ㅈㄴ복잡함)
public class Button {
OnClickListener listener;
void setOnClickListener(OnClickListener listener) {
this.listener = listener;
}
public void touch() {
listener.onClick();
}
interface OnClickListener {
void onClick();
}
}
public class CallListener implements Button.OnClickListener{
@Override
public void onClick() {
System.out.println("전화를 합니다");
}
}
public class MessageListener implements Button.OnClickListener{
@Override
public void onClick() {
System.out.println("메세지를 보냅니다");
}
}
public class BottonExample {
public static void main(String[] args) {
Button btn = new Button();
btn.setOnClickListener(new CallListener());
btn.touch();
btn.setOnClickListener(new MessageListener());
btn.touch();
//익명구현객체 방법 : 이걸 많이 써요(by.이자바)
btn.setOnClickListener(new Button.OnClickListener() {
public void onClick() {
System.out.println("사진을 찍습니다");
}
});
btn.touch();
}
}
부모 클래스 [필드|변수] = new 부모클래스(매개값) {
//필드
//메소드
}
class A {
Parent field = new Parent() {
int childField;
coid childMethod() { }
@Override
void parentMethod() { }
};
}
void method1(Parent parent) { }
void method2() {
method1(
new Parent() {
int childField;
coid childMethod() { }
@Override
void parentMethod() { }
}
);
}

▲ 이건 진짜 개쌉 모르겠음.
영상 보면 이해는 감.
영상 다시 보기
인터페이스 [필드|변수] = new 인터페이스() {
//인터페이스에 선언된 추상 메소드의 실체 메소드 선언
//필드
//메소드
};