λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Study/Java

[TIL] μ»¬λ ‰μ…˜ Collection

by hong- 2022. 5. 15.

☝🏻 μ œλ„€λ¦­ Generic

  - 데이터 ν˜•μ‹μ— μ˜μ‘΄ν•˜μ§€ μ•Šκ³  ν•˜λ‚˜μ˜ 값이 μ—¬λŸ¬ νƒ€μž…μ„ κ°€μ§ˆ 수 μžˆλ„λ‘ ν•˜λŠ” 방법

  - 클래슀 λ‚΄λΆ€μ—μ„œ μ§€μ •ν•˜λŠ” 것이 μ•„λ‹Œ μ™ΈλΆ€μ—μ„œ μ‚¬μš©μžμ— μ˜ν•΄ μ§€μ •λ˜λŠ” 것

  - 클래슀, λ©”μ†Œλ“œμ—μ„œ μ‚¬μš©ν•  데이터 νƒ€μž…μ„ λ‚˜μ€‘μ— ν™•μ •ν•˜λŠ” 기법

      → 확정은 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œλ‚˜ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ 정함

 - 클래슀λ₯Ό μ„ μ–Έν•˜μ—¬ 객체λ₯Ό 생성할 λ•Œ ꡬ체적인 νƒ€μž… 기재 = 즉, main μ—μ„œ 객체 λ§Œλ“€λ•Œ !!

 - νƒ€μž…μ„ μ–΄λ–€ 클래슀 μ’…λ₯˜μ˜ λ§€κ°œλ³€μˆ˜λ‘œ λ³΄λŠ” 것

μ–΄λ–€ 자료ꡬ쑰λ₯Ό λ§Œλ“€μ–΄ λ°°ν¬ν•˜κ³ μž ν•  λ•Œ String νƒ€μž…λ„, Integer νƒ€μž…λ„ μ§€μ›ν•˜κ³  μ‹Άλ‹€λ©΄
          각 각 ν΄λž˜μŠ€λ§ˆλ‹€ ν•˜λ‚˜μ”© νƒ€μž…μ„ λ§Œλ“€μ§€ μ•Šκ³  μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λŠ” 것 !!
public class 클래슀λͺ… <νƒ€μž… λ§€κ°œλ³€μˆ˜> { ... }

public interface μΈν„°νŽ˜μ΄μŠ€λͺ… <νƒ€μž… λ§€κ°œλ³€μˆ˜> { ... }
νƒ€μž…μΈμž <T> <E> <K> <N> <V> <R>
μ„€λͺ… Type Element Key Number Value Result

 - νƒ€μž… νŒŒλΌλ―Έν„°λ‘œ λͺ…μ‹œν•  수 μžˆλŠ” 것은 μ°Έμ‘° νƒ€μž… 밖에 λΆˆκ°€

  → 즉, int, char λ“± 일반 νƒ€μž…μ€ x


πŸ“ μ œλ„€λ¦­μ˜ μž₯점

 - 객체의 νƒ€μž…μ„ 컴파일 νƒ€μž„μ— 체크할 수 μžˆμ–΄μ„œ νƒ€μž… μ•ˆμ •μ„±μ„ λ†’μž„

 - ν˜•λ³€ν™˜μ˜ λ²ˆκ±°λ‘œμ›€μ΄ 쀄어듀어 μ½”λ“œκ°€ κ°„κ²°

 

 πŸ’‘ νƒ€μž… μ•ˆμ •μ„± type safety

   - μ˜λ„ν•˜μ§€ μ•Šμ€ νƒ€μž…μ˜ 객체가 μ €μž₯λ˜λŠ” 것을 λ§‰μŒ

   - μ €μž₯된 객체λ₯Ό κΊΌλ‚΄μ˜¬ λ•Œ λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ 잘λͺ» ν˜•λ³€ν™˜ν•˜μ—¬ λ°œμƒν•  수 μžˆλŠ” 였λ₯˜λ₯Ό μ€„μž„


πŸ™ŒπŸ»  μ œλ„€λ¦­ 클래슀 

