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

Effective Java 3e μ•„μ΄ν…œ 22λ₯Ό μš”μ•½ν•œ λ‚΄μš© μž…λ‹ˆλ‹€.

μΈν„°νŽ˜μ΄μŠ€λŠ” μžμ‹ μ„ κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” νƒ€μž… 역할을 ν•œλ‹€. 그리고 μΈν„°νŽ˜μ΄μŠ€λŠ” 였직 이 μš©λ„λ‘œλ§Œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

이 지침에 λ§žμ§€ μ•ŠλŠ” 예둜 μ†Œμœ„ μƒμˆ˜ μΈν„°νŽ˜μ΄μŠ€λΌλŠ” 것이 μžˆλ‹€. μƒμˆ˜ μΈν„°νŽ˜μ΄μŠ€λž€ λ©”μ„œλ“œ 없이 μƒμˆ˜λ₯Ό λœ»ν•˜λŠ” static final ν•„λ“œλ‘œλ§Œ 가득 μ°¬ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§ν•œλ‹€.

public interface PhysicalConstants {
    // μ•„λ³΄κ°€λ“œλ‘œ 수 (1/λͺ°)
    static final double AVOGADROS_NUMBER = 6.022_140_857e23;

    // 볼츠만 μƒμˆ˜ (J/K)
    static final double BOLTZMANN_CONSTANT = 1.380_648)52e-23;

    // μ „μž μ§ˆλŸ‰ (kg)
    static final double ELECTRON_MASS = 9.109_383_56e-31;

}

ν΄λž˜μŠ€κ°€ μ–΄λ–€ μƒμˆ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λ“  μ‚¬μš©μžμ—κ²ŒλŠ” μ•„λ¬΄λŸ° μ˜λ―Έκ°€ μ—†λ‹€. 였히렀 μ‚¬μš©μžμ—κ²Œ ν˜Όλž€μ„ 주기도 ν•˜λ©°, 더 μ‹¬ν•˜κ²ŒλŠ” ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œκ°€ λ‚΄λΆ€ κ΅¬ν˜„μ— ν•΄λ‹Ήν•˜λŠ” 이 μƒμˆ˜ 듀에 μ’…μ†λ˜κ²Œ ν•œλ‹€.

final이 μ•„λ‹Œ ν΄λž˜μŠ€κ°€ μƒμˆ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œλ‹€λ©΄ λͺ¨λ“  ν•˜μœ„ 클래슀의 이름 곡간이 κ·Έ μΈν„°νŽ˜μ΄μŠ€κ°€ μ •μ˜ν•œ μƒμˆ˜λ“€λ‘œ μ˜€μ—Όλ˜μ–΄ 버린닀.

μ˜€μ—Όλœλ‹€λŠ” μ˜λ―ΈλŠ” μ•„λž˜μ™€ 같은 μ˜λ―Έκ°€ μ•„λ‹κΉŒ?

public interface TestInterFace {
    static String NAME = "incheol";
}

public class InterfaceImpl implements TestInterFace {

    public static void main(String[] args) {
        System.out.println(NAME);
    }
}

// result : incheol

public class InterfaceImpl implements TestInterFace {
    public static final String NAME = "test";

    public static void main(String[] args) {
        System.out.println(NAME);
    }
}

// result : test

java.io.ObjectStreamContants λ“±, μžλ°” ν”Œλž«νΌ λΌμ΄λΈŒλŸ¬λ¦¬μ—λ„ μƒμˆ˜ μΈν„°νŽ˜μ΄μŠ€κ°€ λͺ‡ 개 μžˆμœΌλ‚˜, μΈν„°νŽ˜μ΄μŠ€λ₯Ό 잘λͺ» ν™œμš©ν•œ μ˜ˆμ΄λ‹ˆ 따라 ν•΄μ„œλŠ” μ•ˆλœλ‹€.

public interface ObjectStreamConstants {

    /**
        * Magic number that is written to the stream header.
        */
    final static short STREAM_MAGIC = (short)0xaced;

    /**
        * Version number that is written to the stream header.
        */
    final static short STREAM_VERSION = 5;

    /* Each item in the stream is preceded by a tag
        */

    /**
        * First tag value.
        */
    final static byte TC_BASE = 0x70;

