내부 클래스 - 클래스의 내부에 선언한 클래스
1. 인스턴스 내부 클래스 - 외부 클래스 내부에서만 생성해서 사용하는 클래스
2. 정적 내부 클래스 - 외부 클래스 생성과 무관하게 사용할 수 있어여하고 정적 변수도
이용해야할때 static
3. 지역 내부 클래스 - 메서드 내부에 클래스를 정의해서 사용하는 클래스
4. 익명 내부 클래스 - 이름이 없는 클래스
메서드로 반환을 할수도 있고, 인스터스 변수 형태로 반환을 하기도 한다.
클래스 내부에 선언한 클래스
인스턴스 변수를 선언할 때와 같은 위치에 선언하고 static이 붙지 않는다.
//외부클래스.내부클래스 참조변수 = 외부클래스참조변수.new 내부 클래스 생성자();
OuterClass_ins.InnerClass inner = outer.new InnerClass();
외부클래스명.this
class OuterClass_ins {
void outerMethod() {
System.out.println("외부 클래스 메소드");
}
class InnerClass {
public void innerMethod() {
System.out.println("인스턴스 내부 클래스의 메소드");
//외부 클래스 메소드
OuterClass_ins.this.outerMethod();
}
}
}
static
이 아닌 클래스는 인스턴스를 생성하고 나서 사용할 수 있다.class OuterClass_ins {
InnerClass inner;
public OuterClass_ins() {
inner = new InnerClass();
}
void outerMethod() {
System.out.println("외부 클래스 메소드");
inner.innerMethod();
}
class InnerClass {
public void innerMethod() {
System.out.println("인스턴스 내부 클래스의 메소드");
}
}
}
public class InstanceInnerClass {
public static void main(String[] args) {
OuterClass_ins outer = new OuterClass_ins();
outer.outerMethod();
}
}
인스턴스 내부 클래스를 쓰면 캡슐화와 은닉성, 논리적 그룹화, 인스턴스 멤버 접근이 쉽다는 장점이 있지만 중첩된 구조로 코드 복잡성이 증가할 수 있고, 외부 참조를 사용할 경우 시간&공간 성능이 낮아지며 메모리 누수가 발생할 수 있다는 취약점이 있기 때문에 지양하는 것이 좋을 것 같다.
static
키워드가 붙은 내부 클래스, 내부 클래스가 외부 클래스 생성과 무관하게 사용할 수 있어야하고 정적 변수도 사용할 수 있어야할 때 사용한다.
static과는 다르다
보통 static은 메모리에 하나만 올라가지만, 정적 내부 클래스는 그렇지 않다.
내부 static 클래스는 일반 클래스처럼 초기화를 할때마다 다른 객체가 만들어진다.
내부 클래스에서 외부의 인스턴스멤버를 사용할 일이 없다면 static 클래스로 선언하는 것이 좋다. tatic이 아닌 내부 인스턴스 클래스는 외부와 연결이 되어 있어 '외부 참조'를 갖게되어 메모리를 더 먹고, 느리며, 또한 GC 대상에서 제외되는 여러 문제점을 일으키기 때문이다.
지역 변수와 같은 성질을 지닌다.
static
을 붙일 수 없다.
class OuterClass {
int num = 1;
public void outerMethod() {
int Mnum = 2;
class LocalInnerClass {
int lnum = 3;
void innerMethod() {
num +=3;
//상수로 취급되어 변경할 수 없다.
//Mnum += 3;
lnum += 3;
}
}
LocalInnerClass inner = new LocalInnerClass();
inner.innerMethod();
}
}
클래스 이름을 사용하지 않는 클래스
딱 한번만 객체를 생성하고 싶을 때 사용한다. (일회성이다.)
➡️ 인스턴스 변수에 익명 내부 클래스를 대입한다.
➡️ 메서드에서 익명 내부 클래스를 반환한다.
공부를 미루지 말자!