๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Java

[JAVA] Generic

by ๋Œ€๋ณต2 2024. 7. 22.

 

์„œ๋ก 

์–ด๋””์„ ๊ฐ€ ์ž๋ฐ”๋กœ ๋งŒ๋“  ์ฝ”๋“œ๋ฅผ ๋ณธ ์ ์ด ์žˆ๋‹ค๋ฉด ArrayList <> ๊ฐ™์€ ํ˜•์‹์˜ ๋ฌธ์žฅ์„ ๋ณธ ์ ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ € <>์•ˆ์— ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ํƒ€์ž…์„ ๋„ฃ์œผ๋ฉด ๊ทธ ํƒ€์ž…์— ๋งž๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ์ด ๋˜๋Š”๋ฐ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์ด Generic์ด๋‹ค.

 

Generic

 

Generic์€ ๋ฐ์ดํ„ฐ ํ˜•์‹์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , ํ•˜๋‚˜์˜ ๊ฐ’์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ฐ€์ง€๋„๋ก ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์ด๊ฑธ ์กฐ๊ธˆ ๋” ์žˆ์–ด ๋ณด์ด๊ฒŒ ํ‘œํ˜„ํ•˜์ž๋ฉด ์ปดํŒŒ์ผ ๋•Œ ํƒ€์ž…์„ ์ฒดํฌํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

Generic์€ ๊ฐ์ฒด์˜ ํƒ€์ž…์— ๋Œ€ํ•œ ์•ˆ์ „์„ฑ์„ ๋†’์ด๊ณ , ํ˜• ๋ณ€ํ™˜์˜ ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

๊ฐ€ ํ‘œ๋ฉด์ ์ธ ์ด์œ ์ด์ง€๋งŒ, ํ•œ ๊ฐ€์ง€ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด ์ƒ๊ฐํ•ด ๋ณด๋ฉด ์™œ ์“ฐ๋Š”์ง€ ๋ฐ”๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

์„œ๋ก ์—์„œ ์–ธ๊ธ‰ํ•œ ArrayList์˜ ํƒ€์ž…์ด ๋งŒ์•ฝ ์ง€์ •๋˜์–ด ์žˆ๋‹ค๋ฉด, ๊ฐœ๋ฐœ์ž๋Š” ์ˆ˜๋งŽ์€ ํƒ€์ž…์˜ ArrayList๋ฅผ ์ •์˜ํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ๋„ˆ๋ฌด ๋น„ํšจ์œจ์ ์ด๊ณ  ๊ท€์ฐฎ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์˜จ ๊ฑฐ๋‹ค.

 

public class GenericBox<T> {  //<T>๋กœ ๋งŒ๋“ค์–ด Generic์œผ๋กœ!
	private T some; 

	public GenericBox() {}
	
	public GenericBox(T some) {
		this.some = some;
	}


	public T getSome() {
		return some;
	}

	public void setSome(T some) {
		this.some = some;
	}
}



public static void main(String[] args) {
       GenericBox<String> gbox = new GenericBox<>();
        
        gbox.setSome(1); // String์œผ๋กœ ์ •์˜ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ ๋ฐœ์ƒ
        gbox.setSome("Generic Test");
     	System.out.println("๋ฌธ์ž์—ด: " + gbox.getSome());
}

 

 

 

 

ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์ด์ „์— Object๋ผ๊ณ  ํ•˜๋Š” ์กฐ์ƒ๋‹˜ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ๋ฐฐ์› ๋‹ค. Object๊ฐ€ ์ด๋Ÿฐ ์—ญํ• ์„ ์ถฉ๋ถ„ํžˆ ์ˆ˜ํ–‰ํ•ด ์ค„ ๊ฒƒ ๊ฐ™์€๋ฐ ์–ด๋–ค ์ฐจ์ด์ ์ด ์žˆ์„๊นŒ?

 

 

 

