๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’Š Java & Kotlin & Spring/- Java & kotlin

[Java ์‹ฌํ™”] Generic(์ œ๋„ค๋ฆญ)์„ ํ•ต์‹ฌ๋งŒ ์ดํ•ดํ•ด๋ณด์ž.

by Wonit 2020. 8. 27.

์ด ์‹œ๋ฆฌ์ฆˆ๋Š” Spring์—์„œ Generic์„ ์ด์šฉํ•˜์—ฌ CRUD ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์„ฑํ•ด๋ณด์ž.์™€ ์ด์–ด์ง€๋Š” ๊ธ€ ์ž…๋‹ˆ๋‹ค.

  1. Generic(์ œ๋„ˆ๋ฆญ)์„ ํ•ต์‹ฌ๋งŒ ์ดํ•ดํ•ด๋ณด์ž.
  2. Spring์—์„œ Generic์„ ์ด์šฉํ•˜์—ฌ CRUD ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์„ฑํ•ด๋ณด์ž.

์ด ๊ธ€์€ ์ด๋ก ์— ๊ด€๋ จํ•œ ๊ธ€์ด๊ณ  ์‹ค์ „์—์„œ ์–ด๋–ป๊ฒŒ ์“ฐ์ด๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹œ๋‹ค๋ฉด 2๋ฒˆ ๋งํฌ๋ฅผ ํด๋ฆญํ•ด์„œ ํ™•์ธํ•ด์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.


์˜ค๋Š˜ ์•Œ์•„๋ณผ ๊ฒƒ์€ ๋ฐ”๋กœ Generic(์ œ๋„ˆ๋ฆญ)์œผ๋กœ ๋ถˆ๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.

 

์ œ๋„ˆ๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์™€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ์•Œ๊ฒ ๋Š”๋ฐ ์‹ค์ „์—์„œ ๋–ค ํด๋ž˜์Šค๋ฅผ ์ œ๋„ˆ๋ฆญ์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ๊ฑฐ๋‚˜ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ์ด๋ฒˆ ์‹œ๋ฆฌ์ฆˆ๊ฐ€ ํฐ ๋„์›€์ด ๋˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•œ๋‹ค.

 

์‹œ์ž‘ํ•ด๋ณด์ž.

Generic

์ œ๋„ˆ๋ฆญ์€ Java 1.5 ๋ฒ„์ „๋ถ€ํ„ฐ ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฉฐ ๋ญ ์ด๋Ÿฐ ์ด์•ผ๊ธฐ๋Š” ์ž ์‹œ ์ ‘์–ด ๋‘๊ณ  ์ œ๋„ˆ๋ฆญ์ด ๋ฌด์—‡์ด๋ฉฐ ์™œ ์ œ๋„ˆ๋ฆญ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์•Œ์•„์•ผํ•œ๋‹ค.



์ œ๋„ˆ๋ฆญ์ด๋ž€?

์‰ฝ๊ฒŒ ํƒ€์ž…์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฐ€์ง€๋Š” ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉฐ ์ด๋ฆ„ ๋’ค์— <> ๊ฐ€ ๋ถ™๋Š”๋‹ค. ๋ผ๊ณ  ํ•ด๋‘์ž.


์˜๋ฏธ๋ก ์ ์œผ๋กœ๋Š” ๋” ๋‹ค์–‘ํ•˜๊ฒŒ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐฑ๋ฌธ์ด ๋ถˆ์—ฌ์ผ๊ฒฌ์ด๋ผ ํ•œ ๋ฒˆ ๋ณด๋Š” ๊ฒƒ์ด ๋ฐฑ๋ฒˆ์˜ ์„ค๋ช…๋ณด๋‹ค ๋‚ซ๋‹ค.

 

์ œ๋„ˆ๋ฆญ์˜ ์žฅ์ 

  • ์ปดํŒŒ์ผ ์‹œ์— ๊ฐ•ํ•œ ํƒ€์ž… ์ฒดํฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Casting ์ œ๊ฑฐํ•œ๋‹ค.

์ปดํŒŒ์ผ ์‹œ์— ๊ฐ•ํ•œ ํƒ€์ž… ์ฒดํฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‹œ์ ์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ ์„ ์ œ๊ธฐํ•ด์ค€๋‹ค.


์˜ˆ๋ฅผ ๋“ค์–ด์„œ

 

LinkedList<String> list = new LinkedList<>()๋ผ๋Š” ๊ตฌ๋ฌธ์ด ์žˆ์œผ๋ฉด ์šฐ๋ฆฌ๋Š” ๋‹น์—ฐํžˆ

