λͺ©λ‘π (25)
DevLog πΆ
βοΈ μΆμν π± μΆμνλ, λͺ ννκ² μ΄ν΄νκΈ° μν΄ νΉμ μ μ°¨λ 물체λ₯Ό μλμ μΌλ‘ μλ΅νκ±°λ κ°μΆ€μΌλ‘ 볡μ‘λλ₯Ό 극볡νλ λ°©λ²μ΄λ€. 볡μ‘μ±μ μ΄ν΄νκΈ° μ¬μ΄ μμ€μΌλ‘ λ¨μννλ κ²μ΄ λͺ©μ μ΄λ€. μ§λ ν¬μ€ν λΆν° κ³μ μκΈ°νκ³ μλ 'κ³ μμ΄ μ€λ΅λ°'λΌλ κ²μμ΄λ€. μ μ΄λ―Έμ§λ μ€μ λ‘ κ²μμ νλ μ΄νλ μ₯λ©΄μ΄λ€. μ κ·Έλ¦Όμμ 무μμ΄ λ³΄μ΄λκ°? κ°κ° μλλ₯, μλ°λ₯, μ °νλ₯μ΄λΌκ³ λͺ ννκ² μ‘΄μ¬νλ€. κ·Έλ¬λ, μλλ₯λ, μλ°λ₯λ, μ °νλ₯λ λͺ¨λ κ³ μμ΄λ€. κ·Έλ¦¬κ³ λμμ κ°μ²΄λΌκ³ λ³Ό μ μλ€. μ΄μ κ°μ΄ κ°κ°μ κ°μ²΄λ€μ ‘κ³ μμ΄’λΌκ³ ν λ²μ μ μλ΄λ¦¬λ κ²μ 'μΆμν'λΌκ³ νλ€. κ³ μμ΄λ, 곡ν΅μ μ κ°μ§ κ°μ²΄λ€μ ν¬κ΄ν μ μλ κ°λ μ΄ λλ€. κ·Έλ¦¬κ³ , μ΄λ¬ν ‘κ³ μμ΄’λΌλ κ°λ μ μ μ©νμ¬ λ€μ μλλ₯, μλ°λ₯, μ °νλ₯μΌ..
π¬ λͺ¨λ μλ° μΈ μ‘μ μ±ν° 5μ μ½κ³ μ 리ν κΈμ λλ€. βοΈ νν°λ§ π± ν리λμΌμ΄νΈλ‘ νν°λ§νκΈ° List crews = new ArrayList(); List backendCrews = crews.stream() // λλ€μ μΈμ(λ°±μλ ν¬λ£¨)λ₯Ό λ°μ νΉμ μμλ₯Ό μ ννλ€. .filter(crew -> crew.getCourse() == Course.BACKEND) .collect(Collectors.toUnmodifiableList()); μ§λ μ±ν°μμ μ¬μ©νλ μμ μ΄λ€. μ¬κΈ°μ filter λ©μλλ Predicateλ₯Ό μΈμλ‘ λ°μμ, ν΄λΉ ν리λμΌμ΄νΈμ μΌμΉνλ λͺ¨λ μμλ₯Ό ν¬ν¨νλ μ€νΈλ¦Όμ λ°ννλ€. π± κ³ μ μμ νν°λ§ distinct λ©μλλ₯Ό μ¬μ©νλ©΄ μ€λ³΅μ μ κ±°ν μμλ‘ μ΄λ£¨μ΄μ§ μ€νΈλ¦Όμ λ°..
π¬ λͺ¨λ μλ° μΈ μ‘μ μ±ν° 4μ μ½κ³ μ 리ν κΈμ λλ€. βοΈ μ€νΈλ¦Όμ΄λ? μλ° 8μ μλ‘κ² λ€μ΄μ¨ κΈ°λ₯ μ€, κ°μ₯ ν΅μ¬μ μΈ κΈ°λ₯μ΄λΌκ³ λ§ν΄λ 무방νλ€. 컬λ μ λ°μ΄ν°μ λ°λ³΅μ λμμ£Όκ³ , λ©ν° μ€λ λ μ½λ μμ΄ λ³λ ¬μ±μ ꡬνν μ μλ μμ£Ό μ μ©ν μΉκ΅¬μ΄λ€. λν, filterλ sorted, map, collect κ°μ μ°μ°μ ‘high-level building block’μ΄λΌκ³ νλλ°, μ€νΈλ¦Όμ λ§μΉ λΈλ‘μ²λΌ μκ³ , 쑰립ν μ μλ€λ μ μ΄ ν° νΉμ§μ΄λ€. βοΈ stream λ©μλ π± μ€νΈλ¦Όμ΄λ, λ°μ΄ν° μ²λ¦¬ μ°μ°μ μν΄ μμ€μμ μΆμΆλ μ°μλ μμμ΄λ€. 1) μ°μλ μμ 컬λ μ μ λ°μ΄ν°μ λν μλ£κ΅¬μ‘°μλ€λ©΄, μ€νΈλ¦Όμ μ΄λ₯Ό μ΄λ€ μμΌλ‘ κ³μ°ν μ§μ λν΄ λ€λ£¬λ€. λ κ°μ§ λͺ¨λ, μ°μλ κ° μ§ν©μ μΈν°ν..
π¬ λͺ¨λ μλ° μΈ μ‘μ μ±ν° 3μ μ½κ³ μ 리ν κΈμ λλ€. βοΈ λ©μλ μ°Έμ‘° λ©μλ μ°Έμ‘°λ₯Ό μ¬μ©ν΄μ λ μ½λλ₯Ό κ°κ²°νκ² λ§λ€μ΄λ³΄μ. // Before inventory.sort((a1, a2) -> a1.getCourse().compareTo(a2.getCourse())); // After inventory.sort(comparing(Crew::getCourse)); λ©μλ μ΄λ¦μ νμ©νλ, 'λ©μλ μ°Έμ‘°'λ₯Ό νμ©νλ©΄ λλ€λ₯Ό λ κ°κ²°νκ² ννν μ μλ€. λ©μλ μ°Έμ‘°λ₯Ό νκΈ° μν΄μλ ꡬλΆμ(::)λ₯Ό νμ©νλ€. π± λ©μλ μ°Έμ‘°λ₯Ό λ§λλ λ°©λ² 1. μ μ λ©μλ μ°Έμ‘° (args) -> ClassName.staticMethod(args) ==> ClassName::staticMethod 2. λ€μν νμμ μΈμ€ν΄..
π± λ€μ΄κ°κΈ° μ λ³Έ μ± μμλ μ΄μν λλΌμ μ¨λ¦¬μ€ μ΄μΌκΈ°μ κ°μ²΄μ κ°λ μ μ λͺ©μμΌ μ€λͺ νλ€. μ¨λ¦¬μ€λ μ’μ μμ μ§λ§, μ§λ μκ°μ μκ°νλ "κ³ μμ΄ μ€λ΅λ°" κ²μμ λ§μΆ°μ μ΄λ² μ±ν°λ νμ΄λκ° μμ μ΄λ€. βοΈ κ°μ²΄μ νλκ³Ό μν κ³ μμ΄ μ€λ΅λ° κ²μμμ, κ°κ°μ λ₯λ₯μ΄λ€μ μ½μ€ν¬μ μ μ μ μλ€. κ·Έλ¦¬κ³ μ΄λ€ μ½μ€ν¬μ μ λμ§μ λ°λΌμ μ»μ μ μλ ν¨κ³Όκ° λ¬λΌμ§λ€. λ§μ½, μλ°λ₯μ΄ μ΄ν₯ μνΈλ₯Ό μ μλ€κ³ μκ°ν΄λ³΄μ. μλ°λ₯μ μ΄ν₯ μνΈλ₯Ό μ μμΌλ‘μ μμ°μλκ° μ¦κ°νκ² λλ€. μλ°λ₯μ κΈ°μ‘΄ μμ° μλλ 10μ΄λΌκ³ κ°μ νμ λ, μ΄ν₯ μνΈλ₯Ό μ μΌλ©΄ μμ° μλκ° 20μ΄ λλ κ²μ΄λ€. μ΄λ° μμΌλ‘ μλ°λ₯μ μμ° μλλ μ΄λ€ μ½μ€ν¬μ μ λλμ λ°λΌμ λ¬λΌμ§λ€. = μ¦, μλ°λ₯μ΄ μ΄λ€ νλμ νλμ§μ λ°λΌμ μλ°λ₯μ ..
π¬ μ΄ν©ν°λΈμλ° μμ΄ν 4μ μ½κ³ μ 리ν κΈμ λλ€. βοΈ μ νΈλ¦¬ν° ν΄λμ€ μΈμ€ν΄μ€ λ©μλμ λ³μκ° μμ΄, μ μ λ©μλμ μ μ λ³μλ§ μ 곡νλ ν΄λμ€λ₯Ό μλ―Ένλ€. κ°μΈμ μΈ μ견μ΄μ§λ§, μ νΈλ¦¬ν° ν΄λμ€λ κ°μ²΄μ§ν₯μ κ΄μ μμ λ΄€μ λ μ’λ€κ³ λ 보기 νλ€ κ² κ°λ€. μλ°μμ μ 곡νλ μ νΈλ¦¬ν° ν΄λμ€ μ€μ λνμ μΈ κ²λ€μ λͺ κ°μ§ μ΄ν΄λ³΄μ. public class Arrays { private Arrays() {} ... } μ μ½λλ java.utilμ μ‘΄μ¬νλ Arrays ν΄λμ€μ΄λ€. μ΄ ν΄λμ€λ λ°°μ΄μ μ‘°μνκΈ° μν΄ μ λ ¬μ΄λ κ²μ λ±μ ν μ μλ λ€μν μ μ λ©μλλ€μ μ 곡νλ€. (λλΆλΆμ λ©μλλ μ€λ²λ‘λ©λμ΄ μμ΄μ μ€μ λ‘ νλ μν μ κ²μ, 볡μ¬, μ±μ°κΈ°, μ λ ¬... λ±λ±μ΄ μλ€) μ νΈλ¦¬ν° ν΄λμ€λ‘ μ¬..
π± λ€μ΄κ°κΈ° μ κ°μ¬μ€, μΌλͺ ν λΌμ± μ΄λΌκ³ λΆλ¦¬λ μ± μ΄λ€. λ 벨 1μ΄ λλκΈ° μ μ μ½κ³ μΆμλλ° κ·Έλ¬μ§ λͺ»ν΄μ λ°©ν κΈ°κ° λμ κ°λ¨νκ² μ½κ³ μ 리ν΄λ³΄μλ€. κ°μ²΄μ§ν₯μ λν΄ κ³΅λΆνκΈ° μ μλ ‘λ΄κ° μ κ°μ²΄μ§ν₯μ μΌλ‘ μ½λλ₯Ό μμ±ν΄μΌ νμ§…? μ μΊ‘μν μ΄λ° κ±Έ μ§μΌμΌ νμ§?’λΌλ μκ°μ λ§μ΄ νμλλ°, κ°μ²΄μ§ν₯μ μ€κ³κ° μ μ½λμ μ μ§λ³΄μμ±μ μ¦κ°μν€λμ§, μ΄λ€ μΈ‘λ©΄μμ μ’μμ§ λ΄ λλ¦λλ‘ λ¨Έλ¦Ώμμμ μ μκ° λλ κ² κ°μμ μ¬λ°λ€. μλ° κ°λ°μλ‘μ λͺ¨λ μ€κ³μ κΈ°λ³Έμ κ°μ²΄μ§ν₯μ λν μ΄ν΄κ° μλκΉ… λΌλ μκ°μ΄ λ€μλ€! κ° μ₯μ λν΄μ λ΄ λλ¦μ 견ν΄λ₯Ό λ΄μ μ 리ν΄λ³΄κ³ μ νλ€. βοΈ νλ ₯ κ΄κ³ νν κ°μ²΄μ§ν₯ μΈκ³λ₯Ό λ§ν λ μ€μΈκ³λ₯Ό λͺ¨λ°©νκΈ° μν¨μ΄λΌκ³ λ§μ΄λ€ λ΅νλ€. (λ μμ μ΄ μ± μ μ½κΈ° μ μ κ·Έλ¬λ€) ..
π¬ μ΄ν©ν°λΈμλ° μμ΄ν 3μ μ½κ³ μ 리ν κΈμ λλ€. βοΈ μ±κΈν΄ μΈμ€ν΄μ€ μΈμ€ν΄μ€λ₯Ό μ€μ§ νλλ§ μμ±ν μ μλ ν΄λμ€. λ©λͺ¨λ¦¬ λλΉλ₯Ό μ€μΌ μ μκ³ , λ°μ΄ν°λ₯Ό 곡μ ν μ μλ€. λ€λ§, κ²°ν©λκ° μ¦κ°νλ©° ν΄λΌμ΄μΈνΈμ ν μ€νΈκ° μ΄λ €μμ§ μ μλ€λ μ μ΄ μ‘΄μ¬νλ€. -> μΈμ€ν΄μ€λ₯Ό ꡬνν΄μ λ§λ μ±κΈν΄μ΄ μλλΌλ©΄, μ±κΈν΄ μΈμ€ν΄μ€λ₯Ό mock κ°μ²΄λ‘ λ체νκΈ°κ° νλ€κΈ° λλ¬Έμ΄λ€. π¬ μμ±νλ λ°©λ² 1. μμ±μλ₯Ό λͺ¨λ privateλ‘ λ§λ€κ³ , μΈμ€ν΄μ€μ μ μΌν μ κ·Όμλ₯Ό public staticμΌλ‘ μμ±νκΈ° public class Crew { public static final Crew INSTANCE = new Crew(); private Crew() { ... } public void hello() {...} }..
π¬ μ΄ν©ν°λΈμλ° μμ΄ν 2μ μ½κ³ μ 리ν κΈμ λλ€. βοΈ ν΄λμ€μ λ©€λ² λ³μκ° λ§μ κ²½μ°, κ°μ²΄λ₯Ό μ΄λ»κ² μμ±ν μ μμκΉ? - μμ±μλ₯Ό μ¬λ¬ μ’ λ₯λ‘ λμ΄μ, νμν 맀κ°λ³μλ§μ μ¬μ©νλ μμ±μ μ¬λ¬ κ°λ₯Ό λ§λ€ μ μλ€ - κ·Έλ¬λ, μ΄ λ°©λ²μ νλκ° λμ΄λλ©΄ κ·Έλ§νΌ κ΄λ¦¬ν΄μΌ νλ μμ±μκ° λ§μμ§κΈ° λλ¬Έμ μ’μ§ μλ€. - λν, 맀κ°λ³μλ‘ μ λ¬νλ©΄ (μΈν 리μ μ΄μ νλΌλ―Έν° ννΈλ₯Ό μ¬μ©νμ§ μλ μ΄μ) κ° κ°μ μλ―Έλ₯Ό νλμ μμλ³΄κΈ°κ° νλ€κ³ , λ²κ·Έκ° λ°μν νλ₯ μ΄ λμμ§ μ μλ€. public class Crew { private String name; private int age; private String course; private String nickname; } μμλ‘, ν¬λ£¨μ λν μ 보λ₯Ό λνλ΄λ..
π¬ μ΄ν©ν°λΈμλ° μμ΄ν 78μ μ½κ³ μ 리ν κΈμ λλ€. μ΄λ² μ 리λ μ± κ³Όλ λ€μ λ€λ₯Έ λ΄μ©μ λλ€ :D κ°λ μμ²΄κ° μ΄λ €μ΄ λΆλΆμ΄μ΄μ μ± μ μ½μΌλ©° κΆκΈν λΆλΆμ λν΄ μ‘°μ¬νλ μμΌλ‘ μμ±νμμ΅λλ€ πβοΈ λ νΈμΌλ‘ λλμ΄μ ν¬μ€ν ν μμ μ λλ€! μμ§ λ―Έν‘ν μ μ΄ λ§μμ, λ μ νν μ 보λ₯Ό μκ² λλ©΄ λ³Έ κ²μκΈμ μμ ν μμ μ λλ€. βοΈ λκΈ°νλ 무μμΌκΉ? νμ¬ μμ‘μ΄ 10000μμ΄κ³ , κ°κ° 1000μμ© μ κΈνλ νμλ₯Ό 5000λ², 1000μμ© μΆκΈνλ νμλ₯Ό 5000λ² λ°λ³΅νλ€κ³ κ°μ ν΄λ³΄μ. λμΌν κΈμ‘μ λν΄ λμΌν νμλ‘ 5000λ²μ© μ§ννκΈ° λλ¬Έμ, μ°λ¦¬μ μμ‘μλ λ³νκ° μλ€κ³ μκ°ν μ μλ€. [synchronized ν€μλ λΆμ΄κΈ° μ ] public class Main { public stati..