- μ—¬λŸ¬ μ°Έμ‘° μžλ£Œν˜•μ„ μ‚¬μš©ν•΄μ•Όν•˜λŠ” κ²½μš°μ—λŠ” ν•˜λ‚˜μ˜ 문자둜 ν‘œν˜„

- 클래슀λͺ… μš°μΈ‘μ— <>λ₯Ό μ‚¬μš©ν•΄μ„œ μ„ μ–Έ

- 콀마둜 κ΅¬λΆ„ν•΄μ„œ μ—¬λŸ¬ 개 선언도 κ°€λŠ₯

  1️⃣ μ œλ„€λ¦­ 클래슀 μ •μ˜

  - ν…œν”Œλ¦Ώ ν˜•νƒœμ˜ μ œλ„€λ¦­ 클래슀λ₯Ό μ •μ˜ν•˜λ©° νƒ€μž… μ„€μ •

μ ‘κ·Όμ œμ–΄μž     class     클래슀λͺ…<T> {}
public      class      Happy<T> {}

μ ‘κ·Όμ œμ–΄μž     class     클래슀λͺ…<T, K> {}
public      class      Happy<T, K> {}

2️⃣ μ œλ„€λ¦­ 클래슀의 속성과 λ©”μ„œλ“œ μ •μ˜

  - ν•„λ“œμ™€ λ©”μ„œλ“œ 리턴 값을 h둜 μž‘μ„±

public class Happy<T> {
    private T h;
    public T get() { return h; }
    public void set( T h ) { this.h = h; }
}

 3️⃣ μ œλ„€λŸ΄ 객체 생성

  - Happy 객체λ₯Ό 생성할 λ•Œ μ–΄λ–€ νƒ€μž…μ˜ 값을 넣을 것인지 μ§€μ •

   β–ͺ️ μ œλ„€λŸ΄ μ‚¬μš©

public class Main {
	public static void main(String[] args) {
    
    	Happy<String> happy1 = new Happy<String>();     //String νƒ€μž…λ§Œ μ €μž₯
        happy1.set("String")
        String str = happy1.get();
        
        Happy<Integer> happy2 = new Happy<Integer>();   //Integer νƒ€μž…λ§Œ μ €μž₯
        happy2.set(1);
        int value = happy2.get();
    
    }
}

   β–ͺ️ μ œλ„€λŸ΄ λ―Έμ‚¬μš©

//happy <String>()
public class Happy{
    private String h;
    public String get() { return h; }
    public void set(String h) { this.h = h; }
}

//happy <Integer>();
public class Happy{
    private Integer h;
    public Integer get() { return h; }
    public void set(String h) {this.h= h;}
}

4️⃣ 객체 생성할 λ•Œ νƒ€μž…μ„ μ§€μ •ν•΄μ£Όλ©΄ Happy ν΄λž˜μŠ€λŠ” μ»΄νŒŒμΌμ„ 마친 ν›„ λ™μž‘ν•¨


πŸ“ μ œλ„€λ¦­ ν΄λž˜μŠ€μ™€ 일반 클래슀 차이

 (1) 클래슀 μ •μ˜

  β–ͺ️ 일반 클래슀

class ClassTest {}

  β–ͺ️ μ œλ„€λ¦­ 클래슀

class ClassTest<T> {}

 (2) 속성 / λ©”μ„œλ“œ μ •μ˜

  β–ͺ️ 일반 클래슀

private string str;
public get() {return str;}
public set(String str) { this.str = str ; }

  β–ͺ️ μ œλ„€λ¦­ 클래슀

private T t;
public T get() {return t; }
public T set( T t ) { this.t=t; }

(3) 객체 생성

  β–ͺ️ 일반 클래슀

ClassTest ct = new ClassTest();

  β–ͺ️ μ œλ„€λ¦­ 클래슀

ClassTest<String> ct = new ClassTest<String>;

(4) 객체 μ‚¬μš©

  β–ͺ️ μ œλ„€λ¦­ 클래슀

ct.set("Hong")
System.out.println(ct.get());

