Skip to content

Latest commit

 

History

History
52 lines (38 loc) · 2.96 KB

멤버_클래스는_되도록_static으로_만들라.md

File metadata and controls

52 lines (38 loc) · 2.96 KB

아이템 24. 멤버 클래스는 되도록 static으로 만들라

중첩 클래스(nested class)

  • 다른 클래스 안에 정의된 클래스
  • 정적 멤버 클래스, (비정적) 멤버 클래스, 익명 클래스, 지역 클래스
  • 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외의 쓰임새가 있다면 톱레벨 클래스로 만든다.

정적 멤버 클래스

  • 다른 클래스 안에 선언된다.
  • 바깥 클래스의 private 멤버에도 접근할 수 있다.
  • public 도우미 클래스(helper class)에 자주 사용된다.

비정적 멤버 클래스

  • 어댑터를 정의할 때 자주 쓰인다.
    • 어댑터 패턴: 호환되지 않는 인터페이스들을 연결하는 디자인 패턴. 기존의 클래스를 수정하지 않고도, 특정 인터페이스를 필요로 하는 코드에서 사용할 수 있게 해준다. [출처]
    • 바깥 클래스의 인스턴스를, 완전히 다른 클래스의 인스턴스처럼 보이도록 한다.

비정적 멤버 클래스 사용의 문제점

  • 비정적 멤버 클래스의 인스턴스는 바깥 클래스의 인스턴스와 숨은 참조를 갖게 된다.
    • 비정적 멤버 클래스는 바깥 인스턴스 없이는 생성할 수 없다.
    • 클래스명.this로 바깥 인스턴스의 메서드를 호출하거나 참조를 가져올 수 있다.
  • 중첩 클래스에서 바깥 인스턴스에 접근할 일이 없다면 무조건 static을 붙여서 정적 멤버 클래스로 만들자.
    • 문제점 1: 숨은 참조 → 문제의 원인을 찾기가 어려움
    • 문제점 2: GC가 바깥 클래스의 인스턴스 수거 X → 메모리 누수 발생
  • static을 빠뜨렸을 때 동작한다고 하더라도 치명적인 문제점이 발생할 수 있으므로 주의

익명 클래스

  • 선언과 동시에 인스턴스가 만들어지며, 코드의 어디서든 만들 수 있다.
  • 이름이 없기 때문에 이름을 쓸 일이 있다면(instanceof 등) 적합하지 않다.
  • 단 한 곳에만 쓰임 + 해당 타입으로 쓰기에 적합한 클래스나 인터페이스가 이미 존재할 때 사용
  • 가독성을 위해 짧게 작성해야 한다.
  • 람다로 대체 가능한 경우도 있다.

지역 클래스

  • 가장 드물게 사용된다.
  • 이름이 있고 반복적으로 사용이 가능하다.
  • 지역 변수를 선언할 수 있는 곳이라면 어디든 선언할 수 있다.
  • 가독성을 위해 짧게 작성해야 한다.
  • 단 한 곳에만 쓰임 + 적합한 클래스나 인터페이스가 없을 때 사용

결론

  • static 멤버 클래스: 바깥 클래스에 접근할 일이 없을 때
  • nonstatic 멤버 클래스: 바깥 클래스의 인스턴스를 참조할 때
  • 익명 클래스: 한 곳에서만 쓰이고 해당 타입의 클래스, 인터페이스가 이미 있을 때
  • 지역 클래스: 한 곳에서만 쓰이고 해당 타입의 클래스, 인터페이스가 없을 때