All :L

[Java] μ œλ„€λ¦­ (Generic) λ³Έλ¬Έ

STUDY/Java

[Java] μ œλ„€λ¦­ (Generic)

ofijwe 2024. 10. 28. 12:31
λ°˜μ‘ν˜•

πŸ“’ 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 λ¬΄μ‹œν•˜λΌκ³  μ•Œλ €μ€Œ

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

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