-
Inner Class 를 쓸때는 static 으로 만들자language/JAVA 2023. 3. 24. 10:50반응형
내부 클래스에 static이 권장되는 이유는 크게 두 가지이다. 첫째, static으로 선언되지 않은 내부 클래스는 외부 클래스에 대한 숨은 참조를 저장해야 하기 때문에 이를 위한 시간/공간적 복잡도가 증가해 성능이 떨어진다. 둘째, 내부 클래스가 외부 클래스에 대한 숨은 외부 참조를 갖기 때문에 가비지 컬렉션이 제대로 이루어 지지 않아 메모리 누수가 발생할 수 있다. 이러한 이유로 내부 클래스에서 외부 클래스의 인스턴스 변수에 접근하지 않는 경우 static으로 내부 클래스를 선언하는 것이 좋다. 이 때, static으로 선언된 내부 클래스는 외부 클래스에 대한 숨은 외부 참조를 갖지 않는다.
숨은 외부 참조를 가진다는 의미는 다음 코드를 보면 쉽게 이해할 수 있다.
public class OuterClass { static int staticVariable = 0; int nonStaticVariable = 0; public static class StaticInnerClass { void accessStaticVariable() { OuterClass.staticVariable += 1; // 외부 클래스 변수에 접근 가능 } void accessNonStaticVariable() { OuterClass.this.nonStaticVariable += 1; // 컴파일 오류 } } public class NonStaticInnerClass { void accessStaticVariable() { OuterClass.staticVariable += 1; // 외부 클래스 변수에 접근 가능 } void accessNonStaticVariable() { OuterClass.this.nonStaticVariable += 1; // 외부 클래스 변수에 접근 가능 } } }
반응형'language > JAVA' 카테고리의 다른 글
추상화(Abstraction), 캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism) (0) 2023.04.25 생성자나 열거타입으로 싱글턴임을 보증하라 (0) 2021.01.29 [이펙티브 자바] 생성자 대신 정적 팩터리 메서드를 고려하라 (0) 2021.01.28 Stream, generate(), limit(), distinct(), sorted() (0) 2021.01.24 JAVA Enum(열거 타입) 값 비교하기 (0) 2021.01.22