ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Inner class 정리
    프로그래밍/Java 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
Designed by Tistory.