ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Inner class와 static 조합
    java 2021. 5. 27. 10:41

    배경

    HashMap 내부를 공부하다보면 수많은 inner class가 정의된 걸 볼 수 있다. Effective Java 아이템 24에서도 inner class에 대한 조언을 주는데 왜 inner class를 사용하며 적절한 사용을 위해 어떤 걸 알아야 하는지 공부해보자!

     

    왜 쓰지?

    돌고돌아 공식문서까지 왔다. 내용을 확인해보자.

    - 어떤 클래스가 한 클래스에서만 유용하게 쓰인다면 물리적으로 하나의 클래스로 묶을 수 있다.

    - private수준에서도 내부클래스는 외부클래스 맴버 또는 메서드에 접근할 수 있기 때문에 캡슐화에 용이하다.

    - 가독성이 좋고 유지보수가 쉬운 코드를 작성할 수 있다.

     

    Map은 key와 value를 논리적으로 하나의 쌍으로 묶은 자료구조다. 상황에 따라 key만 다루고 싶은 경우가 있고 value만 다루고 싶은 경우가 있다. 일반적으로 key와 value를 묶은 entry로 다루는 경우도 많이 있다. 이런 다양한 상황에서 각 기능들을 정의한 클래스를 Map클래스 안에 inner class로 논리적으로 다시 분리한 개념이다. 이런 관점에서 생각해보면 공식문서가 제시한 3가지 장점이 좀 더 와닿는다.

     

     

    Static vs Non-Static

    Static nested class는 다른 top-level클래스처럼 행동한다고 나온다. 즉, 내부적으로 외부클래스의 필드나 메서드에 접근하는 특혜는 없다는 얘기다. 다만, 물리적으로 한 공간에 묶음으로써 코드 가독성 및 유지보수성을 높인다. 추가로 static의 특혜가 있는데 외부에 private static으로 정의된 필드나 메서드에 접근할 수 있다.(non-static도 가능)

     

    반면, inner 클래스는 외부클래스의 필드와 메서드에 접근할 수 있고 그만큼 메모리 비용이 크다. 외부클래스의 자원에 접근할 일이 없는 inner클래스라면 static으로 inner클래스를 정의하라는 내용이 Effetive Java 아이템 24내용이다.

     

     

    HashMap 들여다보기

    Non-Static

    key와 value를 묶어 관리하는 EntrySet Inner class 모습이다. entry를 다루기 위한 메서드를 정의하고 내부적으로 외부 클래스의 자원을 접근하기에 static 키워드가 안 붙은 모습을 볼 수 있다.

     

    Static

    Map의 Entry하나를 표현하는 Node다. 생성할 때 내부적으로 자원을 저장하고 메서드도 외부클래스의 도움을 받지 않는다. 다만, Map에서 쓰이는 고유한 클래스이기 때문에 static nested class로 정의한 걸 확인할 수 있다.

     

     

    마치며

    실전보다는 살짝 공부를 위한 공부 느낌이 있긴한데 나중에 요긴하게 써먹었으면 좋겠다 ^^

    'java' 카테고리의 다른 글

    Stream 정리 및 예제  (0) 2021.05.29
    Optional 정리  (0) 2021.05.28
    Effective Java 모든 객체의 공통 메서드  (0) 2021.05.25
    람다 정리 및 예시  (0) 2021.05.19
    Thread 정리  (0) 2021.05.11

    댓글

Designed by Tistory.