list๋ผ๋Š” ๋ณ€์ˆ˜์—๋Š” String ํƒ€์ž…๋งŒ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์™œ๋ƒ? ๋ฐ”๋กœ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ String์œผ๋กœ ์ง€์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

ํ•˜์ง€๋งŒ ์ œ๋„ˆ๋ฆญ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋ฒ—์–ด๋‚œ ํƒ€์ž…์„ ์ œ๊ณตํ•œ๋‹ค๋ฉด ์ปดํŒŒ์ผ ์‹œ์ ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๋ฅผ ๋‚ด๋ฟœ๋Š”๋‹ค.

์ด๋Ÿฐ ์‹์œผ๋กœ ์ปดํŒŒ์ผ ์‹œ์ ์— ํƒ€์ž… ์ฒดํฌ๋ฅผ ๊ฐ•์ œํ™” ํ•  ์ˆ˜ ์žˆ๊ณ  ์ด ๋ง์€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ฝ”๋“œ์˜ ์ •ํ™•์„ฑ์ด ๋†’์•„์ง„๋‹ค๋Š” ์žฅ์ ์ด ๋œ๋‹ค.

Casting์ด ์ œ๊ฑฐ๋œ๋‹ค.

์บ์ŠคํŒ…์€ ์šฐ๋ฆฌ๊ฐ€ ํ˜• ๋ณ€ํ™˜์„ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ค‘ ํ•˜๋‚˜๋กœ ์•Œ๊ณ  ์žˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด์„œ Box๋ผ๋Š” ํด๋ž˜์Šค์— String์„ set ํ•ด์ฃผ๊ณ  get ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ๋“ค์–ด๊ฐ„ String์„ ์ถœ๋ ฅํ•˜๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ ์šฐ๋ฆฌ๋Š”

class Box {

    private String data;

    void setData(String data) {
        this.data = data;
    }

    String getData() {
        return data;
    }
}

์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ•˜์ง€๋งŒ Box๋ผ๋Š” ํด๋ž˜์Šค์— Integerํ˜• ํƒ€์ž…์˜ ๋ณ€์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜๋„ ์žˆ๊ณ , Double ํƒ€์ž…์˜ ๋ณ€์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜๋„ ์žˆ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์–ด๋–ค ํƒ€์ž…์ด ์˜ฌ์ง€ ๋ชจ๋ฅด๋‹ˆ Object ํƒ€์ž…์œผ๋กœ ๋ฐ›์•„์„œ Object ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜์‹œํ‚ค๋ฉด ์‚ฌ์šฉํ•  ๋•Œ์— ํ˜•๋ณ€ํ™˜ ๊ณผ์ •์ด ํ•„์ˆ˜์ ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์ œ๋„ˆ๋ฆญ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด

๋ณด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ํ˜•๋ณ€ํ™˜์˜ ๋ถˆํ•„์š”ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์–ด ์ „์ฒด ์„ฑ๋Šฅ์„ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ์ƒ์Šน์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

์ด๋ ‡๊ฒŒ ์ œ๋„ˆ๋ฆญ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์กฐ๊ธˆ ๋” ์šฐ์•„ํ•œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

๊ทธ๋Ÿผ ๊ธฐ๋ณธ์— ๋Œ€ํ•ด์„œ๋Š” ์•Œ์•˜๊ณ  ์ด์ œ ๋ช‡ ๊ฐ€์ง€์˜ ๋”์šฑ ์šฐ์•„ํ•œ ๋ฐฉ๋ฒ•์˜ ์ œ๋„ˆ๋ฆญ์„ ์•Œ์•„๋ณด์ž.

๋‘ ๊ฐœ์˜ ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ

์ œ๋„ค๋ฆญ์—์„œ๋Š” ๋‘ ๊ฐœ ์ด์ƒ์˜ ํƒ€์ž…์— ๋Œ€ํ•ด์„œ ๋ฉ€ํ‹ฐ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


์ด๊ฒƒ๋„ ๋ง์ด ์–ด๋ ต์ง€ ์‹ค์ œ๋กœ ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋˜ ๊ฒƒ ์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

 

HashMap<String, Integer> map = new HashMap<>();

 

ํ•ด์‹œ๋งต์„ ์ด์šฉํ•ด์„œ Key: value ์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ”๋กœ ์ด ๊ตฌ์กฐ๊ฐ€ ๋ฉ€ํ‹ฐ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ ์ด๋‹ค.

 

