ch21 : Generic

๋ชฉ์ฐจ

Generic ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ?

๋งŒ์•ฝ DTO์˜ ๋ฉค๋ฒ„ํ•„๋“œ๋ฅผ Object๋กœ ํ•  ๊ฒฝ์šฐ,

๋ฆฌํ„ด๊ฐ’์„ Object๋กœ ๋ฐ›์•„์„œ ์‹ค์ œ ์‚ฌ์šฉ์‹œ์—๋Š” ํ˜•๋ณ€ํ™˜์„ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

๋‹ค๋งŒ, ์ด๋•Œ ์‹ค์ œ ์–ด๋–ค ์ž๋ฃŒํ˜•์ธ์ง€ ํ˜ผ๋™๋  ์ˆ˜ ์žˆ๋‹ค. (instanceof๋ฅผ ํ†ตํ•ด ์ง์ ‘ if-else๋ฌธ์œผ๋กœ ํƒ€์ž…์„ ์ ๊ฒ€ํ•ด์ค„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋ฒˆ๊ฑฐ๋กญ๋‹ค.)

โ‡’ ์ด๋•Œ ์ด ์ž๋ฃŒํ˜•์„ ์ปดํŒŒ์ผ ์‹œ์ ์— ์ ๊ฒ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ฒƒ์ด Generic์ด๋‹ค!

์˜ˆ์‹œ)

๐Ÿ’ก ์ด๋Ÿฐ ์‹์œผ๋กœ ํ˜•๋ณ€ํ™˜์„ ์ง์ ‘ ํ•ด์ฃผ์ง€ ์•Š๊ณ , ํ•ด๋‹น ์ž๋ฃŒํ˜•์ด ๊ทธ๋Œ€๋กœ ๋ฆฌํ„ด๋œ๋‹ค. ์ด๋•Œ ๋งŒ์•ฝ ์ž๋ฃŒํ˜•์ด ๋‹ค๋ฅด๋ฉด, ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ œ๋„ค๋ฆญ ํƒ€์ž… ์ด๋ฆ„ ์ •ํ•˜๊ธฐ

  • E : ์š”์†Œ (์ž๋ฐ” Collections)

  • K : ํ‚ค

  • N : ์ˆซ์ž

  • T : ํƒ€์ž…

  • V : ๊ฐ’

  • S, U, V : ๊ฐ๊ฐ 2,3,4 ๋ฒˆ์งธ ์„ ์–ธ๋œ ํƒ€์ž…

Wildcard

  • <?>

  • ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์—ฌ๋Ÿฌ ํƒ€์ž…์„ ๋ฐ›๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ <?>์„ ์‚ฌ์šฉํ•œ๋‹ค.

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

  • ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ๋Š” instanceof๋ฅผ ํ†ตํ•ด์„œ ํƒ€์ž…์„ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.

  • ์˜ˆ์‹œ) ๋ฉ”์†Œ๋“œ์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•œ๊ฐ€์ง€ ํƒ€์ž…๋งŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๋˜์–ด์žˆ๋‹ค.

    // ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค
    public class WildcardGeneric<W> {
      W wildcard;
    
    public void setWildcard(W wildcard) {
        this.wildcard = wildcard;
    	}
    
    public W getWildcard() {
        return wildcard;
    	}
    }
    
    // ์ œ๋„ˆ๋ฆญ ๊ฐ์ฒด ์ƒ์„ฑ
    WildcardGeneric<String> tmp = new WildcardGeneric<String>();
    wildcardMethod(tmp); // ํ•จ์ˆ˜ ํ˜ธ์ถœ
    
    // ํ•จ์ˆ˜-> ๋งค๊ฐœ๋ณ€์ˆ˜ Stringํƒ€์ž…๋งŒ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
    public void wildcardMethod(WildcardGeneric<String> c) {
    	String val = c.getValue();
      // ...
    }
  • ๋‹จ, <?> ์™€์ผ๋“œ์นด๋“œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ๋งŒ ์‚ฌ์šฉํ•  ๊ฒƒ! ๊ฐ์ฒด ์„ ์–ธ ์‹œ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ํŠน์ • ํƒ€์ž…์œผ๋กœ ๊ฐ’์„ ํ• ๋‹นํ• ์ˆ˜๋Š” ์—†๋‹ค.

    // ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์—ฌ๋Ÿฌ ํƒ€์ž…์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
    public void wildcardMethod(WildcardGeneric<?> c) {
    	Object val = c.getValue();
    	if(val instanceof String) {
      // 
    	}
    }

Bounded Wildcard

  • <? extends ๋ถ€๋ชจํด๋ž˜์Šค>

  • ์™€์ผ๋“œ์นด๋“œ์˜ ํƒ€์ž… ๋ฒ”์œ„๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋งค๊ฐœ๋ณ€์ˆ˜/๋ฆฌํ„ด๊ฐ’์—์„œ <?> ๋Œ€์‹  <? extends ๋ถ€๋ชจํด๋ž˜์Šค> ์„ ์‚ฌ์šฉํ•˜๋ฉด, ์ƒ์†๋ฐ›์€ ๋ถ€๋ชจํด๋ž˜์Šค๋งŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

public void callWildcardMethod(WildcardGeneric<T extends Car> c) {
	Car val = c.getValue();
	//...
}
  • ๋‹จ, ์ด ๊ฒฝ์šฐ์—๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์˜จ ๋ณ€์ˆ˜์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋‹ค.

    • ์™€์ผ๋“œ์นด๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ํŠน์ • ํƒ€์ž…์œผ๋กœ ๊ฐ’์ด ํ• ๋‹น๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ!

    • ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์˜จ ๋ณ€์ˆ˜์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์œผ๋ฉด,

    • ๋ฉ”์†Œ๋“œ ์„ ์–ธ ์‹œ ๋ฆฌํ„ด ํƒ€์ž… ์•ž์— ์ œ๋„ˆ๋ฆญํ•œ ํƒ€์ž…์„ ์„ ์–ธํ•ด ์ฃผ๊ณ , ๊ทธ ํƒ€์ž…์„ ๋งค๊ฐœ ๋ณ€์ˆ˜์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

    public<T> void callWildcardMethod(WildcardGeneric<T> c, T addValue) {
      c.setWildcard(addValue);
      T value = c.getWildcard();
      System.out.println(value);
    }

Last updated