- [Java 정리] 내부 클래스2022년 07월 28일
- starryeye
- 작성자
- 2022.07.28.:03
클래스 안의 클래스, 내부 클래스에 대해 알아보자.
public class outerClass { //InnerClass class InnerClass { } //Static InnerClass static class InnerStaticClass { } public static void main(String[] args) { //내부 클래스 TEST outerClass.InnerClass tmp1 = new InnerClass().new InnerClass(); outerClass.InnerClass tmp2 = new InnerClass().new InnerClass(); int a = 0; if(tmp1 == tmp2) a = 0; else a = 1; //내부 static 클래스 TEST outerClass.InnerStaticClass tmpStatic1 = new InnerClass.InnerClass(); outerClass.InnerStaticClass tmpStatic2 = new InnerClass.InnerClass(); int b = 0; if(tmpStatic1 == tmpStatic1) b = 0; else b = 1; } }
내부 클래스
내부 static 클래스
외부 클래스
위 3가지로 명명하겠다.
일반적인 내부 클래스 TEST
내부 클래스의 객체를 만들기 위하여 외부 클래스의 객체를 먼저 생성 해야한다.
따라서, new를 두번 사용하여 외부 클래스 인스턴스 획득하여 내부 클래스 인스턴스를 획득할 수 있다.
답은 당연하게도 1이다.
내부 static 클래스 TEST
static 클래스이기 때문에 외부 클래스의 객체를 생성하지 않고 만들어낼 수 있다.
답은 1이다....
static이라 같을 수도 있다고 생각 할 수 있다...
하지만, new로 생성하는 것은 힙 영역에 공간을 할당 하는 것이다.
그리고 이에 대한 참조를 비교하였으니 당연히 다르다.
static과 this
public class outer { void a() { } class Inner { void innerClassMethod() { outer.this.a(); //문제 없음 } } static class InnerStatic { outer.this.a(); //에러 발생! } }
위 코드는 에러가 발생한다..
static 클래스에서는 this를 사용할 수 없다.
this는 해당 객체의 인스턴스를 참조하는데, static class는 인스턴스가 없어도 사용할 수 있기 때문이다.
-> 단점
그럼에도 내부 클래스는 static을 붙여주자
static이 없는 내부 클래스
- this를 사용할 수 있다.. 따라서 시공간적으로 성능이 낮아진다.
- 내부 클래스에 외부 인스턴스에 대한 참조 값이 존재하기 때문에 GC의 수거가 일어 나지 않는다.
(GC의 수거는 참조 값의 대상이 사라졌을 때, 발생한다.)
-> 따라서 메모리 누수로 이어진다.
'Java' 카테고리의 다른 글
[Java 정리] String, final, Immutable (0) 2022.08.05 [Java 정리] Garbage Collector 1 (0) 2022.07.30 [Java 정리] Exception, Error (0) 2022.07.15 [Java 정리] Annotation (0) 2022.04.09 [Java 정리] enum (0) 2022.04.09 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)