item 24 Jung inchul - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

Effective Java 3e ์•„์ดํ…œ 24๋ฅผ ์š”์•ฝํ•œ ๋‚ด์šฉ ์ž…๋‹ˆ๋‹ค.

์ค‘์ฒฉ ํด๋ž˜์Šค๋Š” ์ž์‹ ์„ ๊ฐ์‹ผ ๋ฐ”๊นฅ ํด๋ž˜์Šค์—์„œ๋งŒ ์“ฐ์—ฌ์•ผ ํ•˜๋ฉฐ, ๊ทธ ์™ธ์˜ ์“ฐ์ž„์ƒˆ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ†ฑ๋ ˆ๋ฒจ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ์ค‘์ฒฉ ํด๋ž˜์Šค์˜ ์ข…๋ฅ˜๋Š” ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค, (๋น„์ •์ ) ๋ฉค๋ฒ„ ํด๋ž˜์Šค, ์ต๋ช… ํด๋ž˜์Šค, ์ง€์—ญ ํด๋ž˜์Šค ์ด๋ ‡๊ฒŒ ๋„ค ๊ฐ€์ง€๋‹ค.

์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค

์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค ์•ˆ์— ์„ ์–ธ๋˜๊ณ , ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ private ๋ฉค๋ฒ„์—๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๋งŒ ์ œ์™ธํ•˜๊ณ ๋Š” ์ผ๋ฐ˜ ํด๋ž˜์Šค์™€ ๋˜‘๊ฐ™๋‹ค. ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ํ”ํžˆ ๋ฐ”๊นฅ ํด๋ž˜์Šค์™€ ํ•จ๊ป˜ ์“ฐ์ผ ๋•Œ๋งŒ ์œ ์šฉํ•œ private ๋„์šฐ๋ฏธ ํด๋ž˜์Šค๋กœ ์“ฐ์ธ๋‹ค.

public class StaticCar {
    static String _where="I am a Car from Germany!";
    Country _country;            // object of inner class country
    StaticCar(){
        _country=new Country();    // instantiate the inner class
    }
    static class Country {       // static member inner class
        String showCountry() {
            return _where;
        }
    }

    public static void main(String[] args) {
    StaticCar myCar= new StaticCar() ;  // instantiated object of class StaticCar
    System.out.print("Access through an Country reference");
    System.out.println(" created in an object of a StaticCar:");
    System.out.println(myCar._country.showCountry());

    // instantiated object of class StaticCar.Country
    StaticCar.Country country= new StaticCar.Country();
    System.out.println("Access through an Country reference that is local:");
    System.out.println(country.showCountry());

    }
}
Access through an Country reference created in an object of a StaticCar:
I am from Germany!
Access through an Country reference that is local:
I am from Germany!

๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค

์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์™€ ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ๊ตฌ๋ฌธ์ƒ ์ฐจ์ด๋Š” ๋‹จ์ง€ static์ด ๋ถ™์–ด ์žˆ๊ณ  ์—†๊ณ  ๋ฟ์ด์ง€๋งŒ, ์˜๋ฏธ์ƒ ์ฐจ์ด๋Š” ์ด์™ธ๋กœ ๊ฝค ํฌ๋‹ค. ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์™€ ์•”๋ฌต์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์—์„œ ์ •๊ทœํ™”๋œ this๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค์˜ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์ •๊ทœํ™”๋œ this๋ž€ ํด๋ž˜์Šค๋ช….this ํ˜•ํƒœ๋กœ ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ๋ช…์‹œํ•˜๋Š” ์šฉ๋ฒ•์„ ๋งํ•œ๋‹ค.

๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์™€ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค ์‚ฌ์ด์˜ ๊ด€๊ณ„๋Š” ๋ฉค๋ฒ„ ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ ํ™•๋ฆฝ ๋˜๋ฉฐ, ๋” ์ด์ƒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ •์˜ํ•  ๋•Œ ์ž์ฃผ ์“ฐ์ธ๋‹ค. ์ฆ‰, ์–ด๋–ค ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ์‹ธ ๋งˆ์น˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•˜๋Š” ๋ทฐ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋น„์Šทํ•˜๊ฒŒ, Set๊ณผ List ๊ฐ™์€ ๋‹ค๋ฅธ ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ๋“ค๋„ ์ž์‹ ์˜ ๋ฐ˜๋ณต์ž๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

public class MySet<E> extends AbstractSet<E> {
    ... // ์ƒ๋žต

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

    private class MyIterator implements Iterator<E> {
    ...
    }
}

๋ฉค๋ฒ„ ํด๋ž˜์Šค์—์„œ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•  ์ผ์ด ์—†๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด static์„ ๋ถ™์—ฌ์„œ ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์ž. static์„ ์ƒ๋žตํ•˜๋ฉด ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค๋กœ์˜ ์ˆจ์€ ์™ธ๋ถ€ ์ฐธ์กฐ๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ˆ˜๊ฑฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

์ต๋ช… ํด๋ž˜์Šค

์ต๋ช… ํด๋ž˜์Šค๋Š” ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋„ ์•„๋‹ˆ๋‹ค. ๋ฉค๋ฒ„์™€ ๋‹ฌ๋ฆฌ, ์“ฐ์ด๋Š” ์‹œ์ ์— ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ค์ง ๋น„์ •์ ์ธ ๋ฌธ๋งฅ์—์„œ ์‚ฌ์šฉ๋  ๋•Œ๋งŒ ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ •์  ๋ฌธ๋งฅ์—์„œ๋ผ๋„ ์ƒ์ˆ˜ ๋ณ€์ˆ˜ ์ด์™ธ์˜ ์ •์  ๋ฉค๋ฒ„๋Š” ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ์ƒ์ˆ˜ ํ‘œํ˜„์„ ์œ„ํ•ด ์ดˆ๊ธฐํ™” ๋œ final ๊ธฐ๋ณธ ํƒ€์ž…๊ณผ ๋ฌธ์ž์—ด ํ•„๋“œ๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