์—ฌ๊ธฐ์„œ ์•Œ์•„๋‘๋ฉด ์–ธ์  ๊ฐ„ ์“ธ๋ชจ๊ฐ€ ์žˆ๋Š” ์ง€์‹์ด ์žˆ๋‹ค๋ฉด ์ž๋ฐ” 6๋ฒ„์ „ ์ด์ „๋ถ€ํ„ฐ๋Š” ๋ฉ€ํ‹ฐ ํƒ€์ž…์— ์ผ์ผ์ด ๊ตฌ์ฒด์  ํƒ€์ž…์„ ์ง€์ •ํ•ด์คฌ์—ˆ๋‹ค.

 

๋ฐ”๋กœ ์ด๋ ‡๊ฒŒ

 

HashMap<String, Integer> map = new HashMap<String, Integer>();

 

ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด๋‚˜๋„ ์‹ซ์–ดํ•˜๋Š” ์ฝ”๋“œ์˜ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•˜๊ณ  ์ฝ”๋“œ๊ฐ€ ๋”๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์œ ๋กœ ์ž๋ฐ” 7๋ถ€ํ„ฐ๋Š” ๋‹ค์ด์•„๋ชฌ๋“œ ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด์„œ ํƒ€์ž…์„ ์ž๋™์œผ๋กœ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ์˜ ์ด HashMap<String, Integer> map = new HashMap<>(); ์šฐ์•„ํ•œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์ œ๋„ˆ๋ฆญ ๋ฉ”์„œ๋“œ

์ œ๋„ˆ๋ฆญ ๋ฉ”์„œ๋“œ๋Š” ๋งค๊ฐœ ํƒ€์ž…๊ณผ ๋ฆฌํ„ด ํƒ€์ž…์œผ๋กœ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ–๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

 

๋ณดํ†ต ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  ์“ธ ์ˆ˜ ์žˆ๋Š” static ๋ฉ”์„œ๋“œ์— ์ž์ฃผ ์“ฐ์ด๊ณค ํ•˜๋Š”๋ฐ ๊ทธ๋„ ๊ทธ๋Ÿด ๊ฒƒ์ด,


ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š์œผ๋ฉด ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•  ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ค ํด๋ž˜์Šค๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์„œ๋“œ ๋‹จ์œ„์—์„œ ์ปดํŒŒ์ผ ์ฒดํฌ๋ฅผ ํ•ด์ค„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

public class Pair<K, V> {
    private K key;
    private V value;

    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }

    public void setKey(K key) { this.key = key; }
    public void setValue(V value) { this.value = value; }
    public K getKey()   { return key; }
    public V getValue() { return value; }
}

public class Util {
    public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
        return p1.getKey().equals(p2.getKey()) &&
                p1.getValue().equals(p2.getValue());
    }
}
ํ•ด๋‹น ์†Œ์Šค์ฝ”๋“œ๋Š” ๋น ๋ฅธ ์„ค๋ช…์„ ์œ„ํ•ด ๋ฐฑ์ค‘์› ๊ฐœ๋ฐœ์ž๋‹˜์˜ medium ๋ธ”๋กœ๊ทธ์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. ์ถœ์ฒ˜

๋ฐฑ์ค‘์› ๊ฐœ๋ฐœ์ž๋‹˜์ด ์ž‘์„ฑํ•˜์‹  ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ณด์ž๋ฉด Util ํด๋ž˜์Šค์—์„œ static์œผ๋กœ compare์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ <K, V>์˜ ์ œ๋„ค๋ฆญ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค.

 

๋ณดํ†ต ์ด๋Ÿฐ ๊ฒฝ์šฐ์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€

<์ œ๋„ค๋ฆญ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ> ๋ฐ˜ํ™˜ ํƒ€์ž… ๋ฉ”์„œ๋“œ ์ด๋ฆ„ (๋งค๊ฐœ๋ณ€์ˆ˜) {...}

์˜ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๊ณค ํ•œ๋‹ค.


์ด๋ ‡๊ฒŒ ์˜ค๋Š˜์€ ๊ธฐ๋ณธ์ ์ธ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋‹ค.

๋‹ค์Œ์‹œ๊ฐ„์—๋Š” ์กฐ๊ธˆ ๋” ๊นŠ๊ฒŒ ๋“ค์–ด๊ฐ€์„œ

? ํ˜•ํƒœ์˜ ์™€์ผ๋“œ ์นด๋“œ์— ๋Œ€ํ•ด์„œ๋„ ์•Œ์•„๋ณด๊ณ  ์กฐ๊ธˆ ์ด๋ก ์ ์ธ ์‹ฌํ™” ๋‚ด์šฉ์„ ํ•œ ๋ฒˆ ๋‹ค๋ค„๋ณด์ž.

์˜ค๋Š˜์€ ์ถฉ๋ถ„ํ•˜๋‹ค.

๋Œ“๊ธ€