์ฒซ ๋ฒˆ์งธ๋กœ Object๋Š” ์ฒ˜์Œ ์ œ์ž‘ ๋•Œ ๋ชจ๋“  ํƒ€์ž…์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค€ ๊ฒƒ์ด๊ณ , Generic์€ ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”ํ•  ๋•Œ ํƒ€์ž…์„ ์ง€์ •ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์š”์•ฝํ•˜์ž๋ฉด Generic์€ Object์™€ ๋‹ฌ๋ฆฌ ์‚ฌ์šฉ์ž๊ฐ€ ํƒ€์ž…์„ ๊ฒฐ์ •ํ•œ๋‹ค.

 

๋‘ ๋ฒˆ์งธ๋กœ ํ˜•๋ณ€ํ™˜์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Object ํƒ€์ž…์˜ ์ž๋ฃŒ๊ตฌ์กฐ์— intํ˜• ์ˆซ์ž๋ฅผ ํ•˜๋‚˜ ๋„ฃ์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

์ด ์ˆซ์ž๋Š” ๋‚˜์ค‘์— ์‚ฌ์šฉ์„ ํ•  ๋•Œ ๊บผ๋‚ด๋„ ์„ ์–ธ๋œ ํƒ€์ž…์ด Object์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•  ๋•Œ ๋‹ค์‹œ intํ˜•์œผ๋กœ ํ˜•๋ณ€ํ™˜์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ Generic์€ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ์„ ์–ธ ๋‹น์‹œ int๋ฅผ ์ง€์ •๋œ ์ƒํƒœ์ด๊ณ , ์ด์— ์ˆซ์ž๋งŒ ์ €์žฅ์ด ๊ฐ€๋Šฅํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ํ˜•๋ณ€ํ™˜์ด ๋”ฐ๋กœ ํ•„์š” ์—†์ด ํŽธํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

 

 

 

 

Generic ์ฃผ์˜์‚ฌํ•ญ

1. ์ œ๋„ค๋ฆญ ํƒ€์ž…์˜ ๊ฐ์ฒด๋Š” ์ƒ์„ฑ์ด ์•ˆ๋œ๋‹ค.

2. Static์ด๋ž‘์€ ๊ฐ™์ด ์‚ฌ์šฉ ๋ชปํ•œ๋‹ค.

  - ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํƒ€์ž…์„ ์ง‘์–ด๋„ฃ๊ธฐ ์ „ ์„ ์–ธ์ด ๋˜์–ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

3. ํƒ€์ž…์— ๋„ฃ์–ด๋‘” ๊ฐ์ฒด๋Š” ์ƒ์†๊ด€๊ณ„๋ผ๋„ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค. -> ํƒ€์ž…์€ ๋ฌด์กฐ๊ฑด ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.

ex) Box <A> box = new Box <B>(); ์—์„œ A์™€ B๊ฐ€ ์ƒ์†๊ด€๊ณ„์—๋„ ์„ฑ๋ฆฝ์ด ์•ˆ๋œ๋‹ค.

4. ๋ฐฐ์—ด๊ณผ Generic์€ ๊ฐ™์ด ๋ชป ์“ด๋‹ค. (์‚ฌ์‹ค ๊ฐ€๋Šฅ์€ ํ•˜์ง€๋งŒ ์•ˆ ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.)

  - ๋ฐฐ์—ด์€ ๋Ÿฐํƒ€์ž„์— ์‹ค์ฒดํ™”๊ฐ€ ๋˜๊ณ , Generic์€ ๋Ÿฐํƒ€์ž„ ๋•Œ ํƒ€์ž…์ด ์†Œ๊ฑฐ๋˜๋ฏ€๋กœ, ํƒ€์ž…์˜ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค.

 

 

 

 

Generic Method

๋ง ๊ทธ๋Œ€๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ฆฌํ„ด ํƒ€์ž…์„ Generic ํ˜•์‹์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

์ด ์˜ˆ์‹œ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ณ  ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์—์„œ <P>์˜ ํƒ€์ž…์„ ๊ฒฐ์ •ํ•œ๋‹ค.

 

 

 

 

๊ณต๋ณ€? ๋ถˆ๊ณต๋ณ€?

Generic์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ด๋””์„œ ์ฐพ์•„๋ณด๊ฒŒ ๋˜๋ฉด ๊ณต๋ณ€, ๋น„๊ณต๋ณ€์ด๋ผ๋Š” ๋ง์ด ๊ฐ„ํ˜น ๋ณด์ผ ๊ฒƒ์ด๋‹ค. ๊ณต๋ณ€๊ณผ ๋ถˆ๊ณต๋ณ€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•œ๋‹ค.

 

