Inner class 란?
클래스 안에 클래스를 선언하여 사용하는것이 Inner class (내부 클래스) 이다.
- 인스턴스 내부 클래스, Static 내부클래스, 지역 내부 클래스 세 종류가 있으며, 인스턴스, Static, 지역변수의 개념과 동일하다고 생각하면 쉽다.
- 내부 클래스에서 외부 클래스의 멤버를 객체 생성없이 접근 가능하며, 내부 클래스에서는 모든 접근제어자를 사용할 수 있다.
(일반 클래스는 public 과 default 만 사용 가능) - 인스턴스 내부 클래스와 지역 내부 클래스에서는 static 변수를 선언할 수 없지만 final static 은 상수이미르로 사용이 가능하다.
Inner class vs Static Inner class
class A {
int value = 5;
class B {
int innerValue = A.this.value;
}
static class C {
int staticInnerValue = A.this.value; //error
}
}
public class Main {
public static void main(String[] args) {
A a = new A();
A.B b = a.new B();
A.B b2 = a.new B();
System.out.println(b.equals(b2)); //false
A.C c = new A.C();
A.C c2 = new A.C();
System.out.println(c.equals(c2)); //false
}
}
- Inner Class (B) 는 외부 클래스 (A) 에 대한 인스턴스를 이용해서 내부 클래스의 인스턴스를 생성한다.
이 때 생성된 인스턴스 b 와 b2 는 '다른참조' 이다. - Static Inner Class (C) 도 동일하게 인스턴스 두개를 생성해 (c, c2) 비교하면 '다른참조' 이다.
static 을 사용했다 하여 '같은참조'가 아니므로 이 점 참고하자.
이 둘은 외부 클래스의 인스턴스 없이 내부 클래스의 인스턴스를 바로 생성할 수 있는지에 대한 차이가 존재한다.
Inner Class 는 외부 클래스의 인스턴스가 존재해야지 만들어 질 수 있는데, 이 때 Inner Class 는 자신을 만들어준 인스턴스에 대한 외부참조를 갖게된다. 반면 Inner Static Class 는 외부 인스턴스 없이도 만들어 질 수 있기 때문에 외부참조가 존재하지 않는다.
Inner class 는 '외부 참조' 가 존재하기 때문에 외부 클래스로 접근이 가능한 것이다.
하지만 '외부참조' 가 주는 문제를 반드시 알아야한다.
- 참조값을 담아야하기 때문에 인스턴스 생성 시 시간&공간적 성능이 낮아진다.
- 외부 인스턴스에 대한 참조가 존재하기 때문에 GC가 인스턴스를 수거하지 못하여 메모리 누수가 생길 수 있다.
이 와 같이 '외부참조' 를 사용하는 장점보다 단점이 주는 영향이 훨씬 더 크므로 Inner Static Class 를 사용하는것이 좋으며, Static 을 사용하고 싶지 않다면 내부 클래스보다는 별개의 클래스를 만드는 것이 좋다.
'프로그래밍 > Java' 카테고리의 다른 글
JVM 구조 (0) | 2022.04.30 |
---|---|
JDK, JRE, JVM 이해하기 (0) | 2022.04.29 |
Java 8 Funtional 스터디 (0) | 2021.09.23 |
Interface (0) | 2021.08.22 |
StringBuilder (0) | 2021.08.21 |