✌🏻 νƒ€μž… λ§€κ°œλ³€μˆ˜

 - νƒ€μž…λ³€μˆ˜ or νƒ€μž… λ§€κ°œλ³€μˆ˜ : μ œλ„€λ¦­ 클래슀 <> μ•ˆμ— μžˆλŠ” λ³€μˆ˜λͺ…

 - λ³€μˆ˜ 이름과 νƒ€μž…μ˜ 이름을 κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ ν•˜λ‚˜μ˜ 'λŒ€λ¬Έμž'둜 μž‘μ„±

 - μ œλ„€λ¦­ ν΄λž˜μŠ€λŠ” μ—¬λŸ¬ 개의 νƒ€μž… λ§€κ°œλ³€μˆ˜λ₯Ό κ°€μ§ˆ 수 있음


πŸ“ 닀이아λͺ¬νŠΈ μ—°μ‚°μž : < >

  - μ œλ„€λ¦­ 클래슀λ₯Ό 생성할 λ•Œ μƒμ„±μžμ— μžλ£Œν˜•μ„ λͺ…μ‹œν•˜μ§€ μ•Šμ„ 수 있음

  - μƒμ„±μžμ˜ νƒ€μž… λ§€κ°œλ³€μˆ˜λ₯Ό μ»΄νŒŒμΌλŸ¬κ°€ λ¬Έλ§₯을 톡해 좔둠함

Computer<String> pc = new Computer<>();

πŸ“ μ™€μΌλ“œ μΉ΄λ“œ

  - μ œν•œμ„ 두지 μ•ŠλŠ” 기호

  - '?' 기호λ₯Ό μ‚¬μš©ν•˜μ—¬ μ™€μΌλ“œ μΉ΄λ“œ μ‚¬μš©

  - extendsλŠ” μžμ‹ κ³Ό μžμ‹ μ˜ ν›„μ†λ§Œ κ°€λŠ₯

  - super은 μžμ‹ κ³Ό μžμ‹ μ˜ μ‘°μƒλ§Œ κ°€λŠ₯

<?>  //νƒ€μž… λ§€κ°œλ³€μˆ˜μ— λͺ¨λ“  νƒ€μž… μ‚¬μš© == <? extends Object>
<? extends T>   //T와 κ·Έ μžμ† νƒ€μž…λ§Œ μ‚¬μš© - upper bound
<? super T>     //T와 κ·Έ 쑰상 νƒ€μž…λ§Œ μ‚¬μš© - lower bound

🀟🏻 μ œλ„€λ¦­ λ©”μ„œλ“œ

 - 클래슀 λ‚΄λΆ€μ˜ νŠΉμ • λ©”μ„œλ“œλ§Œ μ œλ„€λ¦­μœΌλ‘œ μ„ μ–Έν•  수 있음

 - μ œλ„€λ¦­ ν΄λž˜μŠ€λŠ” 객체λ₯Ό μƒμ„±ν•˜λŠ” μ‹œμ μ— μ‹€μ œ νƒ€μž…μ„ μ§€μ • ( μ „μ—­ λ³€μˆ˜μ²˜λŸΌ μ‚¬μš© )

 - μ œλ„€λ¦­ λ©”μ„œλ“œλŠ” ν˜ΈμΆœλ˜λŠ” μ‹œμ μ— μ‹€μ œ νƒ€μž… μ§€μ • ( μ§€μ—­ λ³€μˆ˜μ²˜λŸΌ μ‚¬μš©)

 - μ œλ„€λ¦­ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•œ μ‹œμ μ—μ„œλŠ” μ‹€μ œ μ–΄λ–€ νƒ€μž…μ΄ μž…λ ₯λ˜λŠ”μ§€ μ•Œ 수 μ—†μŒ

   - but, Object 클래슀의 λ©”μ„œλ“œλŠ” μ‚¬μš© κ°€λŠ₯

package tt;

public class GenericTest<E> {
    private E element;     //μ œλ„€λ¦­ νƒ€μž… λ³€μˆ˜

    void set(E element){       //μ œλ„€λ¦­ νŒŒλΌλ―Έν„° λ©”μ†Œλ“œ
        this.element = element;
    }

    E get() {
        return element;
    }

    <T> T genericMethod(T t) {
        return t;
    }
}

 → 일반 클래슀 내뢀에 μ œλ„€λ¦­ λ©”μ„œλ“œ μ„ μ–Έ

 

