- μ΄μΉνλμ Javaμμ enumμ λ¬Έμμ΄ λΉκ΅λ‘ μΈν΄ μλ² μ΄λλμ λ°λ³΅μ½λμμλ μ±λ₯μ μ ν΄μν€λ μμΈμ΄ λ μ μλ€.
μ±λ₯μ μν μ€κ³
μλλ‘μ΄λ μ ν리μΌμ΄μ
μ μλλ λΉ¨λΌμΌλ§ ν©λλ€. μ, ν¨μ¨μ μ΄μ΄μΌ νλ€κ³ λ§νλ μͺ½μ΄ λ μ νν λ―μΆλ€μ. λ€μ λ§ν΄, μ νλ μ»΄ν¨ν
νμμ λ°μ΄ν° μ μ₯μ, μμ νλ©΄, κ°κ°ν λ°°ν°λ¦¬ μλͺ
κ°μ λͺ¨λ°μΌ μ₯μΉ νκ²½μμ κ°λ₯ν ν ν¨μ¨μ μΌλ‘ μ€νλμ΄μΌ νλ€λ κ²μ
λλ€.
μ ν리μΌμ΄μ
μ κ°λ°ν λμλ μ΄κ²μ λͺ
μ¬νμΈμ. λμΌμ½μ΄ κ°λ° μ»΄ν¨ν°μμ μ€ννλ μλ¬λ μ΄ν°μμλ μΆ©λΆν μ μλν μ§λ λͺ¨λ₯΄μ§λ§, λͺ¨λ°μΌ κΈ°κΈ°μμ μ€νν λμ 그리 μ λμ§ μμ κ²μ
λλ€. β μ΅κ³ μ±λ₯μ λͺ¨λ°μΌ κΈ°κΈ°λΌλ μΌλ°μ μΈ λ°μ€ν¬ν μμ€ν
μ μ±λ₯μ λ°λΌμ‘μ μλ μμ΅λλ€. κ·Έλ° μ΄μ λ‘, λ€μν λͺ¨λ°μΌ κΈ°κΈ°λ€μκ² μ΅μμ μ±λ₯μ 보μ₯νκΈ° μν΄ μ¬λ¬λΆμ ν¨μ¨μ μΈ μ½λλ₯Ό μμ±νλλ‘ μ΄μ¬ν λ
Έλ ₯νμ
μΌ ν©λλ€.
μΌλ°μ μΌλ‘, λΉ λ₯΄κ±°λ ν¨μ¨μ μΈ μ½λλΌλ κ²μ λ©λͺ¨λ¦¬ ν λΉμ μ΅μν νκ³ , κ½ μ§μΈ μ½λλ₯Ό μμ±νκ³ , νΉμ νλ‘κ·Έλλ° μΈμ΄λ μ μ¬μ μΌλ‘ μ±λ₯μ λ¬Έμ κ° λ λ§ν νλ‘κ·Έλλ° μ΄λ²λ€μ νΌνλ κ²μ λ§ν©λλ€. κ°μ²΄μ§ν₯ μ©μ΄λ‘ λ§νμλ©΄, μ΄λ¬ν μΌμ΄ κ°μ₯ λΉλ²ν μΌμ΄λλ κ³³μ λ©μλ λ 벨μ΄λ©°, μ΄μ λΉμ·νκ² μ€μ μ½λ λΌμΈλ€κ³Ό λ°λ³΅λ¬Έ λ±μμ λ°μν©λλ€ .
μ΄ λ¬Έμλ λ€μ μ£Όμ λ€μ λ€λ£Ήλλ€:
μκ°
κ°μ²΄ μμ±μ νΌνλΌ
λ€μ΄ν°λΈ λ©μλλ₯Ό μ¬μ©νλΌ
μΈν°νμ΄μ€λ³΄λ€ κ°μ μ°κ²°μ μ νΈνλΌ
κ°μ μ°κ²°λ³΄λ€ μ μ μ°κ²°μ μ νΈνλΌ
λ΄λΆμμ Getter/Setter μ¬μ©μ νΌνλΌ
νλ μ°Έμ‘°λ€μ μΊμνλΌ
μμλ₯Ό Finalλ‘ μ μΈνλΌ
μ£Όμ κΉκ² ν₯μλ λ°λ³΅λ¬Έ(Enhanced For Loop)μ μ¬μ©νλΌ
μ΄κ±°ν(Enum)μ νΌνλΌ
λ΄λΆ ν΄λμ€μ ν¨κ» ν¨ν€μ§ λ²μλ₯Ό μ¬μ©νλΌ
Floatλ₯Ό νΌνλΌ
μ±λ₯ μμ μ«μ λͺ κ°
λ§Ίλ λ§
μκ°
μμ μ νμ μμ€ν
μλ λ κ°μ§ κΈ°λ³Έ κ·μΉμ΄ μμ΅λλ€:
νμ μλ μΌμ νμ§ λ§ κ²
λ©λͺ¨λ¦¬ ν λΉμ νΌν μ μλ€λ©΄ κ·Έλ κ² ν κ²
μλμ λͺ¨λ νλ€μ μ΄ λ κ°μ§ κΈ°λ³Έ μ£Όμλ₯Ό λ°λ₯΄κ³ μμ΅λλ€.
λκ΅°κ°λ μ΄ νμ΄μ§μμ λ§μ μ‘°μΈμ΄ "μ£λΆλ₯Έ μ΅μ ν"λ λ§μ°¬κ°μ§λΌκ³ λΉνν μ§λ λͺ¨λ¦
λλ€. λ―Έμ μ΅μ νλ λλ‘λ ν¨μ¨μ μΈ λ°μ΄ν° ꡬ쑰μ μκ³ λ¦¬μ¦μ κ°λ°νλ κ²μ λ μ΄λ ΅κ² λ§λ λ€λ κ²μ μ¬μ€μ
λλ€. νμ§λ§, νΈλμ
κ³Ό κ°μ μλ² λλ κΈ°κΈ°μμλ λλ‘λ λ³λ€λ₯Έ μ νμ§κ° μμ΅λλ€. μλ₯Ό λ€μ΄, μ¬λ¬λΆμ΄ λ°μ€ν¬νμμ κ°λ°ν λ μκ°νλ VMμ μ±λ₯μ λν κ°μ μ μλλ‘μ΄λμλ μ μ©νλ€λ©΄, μ¬λ¬λΆμ μμ€ν
λ©λͺ¨λ¦¬λ₯Ό μμ§ν΄λ²λ¦¬λ μ½λλ₯Ό κ½€λ μμ±ν΄ λ²λ¦¬κ³ λ§ κ²μ
λλ€. μ΄κ²μ μ¬λ¬λΆμ μ ν리μΌμ΄μ
μ΄ λ°λ₯μ κΈ°λλ‘ ν μ μμ΅λλ€ β μμ€ν
μμ λμνλ λ€λ₯Έ νλ‘κ·Έλ¨λ€μκ² λ¬΄μμ νλμ§ μ§μΌλ³΄μΈμ!
μ΄κ²μ΄ λ°λ‘ μ΄ κ°μ΄λλΌμΈμ΄ μ€μν μ΄μ μ
λλ€. μλλ‘μ΄λμ μ±κ³΅μ μ¬λ¬λΆμ μ ν리μΌμ΄μ
μ΄ μ 곡νλ μ¬μ©μ κ²½ν(UX)μ λ¬λ Έκ³ , μ¬μ©μ κ²½νμ΄λ κ²μ μ¬λ¬λΆμ μ½λκ° λΉ λ₯΄κ³ νννκ² λ°μνλμ§, μλλ©΄ λλ¦¬κ³ λ¬΄κ±°μ΄μ§μ λ¬λ Έμ΅λλ€. λͺ¨λ μ°λ¦¬μ μ ν리μΌμ΄μ
λ€μ κ°μ μ₯μΉμμ λμν κ²μ΄κΈ° λλ¬Έμ, μ΄λ€ μλ―Έλ‘, μ°λ¦¬ λͺ¨λ ν¨κ» μ΄ κ²λ€μ μ§ν€λλ‘ μ΅μ μ λ€ν΄μΌ ν©λλ€. μ΄ λ¬Έμλ₯Ό μ΄μ λ©΄νλ₯Ό λΈ λ λ°°μμΌλ§ νλ λλ‘κ΅ν΅λ²μ΄λΌκ³ μκ°νμΈμ: λͺ¨λ μ΄κ° λ°λ₯΄λ©΄ λ¬Έμ μμ΄ μννκ² μ§λ§, λ°λ₯΄μ§ μλλ€λ©΄ μ¬κ³ κ° λ κ²μ²λΌ λ§μ
λλ€.
μμΈν λ΄μ©μ λ€λ£¨κΈ° μ μ, κ°λ¨ν μ£Όμμ¬νμ
λλ€: μλ μ€λͺ
λ λλΆλΆμ μ΄μλ€μ VMμ΄ JIT μ»΄νμΌλ¬μ΄λ μλλ ν¨κ³Όμ μ
λλ€. κ°μ κΈ°λ₯μ μννλ λ λ©μλκ° μκ³ interpret λ°©μμμ foo()μ μ€νμλκ° bar()λ³΄λ€ λΉ λ₯΄λ€λ©΄, μ»΄νμΌ λ λ²μ μμλ μλ§ foo()κ° bar()κ³Ό λΉμ·νκ±°λ λ λΉ λ₯Έ μλλ₯Ό 보μ¬μ€ κ²μ
λλ€. μ»΄νμΌλ¬κ° μ¬λ¬λΆμ "ꡬν΄μ€"κ²μ΄λΌλκ° μΆ©λΆν λΉ λ₯΄κ² λ§λ€μ΄μ€ κ²μ΄λΌκ³ μμ‘΄νλ 건 νλͺ
νμ§ λͺ»νλ€λ κ²μ΄μ£ .
κ°μ²΄ μμ±μ νΌνλΌ
κ°μ²΄μ μμ±μ κ²°μ½ κ³΅μ§κ° μλλλ€. μμ κ°μ²΄λ€μ μν΄ μ°λ λ-λΉ(per-thread) ν λΉ νμ μ¬μ©νλ μΈλν(generational) GCλ λ λμ λΉμ©μΌλ‘ ν λΉ ν μ μμ§λ§, λ©λͺ¨λ¦¬λ₯Ό ν λΉνλ€λ κ²μ λ©λͺ¨λ¦¬λ₯Ό ν λΉνμ§ μλ κ² λ³΄λ€ μΈμ λ λ λμ λΉμ©μ΄ λλλ€.
λ§μ½ μ¬μ©μ μΈν°νμ΄μ€ 루νμμ κ°μ²΄λ₯Ό ν λΉνλ€λ©΄, μ£ΌκΈ°μ μΌλ‘ κ°λΉμ§ 컬λ μ
μ κ°μνκ² λ κ²μ΄κ³ μ¬μ©μ κ²½νμ μμ΄μ μ‘°κ·Έλ§ν "λΈκΎΉμ§(κ±°λΆν¨)"μ λ§λ€κ² λ κ²λλ€.
κ·Έλ¬λ―λ‘, νμλ‘ νμ§ μλ κ°μ²΄ μμ±μ νΌν΄μΌ ν©λλ€. λμμ΄ λ λͺ κ°μ§ μμ λ€μ΄ μμ΅λλ€.
μ
λ ₯ λ°μ΄ν° μ
μμ λ¬Έμμ΄μ μΆμΆν λ, λ³΅μ¬ μμ±λ κ² λμ μλ³Έ λ°μ΄ν°μ λΆλΆλ¬Έμμ΄μ λ°μΌμμμ€. μλ‘μ΄ String κ°μ²΄κ° λ§λ€μ΄μ‘λλΌλ μλ³Έ λ°μ΄ν°μ char[]μ 곡μ ν κ²μ
λλ€.
λ¬Έμμ΄μ λ°ννλ λ©μλκ° μκ³ κ·Έ κ²°κ³Όκ° μΈμ λ StringBufferμ λν΄μ§κ² λλ κ²½μ°μ μλ€λ©΄, μ§§μ μλͺ
μ μμ κ°μ²΄λ₯Ό μμ±νλ λμ μ§μ μ μΌλ‘ λν΄μ§λ λ°©μμΌλ‘ μλ³μμ ꡬνλ°©μμ λ°κΎΈμΈμ.
μ’ λ κΈμ§μ μΈ μμ΄λμ΄λ λ€μ°¨μ λ°°μ΄μ λ³λ ¬μ λ¨μΌ μΌ μ°¨μ λ°°μ΄λ‘ μλΌλ΄λ κ²μ
λλ€:
int λ°°μ΄μ Integer λ°°μ΄λ³΄λ€ λ μ’μ΅λλ€λ§, μ΄κ²μΌλ‘ λν intνμ λ λ³λ ¬ λ°°μ΄μ΄ (int,int) κ°μ²΄μ λ°°μ΄λ³΄λ€ λ λ§μ΄ ν¨κ³Όμ μ΄λΌλ μ¬μ€μ μΆλ‘ ν μ μμ΅λλ€.
λ§μ½ (Foo,Bar) ννλ‘ μ μ₯νλ 컨ν
μ΄λλ₯Ό ꡬνν νμκ° μλ€λ©΄, μ§μ λ§λ (Foo,Bar) κ°μ²΄μ λ¨μΌ λ°°μ΄λ³΄λ€ λ κ°μ λ³λ ¬ Foo[] μ Bar[] λ°°μ΄μ΄ μΌλ°μ μΌλ‘ λμ± λ μ’λ€λ κ²μ κΈ°μ΅νμμμ€. (λ¬Όλ‘ , λ€λ₯Έ μ½λλ€μ΄ μ κ·Όν΄μΌ νλ APIλ₯Ό μ€κ³ν λμλ μμΈκ° μμ΅λλ€; μ΄ κ²½μ° μμ μλ ν₯μμ λ
Έλ¦¬λ κ² λ³΄λ€ μ’μ APIμ€κ³κ° νμ μ’μ΅λλ€. κ·Έλ¬λ μ¬λ¬λΆμ λ΄λΆ μ½λλ₯Ό μμ±ν λμλ κ°λ₯ν ν ν¨μ¨μ μΈ μ½λκ° λλλ‘ ν΄μΌ νκ² μ΅λλ€.)
μΌλ°μ μΌλ‘, κ°λ₯νλ€λ©΄ μ§§μ μλͺ
μ μμ κ°μ²΄ μμ±μ νΌνμμμ€. λ μ μ κ°μ²΄λ€μ λ§λ λ€λ κ²μ μ¬μ©μ κ²½νμ μ§μ μ μΈ μν₯μ μ£Όλ κ°λΉμ§ 컬λ μ
μ€μ¬μ€μ λ»ν©λλ€.
λ€μ΄ν°λΈ λ©μλλ₯Ό μ¬μ©νλΌ
λ¬Έμμ΄μ μ²λ¦¬ν λ, String.indexOf(), String.lastIndexOf() μ κ·Έ λ°μ νΉλ³ν λ©μλλ₯Ό μ¬μ©νλ κ²μ μ£Όμ νμ§ λ§μμμ€. μ΄ λ©μλλ€μ λ체μ μΌλ‘, μλ° λ£¨νλ‘ λ κ² λ³΄λ€ λλ΅ 10-100λ°° λΉ λ₯Έ C/C++ μ½λλ‘ κ΅¬νμ΄ λμ΄μμ΅λλ€.
μ΄ μ‘°μΈμ λ°λμ μΈ‘λ©΄μ λ€μ΄ν°λΈ λ©μλλ₯Ό νΈμΆνλ κ²μ΄ interpretλ°©μμ λ©μλ νΈμΆλ³΄λ€ λ λΉμ©μ΄ λλ€λ κ²μ
λλ€. νΌν μ μλ€λ©΄, μ¬μν κ³μ°μλ λ€μ΄ν°λΈ λ©μλλ₯Ό μ¬μ©νμ§ λ§μμμ€.
μΈν°νμ΄μ€λ³΄λ€ κ°μ μ°κ²°μ μ νΈνλΌ
μ¬λ¬λΆμ΄ HashMap κ°μ²΄λ₯Ό νλ κ°μ§κ³ μλ€κ³ ν©μλ€. μ¬λ¬λΆμ HashMapμ΄λ μ λ€λ¦ Map μΌλ‘ μ μΈμ ν μ μμ΅λλ€.
Map myMap1 = new HashMap();
HashMap myMap2 = new HashMap();
μ΄λ€κ²μ΄ λ μ’μκ°μ?
μ ν΅μ μΈ μ§νμμλ Mapμ μ¬μ©ν΄μΌ νλ€κ³ ν κ²μ
λλ€. Map μΈν°νμ΄μ€λ₯Ό ꡬνν μ΄λ€ κ²μΌλ‘λΌλ ꡬν체λ₯Ό λ°κΏ μ μκΈ° λλ¬Έμ
λλ€. μ ν΅μ μΈ μ§νλ μ ν΅μ μΈ νλ‘κ·Έλλ°μλ λ§μ΅λλ€λ§, μλ² λλ μμ€ν
μλ κ·Έλ€μ§ λλ¨νμ§ μμ΅λλ€. μΈν°νμ΄μ€ μ°Έμ‘°λ₯Ό ν΅ν΄ νΈμΆνλ κ²μ λͺ
νν μ°Έμ‘°λ₯Ό ν΅ν κ°μ λ©μλ νΈμΆλ³΄λ€ 2λ°° λ μμλ μ μμ΅λλ€.
μ¬λ¬λΆμ΄ νλ μΌμ μ ν©νμ¬ HashMapμ¬μ©μ μ ννλ€λ©΄ MapμΌλ‘ νΈμΆνλ κ²μ κ±°μ κ°μΉκ° μμ΅λλ€. μ½λλ₯Ό 리ν©ν°λ§ ν΄ μ£Όλ IDEμ κ°λ₯μ±μ κ³ λ €ν΄ λ³΄λλΌλ, MapμΌλ‘ νΈμΆνλ κ²μ ν° κ°μΉκ° μμ΅λλ€. μ¬λ¬λΆμ΄ μ½λμ λ°©ν₯μ νμ νμ§ λͺ»νλ€ ν΄λ λ§μ
λλ€. (λ€μκΈ μ΄μ§λ§, κ³΅μ© APIλ μμΈμ
λλ€: μμ μ±λ₯ κ³ λ €λ³΄λ€ μ’μ APIκ° μΈμ λ μΌλΈμ
λλ€.)
κ°μ μ°κ²°λ³΄λ€ μ μ μ°κ²°μ μ νΈνλΌ
λ§μ½ κ°μ²΄μ νλμ μ κ·Όν νμκ° μλ€λ©΄, μ¬λ¬λΆμ λ©μλλ₯Ό μ μ (static)μΌλ‘ λ§λμΈμ. κ°μ λ©μλ ν
μ΄λΈμ νμλ‘ νμ§ μκΈ° λλ¬Έμ κ·Έκ² λ λΉ λ₯΄κ² λΆλ €μ§λλ€. λν, λ©μλ μλ³μλ₯Ό λ³΄κ³ λ©μλ νΈμΆμ΄ κ°μ²΄μ μνλ₯Ό λ°κΏ μ μλ€κ³ λ§ν μ μμΌλ―λ‘, μ’μ κ΄μ΅μ΄ λ©λλ€.
λ΄λΆμμ Getter/Setter μ¬μ©μ νΌνλΌ
C++μ κ°μ λ€μ΄ν°λΈ μΈμ΄μμ νλμ μ§μ μ μΌλ‘ μ κ·Όνλ κ² (μ. i = mCount) λ³΄λ€ getterλ₯Ό μ¬μ©νλ κ² (i = getCount())μ μΌλ°μ μΈ κ΄μ΅μ
λλ€. μ΄ λ°©λ²μ C++μμλ νλ₯ν μ΅κ΄μ
λλ€. μλνλ©΄ νμ μ κ·Όμ inlineν ν μ μλ μ»΄νμΌλ¬λ₯Ό μ¬μ©νκ³ μκ³ , νλμ μ κ·Όμ μ ννκ±°λ λλ²κ·Έ ν΄μΌ νλ€λ©΄ μΈμ λ μ½λλ₯Ό μΆκ°ν μ μκΈ° λλ¬Έμ
λλ€.
μλλ‘μ΄λμμλ λμ μκ°μ
λλ€. κ°μ λ©μλ νΈμΆμ μΈμ€ν΄μ€ νλ μ°Έμ‘°λ³΄λ€ λ λΉμ©μ΄ λμ΅λλ€. μΌλ°μ μΈ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ° κ΄μ΅μ λ°λ₯΄κ±°λ, κ³΅μ© μΈν°νμ΄μ€μμ getter, setterμ κ°μ§λ κ²μ μ΄μΉμ λ§μ΅λλ€. κ·Έλ¬λ ν΄λμ€ λ΄λΆμμλ μΈμ λ μ§μ μ μΌλ‘ νλ μ κ·Όμ ν΄μΌν©λλ€.
νλ μ°Έμ‘°λ€μ μΊμνλΌ
κ°μ²΄μ νλμ μ κ·Όνλ κ²μ μ§μ λ³μμ μ κ·Όνλ κ² λ³΄λ€ λ λ립λλ€. μ΄λ κ² μμ±νλ κ² λμ :
for (int i = 0; i < this.mCount; i++)
dumpItem(this.mItems[i]);
μ΄λ κ² νμμμ€:
int count = this.mCount;
Item[] items = this.mItems;
for (int i = 0; i < count; i++)
dumpItems(items[i]);
(λ©€λ² λ³μλΌλ κ²μ λͺ
νν νκΈ° μν΄ λͺ
μμ μΈ "this"λ₯Ό μ¬μ©νκ³ μμ΅λλ€.)
μ μ¬ν κ°μ΄λλΌμΈμ, κ²°μ½ "for"λ¬Έμ λ λ²μ§Έ 쑰건μμ λ©μλλ₯Ό νΈμΆνμ§ λ§λΌλ κ²μ
λλ€. μλ₯Ό λ€μ΄, λ€μ μ½λλ κ°λ¨νκ² int κ°μΌλ‘ μΊμ¬ ν μ μλ κ²½μ°μμλ ν° λλΉκ° λλ getCount()λ©μλλ₯Ό λ§€λ² λ°λ³΅ λ§λ€ μ€ννκ² λ©λλ€:
for (int i = 0; i < this.getCount(); i++)
dumpItems(this.getItem(i));
μΈμ€ν΄μ€ νλλ₯Ό νλ² μ΄μ μ κ·Όν΄μΌ νλ€λ©΄, μ§μ λ³μλ₯Ό λ§λλ κ² λν μ’μ μκ°μ
λλ€. μλ₯Ό λ€μ΄:
protected void drawHorizontalScrollBar(Canvas canvas, int width, int height) {
if (isHorizontalScrollBarEnabled()) {
int size = mScrollBar.getSize(false);
if (size <= 0) {
size = mScrollBarSize;
}
mScrollBar.setBounds(0, height - size, width, height);
mScrollBar.setParams(
computeHorizontalScrollRange(),
computeHorizontalScrollOffset(),
computeHorizontalScrollExtent(), false);
mScrollBar.draw(canvas);
}
}
mScrollBar λ©€λ² νλμ λ€ κ°μ λΆλ¦¬λ μ°Έμ‘°κ° μμ΅λλ€. μ§μ μ€ν λ³μλ‘ mScrollBarλ₯Ό μΊμ± ν¨μΌλ‘μ¨, λ€ κ°μ λ©€λ² νλ μ°Έμ‘°κ° λμ± ν¨μ¨μ μΈ λ€ κ°μ μ€ν λ³μ μ°Έμ‘°λ‘ λ°λμμ΅λλ€.
λ§λΆμ¬ λ§νμλ©΄, λ©μλ μΈμλ€μ μ§μ λ³μμ κ°μ μ±λ₯ νΉμ±μ κ°μ§λλ€.
μμλ₯Ό Finalλ‘ μ μΈνλΌ
ν΄λμ€μ μλ¨μ μλ λ€μ μ μΈμ κ³ λ €ν΄ λ΄
μλ€:
static int intVal = 42;
static String strVal = "Hello, world!";
μ»΄νμΌλ¬λ ν΄λμ€κ° μ²μ μ¬μ©λ λ μ€ννκ² λλ <clinit>λΌ λΆλ¦¬λ 'ν΄λμ€ μ΄κΈ°ν λ©μλ'λ₯Ό μμ±ν©λλ€. μ΄ λ©μλκ° intValμ 42 κ°μ μ μ₯νκ³ , strValμλ ν΄λμ€νμΌ λ¬Έμ μμ ν
μ΄λΈλ‘λΆν° μ°Έμ‘°λ₯Ό μΆμΆνμ¬ μ μ₯ν©λλ€. λμ€μ μ°Έμ‘°λ λ μ΄ κ°λ€μ νλ μ°Έμ‘°λ‘ μ κ·Όλ©λλ€.
μ΄λ₯Ό "final" ν€μλλ‘ ν₯μμν¬ μ μμ΅λλ€:
static final int intVal = 42;
static final String strVal = "Hello, world!";
ν΄λμ€λ λμ΄μ <clinit> λ©μλλ₯Ό νμλ‘ νμ§ μμ΅λλ€. μλνλ©΄ μμλ€μ VMμ μν΄ μ§μ μ μΌλ‘ λ€λ£¨μ΄ μ§λ 'ν΄λμ€νμΌ μ μ νλ μ΄κΈ°μ'μ λ€μ΄κ°κΈ° λλ¬Έμ
λλ€.intValμ μ½λ μ κ·Όμ μ§μ μ μΌλ‘ μ μ κ° 42λ₯Ό μ¬μ©ν κ²μ΄κ³ , strValλ‘μ μ κ·Όμ νλ μ°Έμ‘°λ³΄λ€ μλμ μΌλ‘ μ λ ΄ν "λ¬Έμμ΄ μμ" λͺ
λ Ήμ μ¬μ©νκ² λ κ²μ
λλ€.
"final"μΌλ‘ λ©μλλ ν΄λμ€μ μ μΈμ νλ κ²μ μ¦κ°μ μΈ μ±λ₯ μ΄λμ μ£Όμ§λ λͺ»νμ§λ§, νΉμ ν μ΅μ νλ₯Ό κ°λ₯νκ² ν©λλ€. μλ₯Ό λ€μ΄, μ»΄νμΌλ¬κ° μλΈν΄λμ€μ μν΄ μ€λ²λΌμ΄λλ μ μλ "getter"λ©μλλ₯Ό μκ³ μλ€λ©΄, λ©μλ νΈμΆμ inlineν ν μ μμ΅λλ€.
μ¬λ¬λΆμ λν μ§μ λ³μλ₯Ό finalλ‘ μ μΈν μ μμ΅λλ€. νμ§λ§ μ΄κ²μ κ²°μ μ μΈ μ±λ₯ μ΄λμ μμ΅λλ€. μ§μ λ³μμλ μ€μ§ μ½λλ₯Ό λͺ
νν νκΈ° μν΄μ "final"μ μ¬μ©ν©λλ€ (λλ μλ₯Ό λ€μ΄ μ΅λͺ
λ΄λΆ ν΄λμ€λ₯Ό μ¬μ©ν΄μΌ νλ€λ©΄ κ°λ₯).
μ£Όμ κΉκ² ν₯μλ λ°λ³΅λ¬Έ(Enhanced For Loop)μ μ¬μ©νλΌ
ν₯μλ λ°λ³΅λ¬Έ(λλ‘ "for-each"λ‘ μλ €μ§ λ°λ³΅λ¬Έ)μ Iterable μΈν°νμ΄μ€λ₯Ό ꡬνν 컬λ μ
λ€μ μν΄ μ¬μ©λ μ μμ΅λλ€. μ΄λ¬ν κ°μ²΄λ€λ‘, λ°λ³΅μλ hasNext() μ next()μ νΈμΆνλ μΈν°νμ΄μ€λ₯Ό λ§λ€κΈ° μν΄ ν λΉλ©λλ€. ArrayListμ κ²½μ° μ¬λ¬λΆμ΄ μ§μ νμνλ κ²μ΄ μ’μ μ μμ΅λλ€λ§, λ€λ₯Έ 컬λ μ
λ€μμλ ν₯μλ λ°λ³΅λ¬Έ κ΅¬λ¬Έμ΄ λͺ
μμ μΈ λ°λ³΅μμ μ¬μ©κ³Ό λλ±ν μ±λ₯μ 보μ¬μ€λλ€.
κ·ΈλΌμλ, λ€μ μ½λλ‘ ν₯μλ λ°λ³΅λ¬Έμ λ§μ‘±μ€λ¬μ΄ μ¬μ©λ²μ λ³Ό μ μμ΅λλ€:
public class Foo {
int mSplat;
static Foo mArray[] = new Foo[27];
public static void zero() {
int sum = 0;
for (int i = 0; i < mArray.length; i++) {
sum += mArray[i].mSplat;
}
}
public static void one() {
int sum = 0;
Foo[] localArray = mArray;
int len = localArray.length;
for (int i = 0; i < len; i++) {
sum += localArray[i].mSplat;
}
}
public static void two() {
int sum = 0;
for (Foo a: mArray) {
sum += a.mSplat;
}
}
}
zero() λ λ°λ³΅λλ λ§€ μ£ΌκΈ°λ§λ€ μ μ νλλ₯Ό λ λ² λΆλ₯΄κ³ λ°°μ΄μ κΈΈμ΄λ₯Ό νλ² μ»μ΅λλ€.
one() μ μ°Έμ‘°λ₯Ό νΌνκΈ° μν΄ μ§μ λ³μλ‘ λͺ¨λ κ²μ λμ΄λμ΅λλ€.
two() λ μλ° μΈμ΄μ 1.5λ²μ μμ μκ°λ ν₯μλ λ°λ³΅λ¬Έ ꡬ문μ μ¬μ©ν©λλ€. μ»΄νμΌλ¬μ μν΄ μμ±λ μ½λλ λ°°μ΄ μ°Έμ‘°μ λ°°μ΄μ κΈΈμ΄λ₯Ό μ§μ λ³μλ‘ λ³΅μ¬ν΄μ£Όμ΄, λ°°μ΄μ λͺ¨λ μμλ₯Ό νμνλλ° μ’μ μ νμ΄ λ μ μμ΅λλ€. μ£Ό 루ν λ΄μ μΆκ°μ μΈ μ§μ μ½κΈ°/μ μ₯μ΄ λ§λ€μ΄μ§κ³ (λͺ
λ°±νκ² "a"μ μ μ₯), one()λ³΄λ€ μͺΌκΈ λλ¦¬κ³ 4 λ°μ΄νΈ κΈΈμ΄μ§κ² νκΈ΄ ν©λλ€.
μ’ λ λͺ
ννκ² λͺ¨λ κ²μ μ’
ν©νμλ©΄: ν₯μλ λ°λ³΅λ¬Έ ꡬ문μ λ°°μ΄κ³Ό μ λμνμ§λ§, μΆκ°μ μΈ κ°μ²΄ μμ±μ΄ μκ² λλ Iterable κ°μ²΄μ ν¨κ» μ¬μ©ν λμ μ‘°μ¬ν΄μΌ ν©λλ€.
μ΄κ±°ν(Enum)μ νΌνλΌ
μ΄κ±°νμ λ§€μ° νΈλ¦¬ν©λλ€, κ·Έλ¬λ λΆμ΄νκ²λ ν¬κΈ°μ μλ μΈ‘λ©΄μμ κ³ ν΅μ€λ¬μΈ μ μμ΅λλ€. μλ₯Όλ€μ΄, λ€μμ μ½λλ:
public class Foo {
public enum Shrubbery { GROUND, CRAWLING, HANGING }
}
900 λ°μ΄νΈμ ν΄λμ€ νμΌ (Foo$Shrubbery.class) λ‘ λ³νλ©λλ€. μ²μ μ¬μ©ν λ, ν΄λμ€ μ΄κΈ°μλ κ°κ°μ μ΄κ±°νλ κ°λ€μ νκΈ°ν νλ κ°μ²΄μμ <init>λ©μλλ₯Ό νΈμΆν©λλ€. κ° κ°μ²΄λ μ μ νλλ₯Ό κ°μ§κ² λκ³ μ΄ μ
μ λ°°μ΄("$VALUES"λΌ λΆλ¦¬λ μ μ νλ)μ μ μ₯λ©λλ€. λ¨μ§ μΈ κ°μ μ μλ₯Ό μν΄ λ§μ μ½λμ λ°μ΄ν°λ₯Ό νμλ‘ νκ² λ©λλ€.
λ€μ μ½λ:
Shrubbery shrub = Shrubbery.GROUND;
λ μ μ νλ μ°Έμ‘°λ₯Ό μΌκΈ°ν©λλ€. "GROUND"κ° μ μ final int μλλΌλ©΄, μ»΄νμΌλ¬λ μλ €μ§ μμλ‘μ λ€λ£¨κ³ , inlineν νμ μλ μμ΅λλ€.
λ¬Όλ‘ , λ°λμ μΈ‘λ©΄μμ μ΄κ±°νμΌλ‘ λ μ’μ APIλ₯Ό λ§λ€ μ μκ³ μ΄λ€ κ²½μ°μ μ»΄νμΌ-νμ κ° κ²μ¬λ₯Ό ν μ μμ΅λλ€. κ·Έλμ ν΅μμ κ΅ν쑰건(trade-off)μ΄ μ μ©λ©λλ€: λ°λμ κ³΅μ© APIμλ§ μ΄κ±°νμ μ¬μ©νκ³ , μ±λ₯λ¬Έμ κ° μ€μν λμλ μ¬μ©μ νΌνμμμ€.
μ΄λ€ νκ²½μμλ ordinal() λ©μλλ₯Ό ν΅ν΄ μ μ κ° μ΄κ±°λ₯Ό κ°λ κ²μ΄ λμμ΄ λ μ μμ΅λλ€. μλ₯Ό λ€μ΄, λ€μ μ½λλ₯Ό:
for (int n = 0; n < list.size(); n++) {
if (list.items[n].e == MyEnum.VAL_X)
// do stuff 1
else if (list.items[n].e == MyEnum.VAL_Y)
// do stuff 2
}
λ€μ μ½λλ‘ λμ ν©λλ€:
int valX = MyEnum.VAL_X.ordinal();
int valY = MyEnum.VAL_Y.ordinal();
int count = list.size();
MyItem items = list.items();
for (int n = 0; n < count; n++)
{
int valItem = items[n].e.ordinal();
if (valItem == valX)
// do stuff 1
else if (valItem == valY)
// do stuff 2
}
λλ‘λ, 보μ₯ν μ μμ΅λλ€λ§, μ΄κ²μ΄ λ λΉ λ₯Ό μ μμ΅λλ€.
λ΄λΆ ν΄λμ€μ ν¨κ» ν¨ν€μ§ λ²μλ₯Ό μ¬μ©νλΌ
λ€μ ν΄λμ€ μ μλ₯Ό κ³ λ €ν΄ λ΄
μλ€:
public class Foo {
private int mValue;
public void run() {
Inner in = new Inner();
mValue = 27;
in.stuff();
}
private void doStuff(int value) {
System.out.println("Value is " + value);
}
private class Inner {
void stuff() {
Foo.this.doStuff(Foo.this.mValue);
}
}
}
μ¬κΈ°μ μ£Όλͺ©ν΄μΌ ν μ€μν κ²μ, μΈλΆ ν΄λμ€μ private λ©μλμ private μΈμ€ν΄μ€ νλμ μ§μ μ κ·Όνκ³ μλ λ΄λΆ ν΄λμ€(Foo$Inner)λ₯Ό μ μνλ€λ κ²μ
λλ€. μ΄κ²μ μ λ²νκ³ , μ½λλ κΈ°λνλ λλ‘ "Value is 27"μ μΆλ ₯ν©λλ€.
λ¬Έμ λ Foo$Innerλ κΈ°μ μ μΌλ‘λ (λΉλ°λ‘μ¨) μμ ν λΆλ¦¬λ, Fooμ private λ©€λ²λ‘ μ§μ μ μΈ μ κ·Όμ νλ κ²μ μ λ²νμ§ λͺ»ν ν΄λμ€λΌλ κ² μ
λλ€. μ΄ μ°¨μ΄λ₯Ό μ°κ²°μ§κΈ° μν΄, μ»΄νμΌλ¬λ λ κ°μ ν©μ± λ©μλλ₯Ό λ§λλλ€:
/*package*/ static int Foo.access$100(Foo foo) {
return foo.mValue;
}
/*package*/ static void Foo.access$200(Foo foo, int value) {
foo.doStuff(value);
}
λ΄λΆ ν΄λμ€ μ½λλ μΈλΆ ν΄λμ€μ μλ "mValue" νλμ μ κ·Όνκ±°λ "doStuff" λ©μλλ₯Ό λΆλ₯΄κΈ° μν΄ μ΄ μ μ λ©μλλ₯Ό λΆλ¦
λλ€. μ΄κ²μ μ΄ μ½λκ° κ²°κ΅μ μ§μ μ μΈ λ°©λ² λμ μ κ·Όμ λ©μλλ₯Ό ν΅ν΄ λ©€λ² νλμ μ κ·Όνκ³ μλ€λ κ²μ λ»ν©λλ€. μ΄μ μ μ°λ¦¬λ μ΄μ§Έμ μ κ·Όμκ° μ§μ μ μΈ νλ μ κ·Όλ³΄λ€ λλ¦°μ§μ λν΄ μ΄μΌκΈ° νμλλ°, μ΄ λ¬Έμ λ‘μ "보μ΄μ§ μλ" μ±λ₯ ν격 μΈ‘λ©΄μμ νΉμ μΈμ΄μ μ΄λ²μ΄ μΌκΈ°νκ² λλ λ¬Έμ μ λν μμ κ° λ μ μκ² μ΅λλ€.
μ΄ λ¬Έμ λ λ΄λΆ ν΄λμ€κ° μ κ·Όνλ νλμ λ©μλ μ μΈμ private λ²μκ° μλ package λ²μλ₯Ό κ°μ§λλ‘ ν¨μΌλ‘μ¨ νΌν μ μμ΅λλ€. μ΄λ‘μ¨ λμ± λΉ λ₯΄κ² λμνκ² λκ³ μλ μμ±λλ λ©μλμ μν μ€λ²ν€λλ₯Ό μ κ±°ν μ μμ΅λλ€. (λΆμ΄νκ²λ μ΄ λν μ§μ μ μΌλ‘ κ°μ ν¨ν€μ§ λ΄μ λ€λ₯Έ ν΄λμ€λ€μ΄ νλλ€μ μ κ·Όν μ μλ€λ κ²μ λ»νκ² λλ©°, λͺ¨λ νλλ€μ privateλ‘ ν΄μΌ νλ€λ νμ€μ μΈ OO κ΄μ΅μ κ±°μ€λ₯΄κ² λ©λλ€. λ€μ νλ² λ λ§νμλ©΄, κ³΅μ© APIλ₯Ό μ€κ³νκ² λλ€λ©΄ μ΄ μ΅μ νλ₯Ό μ¬μ©νλ κ²μ μ‘°μ¬μ€λ½κ² κ³ λ―Όν΄μΌλ§ ν κ²μ
λλ€.)
Floatλ₯Ό νΌνλΌ
νν°μ CPUκ° μΆμλκΈ° μ , κ²μ μ μμλ€μκ² μ μ κ³μ°μ μ΅μ μ λ€νλ κ²μ΄ μΌλ°μ μ΄μμ΅λλ€. νν°μκ³Ό ν¨κ» λΆλμμμ κ³μ° 보쑰 νλ‘μΈμλ μΌμ²΄νμ΄ λμκ³ , μ μμ λΆλμμμ μ°μ°μ λ£μμ λ°λΌ μμνκ² μ μ κ³μ°λ§μ μ¬μ©νλ κ² λ³΄λ€ κ²μμ λ λΉ λ₯΄κ² λμμ΅λλ€. μμ λ‘κ² λΆλμμμ μ μ¬μ©νλ κ²μ λ°μ€ν¬ν μμ€ν
μμλ μΌλ°μ μ
λλ€.
λΆμ΄νκ²λ, μλ² λλ νλ‘μΈμμκ²λ λΉλ²νκ² νλμ¨μ΄μ μΌλ‘ λΆλμμμ κ³μ°μ΄ μ 곡λμ§ μκ³ μμ΄, "float" μ "double"μ λͺ¨λ κ³μ°μ΄ μννΈμ¨μ΄μ μΌλ‘ μ²λ¦¬λ©λλ€. μ΄λ€ κΈ°μ΄μ μΈ λΆλμμμ κ³μ°μ μλ£κΉμ§ λλ΅ μΌ λ°λ¦¬ μ΄ μ λ 걸릴 μ μμ΅λλ€.
λν, μ μμμλ μ΄λ€ μΉ©λ€μ νλμ¨μ΄ κ³±μ
μ κ°μ§κ³ μμ§λ§ νλμ¨μ΄ λλμ
μ΄ μκΈ°λ ν©λλ€. μ΄λ¬ν κ²½μ°, μ μ λλμ
κ³Ό λλ¨Έμ§ μ°μ°μ μννΈμ¨μ΄μ μΌλ‘ μ²λ¦¬λ©λλ€ β λ§μ½ ν΄μ ν
μ΄λΈμ μ€κ³νκ±°λ λ§μ κ³μ°μ΄ νμνλ€λ©΄ μκ°ν΄ 보μμΌ ν κ²μ
λλ€.
μ±λ₯ μμ μ«μ λͺ κ°
μ°λ¦¬μ λͺ κ°μ§ μμ΄λμ΄λ₯Ό μ€λͺ
νκΈ° μν΄, μ½κ°μ κΈ°μ΄μ μΈ νλλ€μ λν΄ λλ΅μ μΈ μ€νμκ°μ λμ΄ν ν
μ΄λΈμ λ§λ€μμ΅λλ€. μ΄ κ°λ€μ μ λμ μΈ μ«μκ° μλλΌλ κ²μ μ£Όλͺ©ν΄ μ£Όμμμ€: CPUμκ°κ³Ό μ€μ ꡬλ μκ°μ μ‘°ν©μ΄κ³ , μμ€ν
μ μ±λ₯ ν₯μμ λ°λΌ λ³νν μ μμ΅λλ€. κ·Έλ¬λ μ΄ κ°λ€ μ¬μ΄μ κ΄κ³λ₯Ό μ μ©ν΄ 보λ κ²μ μ£Όλͺ©ν λ§ν κ°μΉκ° μμ΅λλ€ β μλ₯Ό λ€μ΄, λ©€λ² λ³μλ₯Ό λνλ κ²μ μ§μ λ³μλ₯Ό λνλ κ²λ³΄λ€ λλ΅ λ€ λ°°κ° κ±Έλ¦½λλ€.
νλ μκ°
μ§μ λ³μ λνκΈ° 1
λ©€λ² λ³μ λνκΈ° 4
String.length() νΈμΆ 5
λΉ μ μ λ€μ΄ν°λΈ λ©μλ νΈμΆ 5
λΉ μ μ λ©μλ νΈμΆ 12
λΉ κ°μ λ©μλ νΈμΆ 12.5
λΉ μΈν°νμ΄μ€ λ©μλ νΈμΆ 15
HashMapμ Iterator:next() νΈμΆ 165
HashMapμ put() νΈμΆ 600
XMLλ‘λΆν° 1 View κ°μ²΄ν(Inflate) 22,000
1 TextViewλ₯Ό λ΄μ 1 LinearLayout κ°μ²΄ν(Inflate) 25,000
6κ°μ View κ°μ²΄λ₯Ό λ΄μ 1 LinearLayout κ°μ²΄ν(Inflate) 100,000
6κ°μ TextView κ°μ²΄λ₯Ό λ΄μ 1 LinearLayout κ°μ²΄ν(Inflate) 135,000
λΉ activity μμ 3,000,000
λ§Ίμ λ§
μλ² λλ μμ€ν
μ μν΄ μ’κ³ ν¨μ¨μ μΈ μ½λλ₯Ό μμ±νλ μ΅μ μ λ°©λ²μ μ¬λ¬λΆμ΄ μμ±νλ μ½λκ° μ€μ λ‘ λ¬΄μμ νλμ§ μ΄ν΄νλ κ² μ
λλ€. μ¬λ¬λΆμ΄ μ λ§λ‘ λ°λ³΅μλ₯Ό ν λΉνκΈ°λ₯Ό μνλ€λ©΄, Listμ ν₯μλ λ°λ³΅λ¬Έμ λ°λμ μ¬μ©νμμμ€; λΆμ£Όμν λΆμμ©μ΄ μλ μ μ€ν μ νμ ν΅ν΄μ λ§μ
λλ€.
μ λΉλ¬΄νμ
λλ€! 무μμ νλμ§ μκ³ νμΈμ! μ’μνλ μ’μ°λͺ
μ μ¬κΈ°μ λ£μΌμΈμ, κ·Έλ¬λ μΈμ λ μ¬λ¬λΆμ μ½λκ° λ¬΄μμ νλμ§ μ£Όμ κΉκ² μκ°νκ³ , μλλ₯Ό λμ΄λ λ°©λ²μ μ°Ύλλ‘ κ²½κ³νμμμ€.