π JAVA/μ΄νν°λΈ μλ°

μ€νΈλ¦Όμ μ£Όμν΄μ μ¬μ©νλΌ - [7μ₯. λλ€μ μ€νΈλ¦Ό(μμ΄ν 45)]
π 1. μ€νΈλ¦Όμ νΉμ§ λ€λμ λ°μ΄ν° μ²λ¦¬ μμ (μμ°¨μ μ΄λ λ³λ ¬μ μ΄λ )μ λκ³ μ μλ° 8μ μ€νΈλ¦Ό APIκ° μΆκ°λμλ€. μ€νΈλ¦Όμ νΉμ§μ μλμ κ°λ€. μ€νΈλ¦Ό μμ λ°μ΄ν° μμλ€μ κ°μ²΄ μ°Έμ‘°λ κΈ°λ³Έ νμ κ°(int, long, double)μ΄λ€. μ€νΈλ¦Ό νμ΄νλΌμΈμ μμ€ μ€νΈλ¦Όμμ μμν΄ μ’ λ¨ μ°μ°(terminal operation)μΌλ‘ λλλ©°, κ·Έ μ¬μ΄μ νλ μ΄μμ μ€κ° μ°μ°(intermediate operation)μ΄ μμ μ μλ€. κ° μ€κ° μ°μ°μ μ€νΈλ¦Όμ μ΄λ ν λ°©μμΌλ‘ λ³νν μ μλ€. μλ₯Ό λ€μ΄, κ° μμμ ν¨μλ₯Ό μ μ©νκ±°λ νΉμ 쑰건μ λ§μ‘± λͺ»νλ μμλ₯Ό κ±Έλ¬λΌ μ μλ€. μ€νΈλ¦Ό νμ΄νλΌμΈμ μ§μ° νκ°(lazy evaluation)λλ€. νκ°λ μ’ λ¨ μ°μ°μ΄ νΈμΆλ λ μ΄λ€μ§λ©°, μ’ λ¨ μ°μ°μ ..

νμ€ ν¨μν μΈν°νμ΄μ€λ₯Ό μ¬μ©νλΌ - [7μ₯. λλ€μ μ€νΈλ¦Ό(μμ΄ν 44)]
π 1. ν¨μν μΈν°νμ΄μ€ μλ°κ° λλ€λ₯Ό μ§μνλ©΄μ μμ ν΄λμ€μ κΈ°λ³Έ λ©μλλ₯Ό μ¬μ μν΄ μνλ λμμ ꡬννλ ν νλ¦Ώ λ©μλ ν¨ν΄μ 맀λ ₯μ΄ ν¬κ² μ€μλ€. μ΄λ₯Ό λ체νλ λ°©λ²μΌλ‘ ν¨μ κ°μ²΄λ₯Ό λ°λ μ μ ν©ν°λ¦¬λ μμ±μλ₯Ό μ 곡νλ λ°©λ²μ΄ μλ€. μ¦, ν¨μ κ°μ²΄λ₯Ό 맀κ°λ³μλ‘ λ°λ μμ±μμ λ©μλλ₯Ό λ λ§μ΄ μ¬μ©νλ κ²μ΄λ€. LinkedHashMapμ removeEldestEntryλ₯Ό μ΄ν΄λ³΄μ. removeEldestEntryλ₯Ό λ€μκ³Ό κ°μ΄ μ¬μ μνλ©΄, 맡μ μμκ° 100κ°κ° λ λλ§λ€ κ°μ₯ μ€λλ μμλ₯Ό νλμ© μ κ±°νλ€. // κΈ°μ‘΄ public class LinkedHashMap extends HashMap implements Map { ... protected boolean removeEldestEntry..

