tonykang22 / study

0 stars 0 forks source link

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

Open callmeaxxe opened 1 year ago

callmeaxxe commented 1 year ago

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

멤버란 클래스의 구성 요소 (필드, 메서드, 내부 클래스, ..) 중첩 클래스는 특정 클래스 내부에 또 다른 클래스가 정의된 것을 의미 클래스 내부에 정의되어 있다고 해서 모든 중첩 클래스가 멤버 클래스가 되는건 아니다

핵심 정리: 네 종류의 중첩 클래스와 각각의 쓰임

이 아이템에서는 멤버 클래스에 초점을 맞추고 있고, 비정적 멤버 클래스 대신에 정적 멤버 클래스를 쓰라는 것이 핵심

정적 멤버 클래스

public class OutterClass {

    private static int number = 10;

    // 정적 멤버 클래스    
    static private class InnerClass {
        void doSomething() {
            System.out.println(number);
        }
    }

    public static void main(String[] args) {
        InnerClass innerClass = new InnerClass();
        innerClass.doSomething();

    }
}

비정적 멤버 클래스

public class OutterClass {

    private int number = 10;

    void printNumber() {
        InnerClass innerClass = new InnerClass();
    }

    // 비정적 멤버 클래스
    private class InnerClass {
        void doSomething() {
            System.out.println(number);
            OutterClass.this.printNumber();
        }
    }

    public static void main(String[] args) {
        InnerClass innerClass = new OutterClass().new InnerClass();
        innerClass.doSomething();
    }

}

익명 클래스

지역 클래스

public class MyClass {

    private int number = 10;

    void doSomething() {
        // 지역 클래스
        class LocalClass {
            private void printNumber() {
                System.out.println(number);
            }
        }

        LocalClass localClass = new LocalClass();
        localClass.printNumber();
    }

    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        myClass.doSomething();
    }
}
callmeaxxe commented 1 year ago

완벽 공략 39. 어댑터 패턴

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

image

public class MySet<E> extends AbstractSet<E> {
    @Override
    public Iterator<E> iterator() {
        return new MyIterator();
    }

    @Override
    public int size() {
        return 0;
    }

    private class MyIterator implements Iterator<E> {

        @Override
        public boolean hasNext() {
            return false;
        }

        @Override
        public E next() {
            return null;
        }
    }

}
public class AdapterInJava {

    public static void main(String[] args) {
        try(InputStream is = new FileInputStream("number.txt");
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader reader = new BufferedReader(isr)) {
            while(reader.ready()) {
                System.out.println(reader.readLine());
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}