All :L
[Java] μ λ€λ¦ (Generic) λ³Έλ¬Έ
λ°μν
π generic
1οΈβ£ Generic
- λ€μν νμ μ κ°μ²΄λ₯Ό λ€λ£¨λ λ©μλ, 컬λ μ ν΄λμ€μμ μ»΄νμΌ μμ νμ 체ν¬
- 미리 μ¬μ©ν νμ μ λͺ μν΄μ ν λ³νμ νμ§ μμλ λκ² ν¨
- μμ μ± ν₯μ λ° ν λ³νμ λ²κ±°λ‘μ κ°μ
2οΈβ£ ν΄λμ€μ μ μΈλ Generic
- ν΄λμ€ λλ μΈν°νμ΄μ€ μ μΈ μ <>μ νμ νλΌλ―Έν° νμ
- νμΈμ(Type Parameter)
- λ¨μν μμμ μ°Έμ‘°ν νμ μ λ§νλ©° μ±κ²©μ λ°λΌ μ μΈ
- κ°μ²΄ μμ±
- λ³μ μͺ½κ³Ό μμ± μͺ½μ νμ μ λ°λμ κ°μμΌ ν¨.
- Generic Type μ μΈ
- Object μμ±μΌλ‘ μ¬μ©
- μ΄λ€ κ°μ²΄λ μ§ μμ© κ°λ₯
- μ΄λ€ νμ μ μμ±μΌλ‘ μ¬μ©ν μ§ νμ μ μΈ μ κ²°μ
- μ»΄νμΌ νμμ νμ νλΌλ―Έν°λ€μ΄ λμ λ νμ μΌλ‘ λ체λ¨.
3οΈβ£ μ£Όμμ¬ν
- raw typeμ μ¬μ©κ³Ό @SuppressWarning
- ν·κ°λ¦¬λ μ¬μ©λ²
- Personμ λ΄λ λ°μ€μ SpiderManμ λ΄λ λ°μ€λ μμ κ΄κ³ X
public void confusing() { GenericBox<Person> pbox = new GenericBox<>(); // TODO: pboxμ λ΄μ μ μλ κ°μ²΄λ₯Ό λ΄μ보μ. pbox.setSome(new Person("νΌν°ν컀")); pbox.setSome(new SpiderMan()); // END // TODO: pboxλ₯Ό λ€λ₯Έ κ°μ²΄λ‘ λ체ν΄λ³΄μ. GenericBox<SpiderMan> sbox = new GenericBox<>(); // pbox = sbox; // μ΄λ κ² μ¬μ©ν μ X // END }
- νμ νλΌλ―Έν°λ κ°μ²΄λ₯Ό μμ±νλ©΄μ μ λ¬λ¨
- Genericμ μ»΄νμΌ νμμ μ§μ ν νμ
μΌλ‘ μ‘΄μ¬ → λ°νμμλ νμ
μ 보 μμ (λ¨μ Objectλ‘ κ΄λ¦¬)
- compilerκ° μ΄λ―Έ νμ μ 체ν¬νκΈ° λλ¬Έμ runtimeμλ μμ λ‘κ² μ¬μ©
- runtimeμ λμνλ new, instanceof ν€μλ μ¬μ© λΆκ°
public void cantUseGeneric() { //I i = new I();//Cannot instantiate the type I GenericBox<SpiderMan> obj = new GenericBox<>(); // μ΄λ κ²λ μ¬μ© κ°λ₯ // compile error : Type Object cannot be safely cast to GenericBox<String> //if(obj instanceof GenericBox<String>) { } // μ΄λ κ² μ¬μ©ν μ μμ if (obj instanceof GenericBox gb) { // μ΄λ κ² μ¬μ©νλ©΄ λμ§λ§, νμ μ μμ X GenericBox<SpiderMan> casted = (GenericBox<SpiderMan>)gb; // μ¬μ© κ°λ₯νμ§λ§, μ νν μ΄λ€ νμ μ μλ―Ένλμ§ μ μ X gb.setSome("Hello"); // νμ μ μμ νμ§ μμ System.out.println("λ§μ§λ§ νμ μ μμ νμ§ μμ: " + gb.getSome()); } if (obj instanceof GenericBox<?> gb) { // μ΄κ²μ νλ³νμ κ°μ₯ μμ ν¨ (μ무κ²λ λ΄μ μ μκ² ν΄λ²λ¦¬κΈ° λλ¬Έμ) // gb.setSome("Hello"); // compile error System.out.println("μ΄κ²μ΄ μ΅μ : λλ λ΄κΈ°λ GenericBox"); } }
- Genericμ μ΄μ©ν λ°°μ΄ μμ± λΆκ° → collection μ¬μ©νλ©΄ λ¨.
- λ°°μ΄μ runtimeμ κ°μ²΄μ μ 보λ₯Ό μ μ§νκ³ λμΌν νμ μ κ°μ²΄λ§ μ²λ¦¬
- λ§μ½ T[]μ΄ λλ€κ³ κ°μ νμ λλ runtimeμ Object[]λ‘ λ³κ²½λ¨ → Tκ° Integerμμ λ runtimeμλ λλ μ§ λ€μ΄κ° λ²λ¦Ό
public void genericArray() { // Generic νμ μΌλ‘λ λ°°μ΄ μμ± λΆκ° // GenericBox<String> [] boxes1 = new GenericBox<String>[3]; // compile error // GenericBox<String> [] boxes2 = new GenericBox<>[3]; // compile error GenericBox<Person>[] boxes3 = (GenericBox<Person>[]) new GenericBox[3]; // μ΅μ§λ‘ μ΄λ κ² λ§λ€ μλ μμ. boxes3[0] = new GenericBox<Person>(); // TODO: μμ½λκ° μλ―Έ μκ² λλ€λ©΄ μ΄λ€ λΆμμ¬κ° λ°μνλμ§ μκ°ν΄λ³΄μ. GenericBox<String> strbox = new GenericBox<String>("hello"); boxes3[1] = (GenericBox)strbox; // END }
4οΈβ£ Generic Method
- νλΌλ―Έν°μ 리ν΄νμ
μΌλ‘ type parameterλ₯Ό κ°λ λ©μλ
- λ©μλ λ¦¬ν΄ νμ μμ νμ νλΌλ―Έν° λ³μ μ μΈ
5οΈβ£ νμ ν νμΈμ
- νμμ λ°λΌ ꡬ체μ μΈ νμ
μ ν νμ
- μΈν°νμ΄μ€λ‘ μ νν κ²½μ°λ extends μ¬μ©
- ν΄λμ€μ ν¨κ» μΈν°νμ΄μ€ μ μ½ μ‘°κ±΄μ μ΄μ©ν κ²½μ° & λ‘ μ°κ²°
6οΈβ£ μμΌλ μΉ΄λ(?) μλ£ν
- μ€μ type parameterκ° λ¬΄μμΈμ§ λͺ¨λ₯΄κ±°λ μ κ²½ μ°κ³ μΆμ§ μμ κ²½μ°
- νμ©ν μ μλ 곡ν΅μμ κ³ λ―Ό νμ
- PECS
- Producer Extends: μ λ€λ¦ νμ μ΄ λ°μ΄ν°λ₯Ό μμ°νμ¬ μΈλΆλ‘ μ 곡νλ μν
- Consumer Super: μ λ€λ¦ νμ μ΄ λ°μ΄ν°λ₯Ό μ°λ μν (μΆκ°, μμ )
π enum
1οΈβ£ Enum
- μ΄κ±°ν λ°μ΄ν° νμ
- λ°μ΄ν°κ° νμ λ κ°λ§μ κ°λ ννλ‘ κ΅¬μ±λλ κ²½μ°
- java.lang.Enumμ λ΄λΆμ μΌλ‘ μμ λ°μ ννμ νΉλ³ν ν΄λμ€
- Eum νμ
μμ±
- Enum νμ μ μ μΈλ λ΄μ© → enum μμ
enum Grade { SALES, PART_TIME_JOB, NORMAL }
- Enum νμ
μ¬μ©
- ν΄λμ€μ λμΌνκ² μ μΈ
- ν λΉλ μ μλ κ° : enum μμ, null
- Enum νμμ±
- κ° λΉκ΅ μ κ° λΏλ§ μλλΌ νμ μ²΄ν¬ κ°λ₯
- λ Όλ¦¬μ μ€λ₯ λ°©μ§
2οΈβ£ Enum μ΄μ© μ°μ°
- λΉκ΅ μ°μ°μ μ£Όλ‘ μ¬μ©
- ==
- equals
3οΈβ£ Enum μ£Όμ λ©μλ
- java.lang.Enum λ©μλ
- public final String name() : enum μμμ μ΄λ¦ λ¬Έμμ΄ λ¦¬ν΄
- public final int ordianl() : enum μμμ μμλ‘ 0λΆν° μμ
- public final int compareTo() : enum μμμ ordinal μ°¨μ΄ λ¦¬ν΄
- public static T[] values() : Enum νμ μ μ μΈλ enum μμ λ°°μ΄ λ¦¬ν΄
- public static T valueOf(String name) : λ¬Έμμ΄μ 맀νλ enum μμ κ°μ²΄ 리ν΄
- μ체 λ©€λ² μΆκ°
- μΌλ° ν΄λμ€μ²λΌ Enumμλ λ©€λ² λ³μ & λ©μλ μΆκ° κ°λ₯
- enum μμ μ μΈ λμ λ°λμ ; μΆκ° νμ
- μμ±μλ₯Ό ν΅ν enum μμ μ΄κΈ°ν
- μμ±μ : privateλ‘ μΈλΆμμ μ κ·Ό λΆκ°
- λ΄λΆ enum μμ μ μΈ μ κ° ν λΉ
π annotation
1οΈβ£ annotationμ΄λ?
- μ»΄νμΌλ¬, JVM, νλ μμν¬ λ±μ΄ 보λ μ£Όμ
- μμ€μ½λμ λ©ν λ°μ΄ν° μ½μ νλ νν
- μ½λμ λν μ 보 μΆκ° → μμ€ μ½λμ ꡬ쑰 λ³κ²½, νκ²½ μ€μ μ 보 μΆκ° λ±μ μμ μ§ν
- JDK κΈ°λ³Έ annotation
- @Deprecated
- μ»΄νμΌλ¬μ ν΄λΉ λ©μλ deprecated λμλ€κ³ μλ €μ€
- @Override
- μ»΄νμΌλ¬μ ν΄λΉ λ©μλλ overrideν λ©μλμμ μλ €μ€
- μ μΈλ κ²½μ° λ°λμ super classμ μ μΈλμ΄ μλλ λ©μλμ¬μΌ ν¨.
- @SuppressWarnings
- μ»΄νμΌλ¬μκ² μ¬μν warning 무μνλΌκ³ μλ €μ€
- @Deprecated
2οΈβ£ annotation λΆμ
- μ μΈ
- interface μ μΈκ³Ό μ μ¬νκ² @interface μ¬μ©
- ꡬμ±
- @Target, @Retention λ± λ©ν μλν μ΄μ
- μλν μ΄μ μ μν μμ±
3οΈβ£ λ©ν μλν μ΄μ
- μλν
μ΄μ
μ€μ μ μν μλν
μ΄μ
- @Document
- JavaDoc λ§λ€ λ μ΄ μλν μ΄μ μ λ¬Έμμ νμν΄μΌν¨.
- @Inherited
- μ λν μ΄μ μ΄ νμ ν΄λμ€μ μμλ¨
- @Repeatable
- ν΄λΉ μλν μ΄μ μ΄ λ°λ³΅ μ μ©λ μ μλμ§ νμ
- @Retention
- μΌλ§λ μ€λ μλν μ΄μ μ 보λ₯Ό μ μ§ν 건μ§
- RetentionPolicy enum ν볡 μ€ μ©λμ λ§μΆ° νλλ§ μ ν κ°λ₯
- RetentionPolicy μμ κ°
- SOURCE
- CLASS
- RUNTIME
- @Targe
- μλν μ΄μ μ μ΄λμ μ¬μ©ν μ μλμ§
- ElementType μμ κ°
- TYPE
- FIELD
- METHOD
- PARAMETER
- CONSTRUCTOR
- LOCAL_VARIABLE
- ANNOTATION_TYPE
- PACKAGE
- @Document
4οΈβ£ μμ±
- μΆμ λ©μλμ²λΌ μ°κ³ μΌλ° μμ± μ²λΌ ‘ν€ = κ°’μΌλ‘ μ¬μ©
- λ©μλ μ΄λ¦ → μμ±λͺ , λ¦¬ν΄ νμ → μμ± νμ
- μ€μ νλ μμ±μ΄ value νλμΈ κ²½μ° μμ± μλ΅ κ°λ₯
- λ°°μ΄μ {}λ₯Ό μ°λλ° κΈΈμ΄κ° 1μΌ λλ {} μλ΅ κ°λ₯
- default κ° κ°μ§ μ O → μμ± μ€μ μλ΅ κ°λ₯
λ°μν
'STUDY > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] μμΈ (Exception) (0) | 2024.11.01 |
---|---|
[Java] 컬λ μ (Collection) (1) | 2024.10.30 |
[Java] μΈν°νμ΄μ€ (Interface) (0) | 2024.10.26 |
[Java] λ€νμ± (Polymorphism) (0) | 2024.10.24 |
[Java] μμ (Inheritance) (0) | 2024.10.20 |
Comments