๊ณต๋ณ€: A๊ฐ€ B์˜ ํ•˜์œ„ ํƒ€์ž…์ผ ๋•Œ, T <A>๊ฐ€ T <B>์˜ ํ•˜์œ„ ํƒ€์ž…์ด๋ฉด T๋Š” ๊ณต๋ณ€

๋ถˆ๊ณต๋ณ€: A๊ฐ€ B์˜ ํ•˜์œ„ ํƒ€์ž…์ผ ๋•Œ, T<A>๊ฐ€ T<B>์˜ ํ•˜์œ„ ํƒ€์ž…์ด ์•„๋‹ˆ๋ผ๋ฉด T๋Š” ๋ถˆ๊ณต๋ณ€

 

 

์šฐ๋ฆฌ๊ฐ€ ๋ณธ Generic์€ ๋ถˆ๊ณต๋ณ€์ด๊ณ , ๋ฐฐ์—ด์€ ๊ณต๋ณ€์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

    void GenericTest(){
        Integer[] integers = {1,2,3};
        printArray(integers);
        
        ArrayList<Integer> list = new ArrayList<>();
        printlist(list); // Integer์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค์— Object๊ฐ€ ์žˆ์ง€๋งŒ ๋ถˆ๊ณต๋ณ€์ด๊ธฐ์— ๋ถˆ๊ฐ€๋Šฅ
    }
    void printArray(Object[] arr){
        for (Object o : arr) System.out.println(o);
    }
    void printlist(Collection<Object> arr){
        for (Object o : arr) System.out.println(o);
    }

 

์ด๋Ÿฌ๋ฉด ์˜คํžˆ๋ ค Generic์„ ์จ์•ผ ํ•  ์ด์œ ๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š์„๊นŒ? ํ•ด์„œ ๋‚˜์˜จ ๊ฒŒ ์™€์ผ๋“œ์นด๋“œ๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

 

 

์™€์ผ๋“œ์นด๋“œ <?>

์ƒ๊ธด ๊ฑฐ ๊ฐ™์ด ๋ฌด์Šจ ํƒ€์ž…์ธ์ง€ ๋ชจ๋ฅผ ๋•Œ ์‚ฌ์šฉํ•˜๋Š”(๋ชจ๋“  ํƒ€์ž…์„ ๋Œ€์‹ ํ•  ์ˆ˜ ์žˆ๋Š”) ํƒ€์ž…์ด๋‹ค.

๋ถˆ๊ณต๋ณ€์ธ Generic์˜ ํƒ€์ž…์„ ์™€์ผ๋“œ์นด๋“œ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜๋ฉด์„œ, ์œ„์™€ ๊ฐ™์€ ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์ด์šฉํ•ด ArrayList๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค๋ฉด, ์–ด๋–ค ํด๋ž˜์Šค๋“ ์ง€ ๋“ค์–ด๊ฐ€ ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž… ์•ˆ์ „์„ฑ์ด ๊นจ์ง€๊ฒŒ ๋˜์–ด ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์—ฐ์‚ฐ์€ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ฒŒ ๋œ๋‹ค.

 

๊ทธ๋ž˜์„œ JAVA์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์™€์ผ๋“œ์นด๋“œ์˜ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•ด ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€๋Š”๋ฐ, ์ƒํ•œ์„ ๊ณผ ํ•˜ํ•œ์„ ์„ ์ด์šฉํ•ด ์™€์ผ๋“œ์นด๋“œ์˜ ๋ฒ”์ฃผ๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

 

 

 

 

 

 

'Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JAVA] Lambda  (0) 2024.07.24
[JAVA] Comparable? Comparator?  (3) 2024.07.23
[JAVA] ์ถ”์ƒ  (1) 2024.07.20
[JAVA] ๋‹คํ˜•์„ฑ  (2) 2024.07.18
[JAVA] ์ฝ”๋“œ ์™ธ ์ž‘์„ฑํ•  ๊ฒƒ๋“ค  (0) 2024.07.17