1)다른클래스 안에 정의된 클래스
2)바깥클래스에서만 쓰여야함
3)종류: 정적멤버, (비정적)멤버, 익명,지역 클래스
정적맴버 클래스를 제외한 나머지 클래스는 내부클래스 이다.
1.정적 멤버클래스
•클래스 내부에 static으로 선언된 클래스
•다른클래스안에 선언되고,바깥클래스의 private맴버에도 접근가능
•private으로 선언하면 바깥클래스에서만 접근할수있는 방식
public class OuterClass {
//정적 맴버 클래스 선언
public static class StaticMemberClass {
// 변수
private static int staticMemberVariable = 10;
// 메서드
public static void printStaticMember() {
System.out.println("정적맴버변수 값: " + staticMemberVariable);
}
}
private int nonStaticMemberVariable = 20;
public void printNonStaticMember() {
System.out.println("비정적맴버변수값: " + nonStaticMemberVariable);
}
public static void main(String[] args) {
OuterClass.StaticMemberClass.printStaticMember();
OuterClass outerInstance = new OuterClass();
outerInstance.printNonStaticMember();
}
}
맴버클래스에서 바깥 인스턴스에 접근할 일이 없다면 무조건 staitc을 붙여서 정적 맴버 클래스로 만들자
•static을 생략하면 바깥인스턴스로의 숨은 외부 참조를 갖게된다
•이 참조를 저장하려면 시간과 공간이 소비되고,더심각한 문제는 가비지 컬렉션이 바깥클래스의 인스턴스를 수거지하못해 메모리 누수가 발생
public class OuterClass {
//비정적 맴버클래스
public class NonStaticMemberClass {
//변수
private int nonStaticMemberVariable = 30;
// 메서드
public void printNonStaticMember() {
System.out.println("비정적맴버변수: " + nonStaticMemberVariable);
}
}
private static int staticMemberVariable = 40;
public static void printStaticMember() {
System.out.println("정적맴버변수: " + staticMemberVariable);
}
public static void main(String[] args) {
OuterClass outerInstance = new OuterClass();
OuterClass.NonStaticMemberClass nonStaticInstance = outerInstance.new NonStaticMemberClass();
nonStaticInstance.printNonStaticMember();
outerInstance.printStaticMember();
}
}
익명클래스
•이름이없는 클래스
•멤버와달리 쓰이스는 시점에 선언과 동시에 인스턴스가 생성
•비정적인 문맥에서 사용될때만 바깥클래스의 인스턴스를 참조할수있음
package com.example.java;
interface Hello {
void hi();
}public class AnonymousClassExample {
public static void main(String[] args) {
Hello hello = new Hello() {
@Override
public void hi() {
System.out.println("익명클래스!");
}
};
//익명클래스의 메서드 호출
hello.hi();
}
}
``
package com.example.java;
public class LocalClassExample {
public void performAction() {
class LocalGreeting {
void greet() {
System.out.println("지역클래스 예제");
}
}
LocalGreeting localGreeting = new LocalGreeting();
localGreeting.greet();
}
public static void main(String[] args) {
LocalClassExample outerInstance = new LocalClassExample();
outerInstance.performAction();
}
}