프로그래밍/Java

Inner class 정리

개발정리 2021. 9. 10. 16:44

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