    /**
        * Null object reference.
        */
    final static byte TC_NULL =         (byte)0x70;

    /**
        * Reference to an object already written into the stream.
        */
    final static byte TC_REFERENCE =    (byte)0x71;

    /**
        * new Class Descriptor.
        */
    final static byte TC_CLASSDESC =    (byte)0x72;

    /**
        * new Object.
        */
    final static byte TC_OBJECT =       (byte)0x73;

    /**
        * new String.
        */
    final static byte TC_STRING =       (byte)0x74;

    /**
        * new Array.
        */
    final static byte TC_ARRAY =        (byte)0x75;

    ...
}

μƒμˆ˜λ₯Ό κ³΅κ°œν•  λͺ©μ μ΄λΌλ©΄ 더 ν•©λ‹Ήν•œ 선택지가 λͺ‡ 가지 μžˆλ‹€. νŠΉμ • ν΄λž˜μŠ€λ‚˜ μΈν„°νŽ˜μ΄μŠ€μ™€ κ°•ν•˜κ²Œ μ—°κ΄€λœ μƒμˆ˜λΌλ©΄ κ·Έ ν΄λž˜μŠ€λ‚˜ μΈν„°νŽ˜μ΄μŠ€ μžμ²΄μ— μΆ”κ°€ν•΄μ•Ό ν•œλ‹€. λͺ¨λ“  숫자 κΈ°λ³Έ νƒ€μž…μ˜ λ°•μ‹± ν΄λž˜μŠ€κ°€ λŒ€ν‘œμ μœΌλ‘œ, Integer와 Double에 μ„ μ–Έλœ MIN_VALUE와 MAX_VALUE μƒμˆ˜κ°€ 이런 μ˜ˆλ‹€.

public final class Integer extends Number implements Comparable<Integer> {
    /**
        * A constant holding the minimum value an {@code int} can
        * have, -2<sup>31</sup>.
        */
    @Native public static final int   MIN_VALUE = 0x80000000;

    /**
        * A constant holding the maximum value an {@code int} can
        * have, 2<sup>31</sup>-1.
        */
    @Native public static final int   MAX_VALUE = 0x7fffffff;

    ...
}

μ ν•©ν•œ μƒμˆ˜λΌλ©΄ μ—΄κ±° νƒ€μž…μœΌλ‘œ λ§Œλ“€μ–΄ κ³΅κ°œν•˜λ©΄ λœλ‹€. 그것도 μ•„λ‹ˆλΌλ©΄, μΈμŠ€ν„΄μŠ€ν™” ν•  수 μ—†λŠ” μœ ν‹Έλ¦¬ν‹° ν΄λž˜μŠ€μ— λ‹΄μ•„ κ³΅κ°œν•˜μž.

pakcage ...constantutilityclass;

public class PhysicalConstants {
    private PhysicalConstants() {} // μΈμŠ€ν„΄μŠ€ν™” 방지

    // μ•„λ³΄κ°€λ“œλ‘œ 수 (1/λͺ°)
    static final double AVOGADROS_NUMBER = 6.022_140_857e23;

    // 볼츠만 μƒμˆ˜ (J/K)
    static final double BOLTZMANN_CONSTANT = 1.380_648)52e-23;

    // μ „μž μ§ˆλŸ‰ (kg)
    static final double ELECTRON_MASS = 9.109_383_56e-31;
}

μœ ν‹Έλ¦¬ν‹° 클래슀의 μƒμˆ˜λ₯Ό 빈번히 μ‚¬μš©ν•œλ‹€λ©΄ 정적 μž„ν¬νŠΈ(static import)ν•˜μ—¬ 클래슀 이름을 μƒλž΅ν•  수 μžˆλ‹€.

import static ...PhysicalConstants.*;

public class Test {
    double atoms(double mols) {
    return AVOGADROS_NUMBER * mols;
    }

    ...
}

정리

μΈν„°νŽ˜μ΄μŠ€λŠ” νƒ€μž…μ„ μ •μ˜ν•˜λŠ” μš©λ„λ‘œλ§Œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. μƒμˆ˜ 곡개용 μˆ˜λ‹¨μœΌλ‘œ μ‚¬μš©ν•˜μ§€ 말자.

⚠️ **GitHub.com Fallback** ⚠️