λλ€λ³΄λ€λ λ©μλ μ°Έμ‘°λ₯Ό μ¬μ©νλΌ - [7μ₯. λλ€μ μ€νΈλ¦Ό(μμ΄ν 43)]
λλ€κ° μ΅λͺ ν΄λμ€λ³΄λ€ λμ μ μ€μμ κ°μ₯ ν° νΉμ§μ κ°κ²°ν¨μ΄λ€. κ·Έλ°λ°, μλ°μλ ν¨μ κ°μ²΄λ₯Ό μ¬μ§μ΄ λλ€λ³΄λ€λ λ κ°κ²°νκ² λ§λλ λ°©λ²μ΄ μλλ°, κ·Έκ²μ΄ λ°λ‘ λ©μλ μ°Έμ‘°(method reference)λ€. μ΄λ² κΈμμλ λλ€μ λ©μλ μ°Έμ‘°λ₯Ό λΉκ΅ν΄ λ³΄κ³ μΈμ μ΄λ€ κ²μ μ°λ©΄ μ’μμ§ μμ보λλ‘ νμ. π 1. λλ€μ λ©μλ μ°Έμ‘° public static void main(String[] args) { Map map = new HashMap(); int myKey = 1; int myValue = 3; map.merge(myKey, myValue, (count, incr) -> count + incr); System.out.println(map.get(myKey)); // 3 myValue = 5; ..

μ΅λͺ ν΄λμ€λ³΄λ€λ λλ€λ₯Ό μ¬μ©νλΌ - [7μ₯. λλ€μ μ€νΈλ¦Ό(μμ΄ν 42)]
π 1. μ΅λͺ ν΄λμ€μ λλ€μ μλ°μμ ν¨μ νμ μ ννν λ μΆμ λ©μλλ₯Ό νλλ§ λ΄μ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ€. μ΄λ° μΈν°νμ΄μ€μ μΈμ€ν΄μ€λ₯Ό ν¨μ κ°μ²΄(function object)λΌκ³ νλ©°, νΉμ ν¨μλ λμμ λνλ΄λ λ° μ¬μ©νμλ€. JDK 1.1μ΄ λ±μ₯νλ©΄μ ν¨μ κ°μ²΄λ₯Ό λ§λλ μ£Όμ μλ¨μ μ΅λͺ ν΄λμ€κ° λμλ€. Collections.sort(words, new Comparator() { public int compare(String s1, String s2) { return Integer.compare(s1.length(), s2.length()); } }); νμ§λ§, μμ μ½λμ κ°μ΄ μ΅λͺ ν΄λμ€ λ°©μμ μ½λκ° λ무 κΈΈκΈ° λλ¬Έμ μλ°λ ν¨μν νλ‘κ·Έλλ°μ μ ν©νμ§ μμλ€. κ·Έλμ μλ° 8μ μμ..

μ μνλ €λ κ²μ΄ νμ μ΄λΌλ©΄ λ§μ»€ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλΌ - [6μ₯. μ΄κ±° νμ κ³Ό μ λν μ΄μ (μμ΄ν 41)]
// λ§μ»€ μΈν°νμ΄μ€ public interface MarkerInterfaceEx { } λ§μ»€ μΈν°νμ΄μ€(Marker Interface)λ μ무 λ©μλλ λ΄κ³ μμ§ μκ³ , λ¨μ§ μμ μ ꡬννλ ν΄λμ€κ° νΉμ μμ±μ κ°μ§μ νμν΄ μ£Όλ μΈν°νμ΄μ€λ₯Ό λ§νλ€. μμλ‘ Serializable μΈν°νμ΄μ€κ° μλ€. Serializableμ ꡬνν ν΄λμ€μ μΈμ€ν΄μ€λ ObjectOutputStreamμ ν΅ν΄ μΈ(write) μ μλ€κ³ , μ¦ μ§λ ¬ν(Serialization)ν μ μλ€κ³ μλ €μ€λ€. // λ§μ»€ μ λν μ΄μ public @interface MarkerAnnotationEx { } λ§μ»€ μ λν μ΄μ μ΄ λ±μ₯νλ©΄μ λ§μ»€ μΈν°νμ΄μ€λ₯Ό μ¬μ©ν νμκ° μλ€κ³ μκ°ν μ μλ€. νμ§λ§ μ¬μ€μ΄ μλλ€. μ΄λ² κΈμ ν΅ν΄ λ§..

@Override μ λν μ΄μ μ μΌκ΄λκ² μ¬μ©νλΌ - [6μ₯. μ΄κ±° νμ κ³Ό μ λν μ΄μ (μμ΄ν 40)]
@Override μ λν μ΄μ μ λ©μλ μ μΈμλ§ λ¬ μ μμΌλ©°, μ΄ μ λν μ΄μ μ΄ λ¬λ Έλ€λ κ²μ μμ νμ μ λ©μλλ₯Ό μ¬μ μνμμ λ»νλ€. @Override μ λν μ΄μ μ μΌκ΄λκ² μ¬μ©νλ©΄ μ¬λ¬ κ°μ§ μ λͺ λμ λ²κ·Έλ€μ μλ°©ν΄ μ€λ€. μ΄λ² κΈμ ν΅ν΄ @Override μ λν μ΄μ μ μ¬μ©νμ§ μμμ λμ λ¬Έμ μ κ³Ό @Override μ λν μ΄μ μ μ¬μ©νμ λμ μ₯μ λ° μ¬μ©μ λν΄μ μμ보λλ‘ νμ. π 1. @Override μ λν μ΄μ μ μ¬μ©νμ§ μμμ λμ λ¬Έμ μ public class Bigram { private final char first; private final char second; public Bigram(char first, char second) { this.first = first; this...

λͺ λͺ ν¨ν΄λ³΄λ€ μ λν μ΄μ μ μ¬μ©νλΌ - [6μ₯. μ΄κ±° νμ κ³Ό μ λν μ΄μ (μμ΄ν 39)]
π λͺ λͺ ν¨ν΄μ λ¬Έμ μ μ ν΅μ μΌλ‘ λꡬλ νλ μμν¬κ° νΉλ³ν λ€λ€μΌ ν νλ‘κ·Έλ¨ μμμλ λ± κ΅¬λΆλλ λͺ λͺ ν¨ν΄μ μ μ©ν΄ μλ€. μλ₯Ό λ€μ΄, ν μ€νΈ νλ μμν¬μΈ JUnitμ λ²μ 3κΉμ§ ν μ€νΈ λ©μλ μ΄λ¦μ testλ‘ μμνκ²λ νλ€. ν¨κ³Όμ μΈ λ°©λ²μ΄μ§λ§ μλμ κ°μ 3κ°μ§ ν° λ¨μ μ΄ μλ€. μ€νκ° λλ©΄ μ λλ€. μ€μλ‘ μ΄λ¦μ tsetSafetyOverrideλ‘ μ§μΌλ©΄ μ΄ λ©μλλ 무μλλ€. μ¬λ°λ₯Έ νλ‘κ·Έλ¨ μμμμλ§ μ¬μ©λλ¦¬λΌ λ³΄μ¦ν λ°©λ²μ΄ μλ€. ν΄λμ€ μ΄λ¦μ TestSafetyMechanismsλ‘ μ§μ΄ μ΄ ν΄λμ€μ μ μλ ν μ€νΈ λ©μλλ€μ μννκΈΈ λ°λΌμ§λ§ JUnitμ ν΄λμ€ μ΄λ¦μλ κ΄μ¬μ΄ μλ€. νλ‘κ·Έλ¨ μμλ₯Ό 맀κ°λ³μλ‘ μ λ¬ν λ§λ ν λ°©λ²μ΄ μλ€. νΉμ μμΈλ₯Ό λμ ΈμΌλ§ μ±κ³΅νλ ν μ€νΈκ° μλ€..

νμ₯ν μ μλ μ΄κ±° νμ μ΄ νμνλ©΄ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλΌ - [6μ₯. μ΄κ±° νμ κ³Ό μ λν μ΄μ (μμ΄ν 38)]
π 1. μ΄κ±° νμ μ νμ₯ νμ μμ μ΄κ±° ν¨ν΄κ³Ό λ¬λ¦¬ μ΄κ±° νμ μ νμ₯ν μ μλ€. (μ΄ μ μ μ μΈνκ³ λ κ±°μ λͺ¨λ μν©μμ μ΄κ±° νμ μ΄ νμ μμ μ΄κ±° ν¨ν΄(typesafe enum pattern) λ³΄λ€ μ°μνλ€.) νμ μμ μ΄κ±° ν¨ν΄μ μ΄κ±°ν κ°λ€μ κ·Έλλ‘ κ°μ Έμ¨ λ€μ κ°μ λ μΆκ°νμ¬ λ€λ₯Έ λͺ©μ μΌλ‘ μΈ μ μλ λ°λ©΄, μ΄κ±° νμ μ κ·Έλ κ² ν μ μλ€. μ€κ³κ° μ λͺ» λ κ²μ μλλ€. νμ§λ§ λ€μκ³Ό κ°μ μ΄μ λ‘ λλΆλΆ μν©μμ μ΄κ±° νμ μ νμ₯νλ 건 μ’μ§ μμ μκ°μ΄κΈ° λλ¬Έμ΄λ€ μ΄κ±° νμ μ νμ₯ν μ μλλ‘ μ€κ³ν κ²μ΄λ€. νμ₯ν νμ μ μμλ κΈ°λ° νμ μ μμλ‘ μ·¨κΈνμ§λ§, κΈ°λ° νμ μ μμλ₯Ό νμ₯ν νμ μ μμλ‘ μ·¨κΈν μ μλ 건 μ΄μνκΈ° λλ¬Έμ΄λ€. κΈ°λ° νμ κ³Ό νμ₯λ νμ λ€μ μμ λͺ¨λλ₯Ό..

ordinal μΈλ±μ± λμ EnumMapμ μ¬μ©νλΌ - [6μ₯. μ΄κ±° νμ κ³Ό μ λν μ΄μ (μμ΄ν 37)]
λ°°μ΄μ μΈλ±μ€λ₯Ό μ»κΈ° μν΄ ordinalμ μ°λ κ±°μ μΌλ°μ μΌλ‘ μ’μ§ μμΌλ, λμ EnumMapμ μ¬μ©νλλ‘ νμ. μλμ 2κ°μ§ μν©(μΌμ°¨μ κ΄κ³, λ€μ°¨μ κ΄κ³)μ ν΅ν΄ μ EnumMapμ μ¬μ©ν΄μΌ νλμ§ μμ보λλ‘ νμ. 1. 1μ°¨μ κ΄κ³μμμ EnumMap μλμ Plant ν΄λμ€λ₯Ό ν΅ν΄ μλ¬Όμ μ΄λ¦(name)κ³Ό μμ μ£ΌκΈ°(lifeCycle)λ₯Ό κ°λ¨ν λνλΌ μ μλ€. public class Plant { enum LifeCycle { ANNUAL, PERENNIAL, BIENNIAL } // νν΄μ΄μ΄, μ¬λ¬ν΄μ΄μ΄, λν΄μ΄μ΄ final String name; final LifeCycle lifeCycle; public Plant(String name, LifeCycle lifeCycle) { thi..

λΉνΈ νλ λμ EnumSetμ μ¬μ©νλΌ - [6μ₯. μ΄κ±° νμ κ³Ό μ λν μ΄μ (μμ΄ν 36)]
π 1. λΉνΈ νλ μ΄κ±°ν κ°λ€μ΄ μ£Όλ‘ μ§ν©μΌλ‘ μ¬μ©λ κ²½μ°, μμ μλ κ° μμμ μλ‘ λ€λ₯Έ 2μ κ±°λμ κ³± κ°μ ν λΉν μ μ μ΄κ±° ν¨ν΄μ μ¬μ©νμλ€. (λΉνΈλ§μ€νΉμ μ΄μ©νλ€κ³ ν μ μλ€.) public class Text { public static final int STYLE_BOLD = 1

ordinal λ©μλ λμ μΈμ€ν΄μ€ νλλ₯Ό μ¬μ©νλΌ - [6μ₯. μ΄κ±° νμ κ³Ό μ λν μ΄μ (μμ΄ν 35)]
λλΆλΆμ μ΄κ±° νμ μμλ μμ°μ€λ½κ² νλμ μ μ«κ°μ λμλλ€. κ·Έλ¦¬κ³ λͺ¨λ μ΄κ±° νμ μ ν΄λΉ μμκ° κ·Έ μ΄κ±° νμ μμ λͺ λ²μ§Έ μμΉμΈμ§λ₯Ό λ°ννλ ordinalμ΄λΌλ λ©μλλ₯Ό μ 곡νλ€. κ·Έλμ μ΄κ±° νμ μμμ μ°κ²°λ μ μ«κ°μ΄ νμνλ€λ©΄ ordinal λ©μλλ₯Ό μ¬μ©νλ©΄ λμ§ μμκΉλΌλ μκ°μ ν μ μλ€. κ²°λ‘ λΆν° λ§νμλ©΄ κ·Έλ κ² μ¬μ©νλ©΄ μ λλ€. 'μ κ·Έλ κ² μ¬μ©νλ©΄ μ λλμ§'μ 'κ·Έλ¬λ©΄ μΈμ ordinalμ μ¬μ©ν΄μΌ νλμ§'μ λν΄μ μμ보μ. π 1. μ΄κ±° νμ μμμ μ°κ²°λ μ μ«κ°μ μ»κΈ° μν΄ ordinal λ©μλλ₯Ό μ¬μ©νλ©΄ μ λλ μ΄μ public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONE..

int μμ λμ μ΄κ±° νμ μ μ¬μ©νλΌ - [6μ₯. μ΄κ±° νμ κ³Ό μ λν μ΄μ (μμ΄ν 34)] - (2)
μ΄μ κΈμ ν΅ν΄ 'μ μ μ΄κ±° ν¨ν΄μ λ¨μ , μ΄κ±° νμ μ μ₯μ , μ΄κ±° νμ μ κΈ°λ³Έ μ¬μ©λ²'μ μμ보μλ€. μ΄λ² κΈμμλ μ΄κ±° νμ μ λ€μν κΈ°λ₯λ€μ λν΄μ μμ보λλ‘ νμ. π 1. μμλ³ λ©μλ ꡬν (constant-specific method implementation) μ¬μΉμ°μ° κ³μ°κΈ°μ κ°μ΄ μμλ§λ€ λμμ΄ λ¬λΌμ ΈμΌ νλ κ²½μ°κ° μλ€. κ°μ₯ κ°λ¨νκ² μκ°ν΄ λ³Ό μ μλ κ²μ switchλ¬Έμ ν΅νμ¬ λΆκΈ°νλ λ°©λ²μ΄λ€. public enum Operation { PLUS, MINUS, TIMES, DIVIDE; // μμκ° λ»νλ μ°μ°μ μννλ€. public double apply(double x, double y) { switch(this) { case PLUS: return x + y; case ..