• 티스토리 홈
starryeye
  • 프로필사진
    starryeye
    • 분류 전체보기 (189)
      • C++ (17)
      • Java (24)
      • OOP (5)
      • Spring Reactive Stack (12)
        • Reactive Streams (3)
        • Netty (4)
        • Reactor (1)
        • Webflux (3)
        • DB, Cache 연동 (1)
      • Spring (90)
        • Core (17)
        • MVC (33)
        • Client (2)
        • Security (4)
        • DB, Cache 연동 (33)
      • DataBase (12)
        • RDBMS (2)
        • NoSQL (10)
      • Message Broker (6)
      • Web (4)
      • Network (4)
      • 대규모 시스템 설계 (15)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • [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일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바