Item24. 멤버 클래스는 가능한 한 static 으로 해 주세요

  • by
  • 정적 멤버 클래스
    • 외부 클래스에서 사용하는 경우에만 유용한 공용 도우미 클래스 예) Calculator.Operation.PLUS
  • 비정적 멤버 클래스
    • 외부 클래스의 인스턴스와 암시적으로 연결한다.

    • 어댑터를 정의할 때 자주 사용됩니다.

    • 멤버 클래스에서 외부 인스턴스를 참조할 필요가 없는 경우 무조건 정적 멤버 클래스로 설정합시다.

  • 익명 클래스
    • 외부 클래스의 멤버가 아니라, 사용되는 시점과 동시에 인스턴스가 작성된다.

    • 비정적 컨텍스트에서 사용되는 경우에만 외부 클래스의 인스턴스를 참조할 수 있습니다.

    • Java 람다를 지원하기 전에 즉시 작은 함수 객체 또는 처리 객체를 만들 때 사용했습니다.

    • 정적 팩토리 메소드를 작성할 때도 사용할 수 있습니다.

  • 지역 수업
    • 가장 드물게 사용됩니다.

    • 로컬 변수를 선언하는 장소라면 어디에서나 로컬 클래스를 정의하여 사용할 수 있다.

    • 읽기 쉽도록 짧게 써야 합니다.

중첩된 클래스(멤버 클래스): 클래스를 구성하는 요소. 클래스내의 필드와 메소드와 같이, 클래스내에서 선언된 클래스.

중첩된 클래스는 클래스 내에서 선언된 클래스이고 멤버 클래스는 클래스의 구성 요소인 클래스이고 메서드 내에서 선언된 클래스는 멤버 클래스가 아닙니다.

지역 변수 전역 변수와 마찬가지로 전역 변수는 클래스 내에서 사용되는 멤버 변수입니다.

익명 클래스와 로컬 클래스는 멤버 클래스가 아닙니다.


static member class

  • Outterclass의 InnerClass는 정적 멤버 클래스입니다.

    정의된 범위는 클래스 레벨에서 정의됩니다.

  • 정적 멤버 클래스는 외부 클래스(OutterClass)의 정적 필드에 액세스할 수 있습니다.

  • 외부 클래스의 인스턴스가 필요하지 않습니다.

    외부 클래스와 독립적입니다.

    static에서 Java가 실행되면 먼저 static 메모리에 생성되기 때문에
  • OutterClass로 쓸 때 유용합니다.

    독립적으로 쓰는 것보다 OutterClass를 거쳐 쓸 때 편리합니다.


member class

  • 비정적 클래스는 static 없는 멤버 클래스
  • 외부 클래스(OutterClass)에 대한 인스턴스 참조가 발생합니다.

  • 외부 클래스가 없으면 자신을 만들 수 없습니다.

  • new OutterClass(). new InnerClass(); 로 생성하는 방법은 드물고, 외부 클래스 메소드로 비정적 클래스를 생성해 사용하는 것이 많다.

  • 비정적 클래스도, 외부 클래스의 멤버 요소인 필드나 메소드에 액세스 해 사용할 수 있다.


이와 같이 외부 클래스의 요소를 특별히 사용하지 않는 OutterClass 인스턴스를 작성할 필요가 없는 중첩된 클래스이면, 시간적으로도 공간적으로도 비효율적이다.

비정적 클래스보다 정적 클래스로 선언하고 독립적으로 사용해야 합니다.


annonynous class

  • 클래스 이름 없이 정의되는 즉시 인스턴스에서 생성되는 클래스
  • Lambda가 추가되기 전에 자주 사용되었지만 이제는 메소드 참조로 많이 대체되었습니다.


local class

  • 가장 유용하지 않은 로컬 클래스
  • MyClass의 멤버는 number 및 doSomething 메서드이며 LocalClass가 아닙니다.

  • LocalClass는 doSomething 메서드의 로컬 클래스입니다.

어댑터 패턴

기존 코드를 클라이언트가 사용하는 인터페이스 구현으로 대체하는 패턴

클라이언트가 사용하는 인터페이스를 따르지 않는 기존 코드를 재사용할 수 있도록 합니다.

호환되지 않는 인터페이스를 사용하는 클라이언트를 그대로 사용할 수 있습니다.

이렇게 하면 클라이언트와 구현된 인터페이스를 분리할 수 있으며, 미래의 인터페이스가 변경되더라도 변경 이력이 어댑터에 캡슐화되므로 클라이언트는 변경할 필요가 없습니다.


  • Client에는 Target 인터페이스를 구현한 Adaptee가 필요합니다.

  • Adaptee는 Target 인터페이스를 구현하지 않습니다.

  • Adaptee는 벌써 개발이 완료되고 있어 사용중이므로 변경하는 것이 적절하지 않은 상황이다.


휴대전화 충전기 안에 USB-A 단자로 충전하는 휴대전화 충전 잭이 있다고 가정하면, 220V로 충전하기 위해 충전 어댑터를 사용하여 전기 코드에 충전할 수 있습니다.

필요에 따라 충전하는 인터페이스를 바꾸는 역할을 어댑터가 실시한다.


https://johngrib.github.io/wiki/pattern/adapter/

어댑터 패턴(Adapter Pattern)

서로 일치하지 않는 인터페이스를 가지는 클래스를 함께 동작시킨다

johngrib.github.io

https://www.inflearn.com/course/%EC%9D%B4%ED%8E%99%ED%8B%B0%EB%B8%8C-%EC%9E%90%EB%B0%94- 2/dashboard

이펙티브 자바 완벽 공략 2부 – 인프라 강의

자바 학습의 종반왕 ‘이펙티브 자바’를 보다 쉽고 완벽하게 배웁니다.

이 강의를 수강하면 자바 프로그래밍 지식과 기술뿐만 아니라 학습 능력도 향상됩니다.

www.inflearn.com