interface Inter {
    public void hi();
}

class Anony {
    public void f() {
        System.out.println("Anony.f() ํ˜ธ์ถœ.");
    }
}

public class Test {
    private Integer number;

    public void nonStaticMethod(){
        Inter ob2 = new Inter() {
            public void hi() {
                System.out.println("๋น„ ์ •์ ๋ฌธ๋งฅ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ" + number);
            }
        };
    }

    public static void staticMethod() {
        Inter ob2 = new Inter() {
            Integer number2 = 1;
            public void hi() {
                System.out.println("์ •์ ๋ฌธ๋งฅ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ" + number); // comile Error
            }
        };
    }

    public static void main(String[] args) throws Exception {
        //Inter ob1 = new Inter(); //Compile Error!!!
        Inter ob2 = new Inter() {
            public void hi() {
                System.out.println("์•ˆ๋…•ํ•˜์‹ญ๋‹ˆ๊นŒ?");
            }
        };

        ob2.hi();

        Anony a1 = new Anony();
        Anony a2 = new Anony() {
            public void f() {
                System.out.println("์ดํžˆํž›.");
            }
        };

        a1.f();
        a2.f();
    }
}

์ •์ ๋ฌธ๋งฅ์—์„œ final ๊ธฐ๋ณธ ํƒ€์ž…๊ณผ ๋ฌธ์ž์—ด ํ•„๋“œ๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ๋Š”?

์ต๋ช… ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋Š” ๊ทธ ์ต๋ช… ํด๋ž˜์Šค๊ฐ€ ์ƒ์œ„ ํƒ€์ž…์—์„œ ์ƒ์†ํ•œ ๋ฉค๋ฒ„ ์™ธ์—๋Š” ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.

์ต๋ช… ํด๋ž˜์Šค์˜ ๋˜ ๋‹ค๋ฅธ ์ฃผ์“ฐ์ž„์€ ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋‹ค.

static List<Integer> intArrayAsList<int[] a) {
    Objects.requireNonNulkl(a);

    // ๋‹ค์ด์•„๋ชฌ๋“œ ์—ฐ์‚ฐ์ž๋ฅผ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด ์ž๋ฐ” 9๋ถ€ํ„ฐ ๊ฐ€๋Šฅํ•˜๋‹ค.
    // ๋” ๋‚ฎ์€ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด <Integer>๋กœ ์ˆ˜์ •ํ•˜์ž.

    return new AbstractList<>() {
    @Override public Integer get(int i) {
        return a[i];
    }

    @Override public Integer set(int i, Integer val) {
        int oldVal = a[i];
        a[i] = val;
        return oldVal;
    }

    @Override public int size() {
        return a.length;
    }
}

์ง€์—ญ ํด๋ž˜์Šค

์ง€์—ญ ํด๋ž˜์Šค๋Š” ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด๋ฉด ์‹ค์งˆ์ ์œผ๋กœ ์–ด๋””์„œ๋“  ์„ ์–ธํ•  ์ˆ˜ ์žˆ๊ณ , ์œ ํšจ ๋ฒ”์œ„๋„ ์ง€์—ญ ๋ณ€์ˆ˜์™€ ๊ฐ™๋‹ค. ๋ฉค๋ฒ„ ํด๋ž˜์Šค ์ฒ˜๋Ÿผ ์ด๋ฆ„์ด ์žˆ๊ณ  ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ต๋ช… ํด๋ž˜์Šค์ฒ˜๋Ÿผ ๋น„ ์ •์  ๋ฌธ๋งฅ์—์„œ ์‚ฌ์šฉ๋  ๋•Œ๋งŒ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ •์  ๋ฉค๋ฒ„๋Š” ๊ฐ€์งˆ ์ˆ˜ ์—†์œผ๋ฉฐ, ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ์งง๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

์ •๋ฆฌ

์ค‘์ฒฉ ํด๋ž˜์Šค์—๋Š” ๋„ค ๊ฐ€์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ ์“ฐ์ž„์ด ๋‹ค๋ฅด๋‹ค. ๋ฉ”์„œ๋“œ ๋ฐ–์—์„œ๋„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์„œ๋“œ ์•ˆ์— ์ •์˜ํ•˜๊ธฐ์—” ๋„ˆ๋ฌด ๊ธธ๋‹ค๋ฉด ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ ๋‹ค. ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๊ฐ๊ฐ์ด ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๋ฉด ๋น„ ์ •์ ์œผ๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ •์ ์œผ๋กœ ๋งŒ๋“ค์ž. ์ค‘์ฒฉ ํด๋ž˜์Šค๊ฐ€ ํ•œ ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ๋งŒ ์“ฐ์ด๋ฉด์„œ ๊ทธ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ง€์ ์ด ๋‹จ ํ•œ ๊ณณ์ด๊ณ  ํ•ด๋‹น ํƒ€์ž…์œผ๋กœ ์“ฐ๊ธฐ์— ์ ํ•ฉํ•œ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ด๋ฏธ ์žˆ๋‹ค๋ฉด ์ต๋ช… ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ง€์—ญ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์ž.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