본문 바로가기
공부/이펙티브자바

[이펙티브자바]item 24.멤버 클래스는 되도록 static으로 만들라.

by 띵커베르 2023. 2. 8.
728x90
  • 중첩 클래스는 4 가지가 있다. 이중 2가지 정도만 살펴보면될듯,
  • 정적 멤버 클래스
    • 바깥 클래스와 함께 쓰일 때만 유용한 public 도우미 클래스
    • outer class 와 별개라 생각하면 될듯
  • 비정적 멤버 클래스
    • 바깥 클래스와 암묵적으로 연결된다.
    • 멤버 클래스에서 바깥 인스턴스를 참조할 필요가 없다면 무조건 정적 멤버 클래스로 만들자
  • 익명 클래스
    • 람다를 지원하기전에 즉석에서 작은 함수 객체나 처리 객체를 만들 때 사용.
    • 쓰이는 시점과 동시에 인스턴스가 만들어진다.
  • 지역 클래스
    • 가장 드물게 사용되며, 지역 변수를 사용하는 곳이면 어디든 정의해 사용할 수 있다.
public class OuterClass {
    private static int outerVariable = 20;
    private int variable = 10;
    //정적 멤버 클래스
    //독립적이며, 정적필드에 접근가능.
    static private class StaticNestedClass {
        public void accessOuterVariable() {
            System.out.println(outerVariable);
//            System.out.println(variable);
        }
    }

    //비정적 멤버 클래스
    void printNumber() {
        InnerClass innerClass = new InnerClass();
    }
    private class InnerClass {
        public void accessOuterVariable() {
            System.out.println(variable);
            System.out.println(outerVariable);
            OuterClass.this.printNumber();
        }
    }

    //익명 클래스
    public Runnable method() {
        return new Runnable() {
            public void run() {
                System.out.println(variable);
                System.out.println(outerVariable);
            }
        };
    }

    //지역 클래스
    public void method_local_inner() {
        class MethodLocalInnerClass {
            public void accessOuterVariable() {
                System.out.println(variable);
                System.out.println(outerVariable);
            }
        }
        MethodLocalInnerClass inner = new MethodLocalInnerClass();
        inner.accessOuterVariable();
    }

    public static void main(String[] args) {
        //정적 멤버 클래스
        StaticNestedClass staticNestedClass = new StaticNestedClass();
        staticNestedClass.accessOuterVariable();
        System.out.println("==============");
        //비정적 멤버 클래스
        InnerClass innerClass = new OuterClass().new InnerClass();
        innerClass.accessOuterVariable();
        System.out.println("==============");
        //익명 클래스
        OuterClass outer = new OuterClass();
        Runnable runnable = outer.method();
        runnable.run();
        System.out.println("==============");
        //지역 클래스
        OuterClass outerClass = new OuterClass();
        outerClass.method_local_inner();
    }
}
  • 비정적 멤버 클래스는 어댑터를 정의할 떄 자주 쓰인다. 아래는 어댑터 패턴 예제
interface Target {
    void request();
}

class Adaptee {
    void specificRequest() {
        System.out.println("Adaptee specificRequest");
    }
}

class Adapter implements Target {
    private Adaptee adaptee = new Adaptee();
    public void request() {
        adaptee.specificRequest();
    }
}

class Client {
    public static void main(String[] args) {
        Target target = new Adapter();
        target.request();
    }
}
728x90

댓글