package tt;

public class Main {
    public static void main(String[] args) {
        GenericTest<String> a = new GenericTest<String>();
        GenericTest<Integer> b = new GenericTest<Integer>();

        a.set("10");
        b.set(10);

        System.out.println(a.get());
        System.out.println(b.get());

        System.out.println(a.genericMethod("ABCD"));
        System.out.println(b.genericMethod(3));

        System.out.println(a.genericMethod(3));           //String 객체라도 νŒŒλΌλ―Έν„° νƒ€μž…μ— 따라 Integer둜 νƒ€μž… λ³€ν™˜
        System.out.println(b.genericMethod("abc"));
    }
}

🌱 java.lang.Object 클래슀의 λ©”μ„œλ“œ

μ œμ–΄μž 및 νƒ€μž… λ©”μ„œλ“œ μ„€λͺ…
protected Object clone() ν•΄λ‹Ή 객체의 λ³΅μ œλ³Έμ„ μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•¨
boolean equals(Object obj) ν•΄λ‹Ή 객체와 전달받은 객체가 같은지 μ—¬λΆ€λ₯Ό λ°˜ν™˜ν•¨
protected void finalize() ν•΄λ‹Ή 객체λ₯Ό 더이상 μ°Έμ‘°ν•˜μ§€ μ•Šμ•„ GCκ°€ 객체 λ¦¬μ†ŒμŠ€ μ •λ¦¬ν•˜κΈ° 이해 ν˜ΈμΆœν•¨
Class <T> getClass() ν•΄λ‹Ή 객체의 클래슀 νƒ€μž… λ°˜ν™˜
int hashCode() ν•΄λ‹Ή 객체의 ν•΄μ‹œ μ½”λ“œ 값을 λ°˜ν™˜
void notify() ν•΄λ‹Ή 객체의 λŒ€κΈ° ν•˜κ³  μžˆλŠ” ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ₯Ό λ‹€μ‹œ μ‹€ν–‰ν•  λ•Œ ν˜ΈμΆœν•¨
void notifyAll() ν•΄λ‹Ή 객체의 λŒ€κΈ°ν•˜κ³  μžˆλŠ” λͺ¨λ“  μŠ€λ ˆλ“œλ₯Ό λ‹€μ‹œ μ‹€ν–‰ν•  λ•Œ ν˜ΈμΆœν•¨
String toString() ν•΄λ‹Ή 객체의 정보λ₯Ό λ¬Έμžμ—΄λ‘œ λ°˜ν™˜
void wait() ν•΄λ‹Ή 객체의 λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ notify()λ‚˜ notifyAll()λ₯Ό μ‹€ν–‰ν•  λ•Œ κΉŒμ§€ ν˜„μž¬ μŠ€λ ˆλ“œλ₯Ό μΌμ‹œμ μœΌλ‘œ λŒ€κΈ°
void wait(long timeout) ν•΄λ‹Ή 객체의 λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ notify()λ‚˜ notifyAll()λ₯Ό μ‹€ν–‰ν•˜κ±°λ‚˜ 전달받은 μ‹œκ°„μ΄ μ§€λ‚  λ•ŒκΉŒμ§€ ν˜„μ œ μŠ€λ ˆλ“œ μΌμ‹œ λŒ€κΈ°
void wait(long timeout, int nanos) ν•΄λ‹Ή 객체의 λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ notify()λ‚˜ notifyAll()을 μ‹€ν–‰ν•˜κ±°λ‚˜ 전달받은 μ‹œκ°„μ΄ μ§€λ‚˜κ±°λ‚˜ λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ ν˜„μž¬ μŠ€λ ˆλ“œλ₯Ό μΈν„°λŸ½νŠΈ ν•  λ•Œ

'Study > Java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[TIL] λ‹€ν˜•μ„±  (0) 2022.05.15
[TIL] 좔상화  (0) 2022.05.15
[TIL] μ°Έμ‘°λ³€μˆ˜μ™€ μ°Έμ‘°νƒ€μž…  (0) 2022.05.14
[TIL] 상속  (0) 2022.05.12
[TIL] μΊ‘μŠν™”  (0) 2022.05.12