[JAVA] Generic,Enum

Updated:

Categories:

Tags: ,

๐Ÿ“Œ ๊ฐœ์ธ์ ์ธ ๊ณต๊ฐ„์œผ๋กœ ๊ณต๋ถ€๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ๋ณต์Šตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
์ •ํ™•ํ•˜์ง€ ์•Š์€ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ๋ฐ”๋ž๋‹ˆ๋‹ค :๐Ÿ˜ธ
[ํ‹€๋ฆฐ ๋‚ด์šฉ์€ ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ๋ณต๋ฐ›์œผ์‹ค๊ฑฐ์—์š”]

getter์™€ setter

  • getter์™€ setter ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋ณดํ˜ธํ•˜๋ฉด์„œ๋„ ์˜๋„ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์บก์Аํ™”๋ฅผ ๋ณด๋‹ค ํšจ๊ณผ์ ์œผ๋กœ ๋‹ฌ์„ฑ
  • getter-setter๋Š” public์ด default

getter ๋ฉ”์„œ๋“œ

โ†’ ์„ค์ •ํ•œ ๋ณ€์ˆ˜๊ฐ’์„ ์ฝ์–ด์˜ค๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ

โ†’ get-์„ ๋ฉ”์„œ๋“œ๋ช… ์•ž์— ๋ถ™์—ฌ์„œ ์‚ฌ์šฉ

setter ๋ฉ”์„œ๋“œ

โ†’ ์™ธ๋ถ€์—์„œ ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•˜์—ฌ ์กฐ๊ฑด์— ๋งž์„ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์คŒ

โ†’ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”์„œ๋“œ๋ช…์— set-์„ ๋ถ™์—ฌ์„œ ์ •์˜

์˜ˆ์ œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class GetterSetterTest {
    public static void main(String[] args) {
        Worker w = new Worker();
        w.setName("๊น€์ œ๋ฆฌ");
        w.setAge(30);
        w.setId(5);

        String name = w.getName();
        System.out.println("๊ทผ๋กœ์ž์˜ ์ด๋ฆ„์€ " + name);
        int age = w.getAge();
        System.out.println("๊ทผ๋กœ์ž์˜ ๋‚˜์ด๋Š” " + age);
        int id = w.getId();
        System.out.println("๊ทผ๋กœ์ž์˜ ID๋Š” " + id);
    }
}

class Worker {
    private String name; // ๋ณ€์ˆ˜์˜ ์€๋‹‰ํ™”. ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ ‘๊ทผ ๋ถˆ๊ฐ€
    private int age;
    private int id;

    public String getName() { // ๋ฉค๋ฒ„๋ณ€์ˆ˜์˜ ๊ฐ’ 
        return name;
    }

    public void setName(String name) { // ๋ฉค๋ฒ„๋ณ€์ˆ˜์˜ ๊ฐ’ ๋ณ€๊ฒฝ
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age < 1) return;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

// ์ถœ๋ ฅ๊ฐ’
๊ทผ๋กœ์ž์˜ ์ด๋ฆ„์€ ๊น€์ œ๋ฆฌ
๊ทผ๋กœ์ž์˜ ๋‚˜์ด๋Š” 30
๊ทผ๋กœ์ž์˜ ID๋Š” 5


์ œ๋„ค๋ฆญ

  1. ์ œ๋„ค๋ฆญ์ด๋ž€?
    • ํƒ€์ž…์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ถ”ํ›„์— ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ผ๋ฐ˜ํ™”ํ•ด ๋‘๋Š” ๊ฒƒ์„ ์˜๋ฏธ
    • ์ฆ‰, ์ž‘์„ฑํ•œ ํด๋ž˜์Šค ๋˜๋Š” ๋ฉ”์„œ๋“œ์˜ ์ฝ”๋“œ๊ฐ€ ํŠน์ • ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ์–ฝ๋งค์ด์ง€ ์•Š๊ฒŒ ํ•ด ๋‘” ๊ฒƒ
  2. ์ œ๋„ค๋ฆญ ์‚ฌ์šฉ์ด์œ 
    1. ๊ธฐ์กด์˜ ๋ฐฉ์‹

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      
       class Basket {
           private String item;
              
           Basket(String item) {
               this.item = item;
           }
              
           public String getItem() {
               return item;
           }
              
           public void setItem(String item) {
               this.item = item;
           }
       }
      
      • item์€ String type ๋งŒ ์˜ฌ ์ˆ˜ ์žˆ์Œ
    2. ์ œ๋„ค๋ฆญ ์‚ฌ์šฉ

      ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹จ ํ•˜๋‚˜์˜ Basket ํด๋ž˜์Šค๋งŒ์œผ๋กœ ๋ชจ๋“  ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      
       class Basket<T> {
           private T item;
              
           public Basket(T item) {
               this.item = item;
           }
              
           public T getItem() {
               return item;
           }
              
           public void setItem(T item) {
               this.item = item;
           }
       }
      
      • Basket class์˜ ์ธ์Šคํ„ด์Šคํ™”

        1
        
          Basket<String> basket1 = new Basket<String>("item");
        

        โ†’์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Basket ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ T๊ฐ€ ๋ชจ๋‘ String์œผ๋กœ ์น˜ํ™˜

        โ†’ ๋งŒ์•ฝ ์›์‹œํƒ€์ž…์œผ๋กœ ์น˜ํ™˜์‹œ wrapper class๋กœ ์น˜ํ™˜๋จ

        Ex) Integer, Double๊ณผ ๊ฐ™์€ ๋ž˜ํผ ํด๋ž˜์Šค

์ œ๋„ค๋ฆญ ํด๋ž˜์Šค ์‚ฌ์šฉ๋ฒ•

  1. ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค

    1
    2
    3
    
     class Basket<T> {
        
     }
    
    • T๋ฅผ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜
    • <T>์™€ ๊ฐ™์ด ๊บพ์‡  ์•ˆ์— ๋„ฃ์–ด ํด๋ž˜์Šค ์ด๋ฆ„ ์˜†์— ์ž‘์„ฑํ•ด ์คŒ์œผ๋กœ์จ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ๊ฐ€๋Šฅ
  2. ๋งŒ์•ฝ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ

    1
    
     class Basket<K, V> { ... }
    
    • T, K, V๋Š” ๊ฐ๊ฐ Type, Key, Value์˜ ์ฒซ ๊ธ€์ž๋ฅผ ๋”ฐ์˜จ ๊ฒƒ
  3. ์ œ๋„ค๋ฆญํด๋ž˜์Šค ์ฃผ์˜์‚ฌํ•ญ

    ํด๋ž˜์Šค ๋ณ€์ˆ˜(static)์—๋Š” ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉ๋ถˆ๊ฐ€

    • ํด๋ž˜์Šค ๋ณ€์ˆ˜๋Š” ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋ณ€์ˆ˜ โ‡’ ํด๋ž˜์Šค ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด ์ธ์Šคํ„ด์Šค ๋ณ„๋กœ ๋‹ฌ๋ผ์ง€๊ฒŒ ๋จ.
  4. ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜์— ์น˜ํ™˜๋  ํƒ€์ž…์œผ๋กœ ๊ธฐ๋ณธ ํƒ€์ž…์„ ์ง€์ •๋ถˆ๊ฐ€
    1. int, double๊ณผ ๊ฐ™์€ ์›์‹œ ํƒ€์ž…์„ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š” ๋งฅ๋ฝ์—์„œ๋Š” Integer, Double๊ณผ ๊ฐ™์€ ๋ž˜ํผ ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉ

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      
       Basket<String>  basket1 = new Basket<String>("Hello");
       Basket<Integer> basket2 = new Basket<Integer>(10);
       Basket<Double>  basket3 = new Basket<Double>(3.14);
              
       ----
       // new Basket<โ€ฆ>์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์„ ์ƒ๋žตํ•˜๊ณ  ์ž‘์„ฑ๊ฐ€๋Šฅ
       // => ์ฐธ์กฐ๋ณ€์ˆ˜์˜ ํƒ€์ž…์œผ๋กœ๋ถ€ํ„ฐ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ
       Basket<String>  basket1 = new Basket<>("Hello");
       Basket<Integer> basket2 = new Basket<>(10);
       Basket<Double>  basket2 = new Basket<>(3.14);
      
  5. ๋‹คํ˜•์„ฑ ์ ์šฉ ๊ฐ€๋Šฅ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
     class Flower { ... }
     class Rose extends Flower { ... }
     class RosePasta { ... }
        
     class Basket<T> {
         private T item;
        
         public T getItem() {
             return item;
         }
        
         public void setItem(T item) {
             this.item = item;
         }
     }
        
     class Main {
         public static void main(String[] args) {
             Basket<Flower> flowerBasket = new Basket<>();
             flowerBasket.setItem(new Rose());      // ๋‹คํ˜•์„ฑ ์ ์šฉ
             flowerBasket.setItem(new RosePasta()); // ์—๋Ÿฌ
         }
     }
    
    • Main ํด๋ž˜์Šค์˜ main method์—์„œ flowerBasket์€ Basket์˜ ํƒ€์ž…์œผ๋กœ ๊ฐ์ฒด Flower๋กœ ์ง€์ •ํ•˜์—ฌ ๊ฐ์ฒด ์ƒ์„ฑ
    • new Rose()๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋Š” Rose ํƒ€์ž…์ด๋ฉฐ, Rose ํด๋ž˜์Šค๋Š” Flower ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์žˆ์œผ๋ฏ€๋กœ, flowerBasket ์˜ item์— ํ• ๋‹น๊ฐ€๋Šฅ
    • ๋ฐ˜๋ฉด, new RosePasta()๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋Š” RosePasta ํƒ€์ž…์ด๋ฉฐ, RosePasta ํด๋ž˜์Šค๋Š” Flower ํด๋ž˜์Šค์™€ ์•„๋ฌด๋Ÿฐ ๊ด€๊ณ„๊ฐ€ ์—†์œผ๋ฏ€๋กœ ํ• ๋‹น ๋ถˆ๊ฐ€.

    ์ฆ‰, Basket ํด๋ž˜์Šค๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•  ๋•Œ ํƒ€์ž…์œผ๋กœ Flower ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค๋งŒ ์ง€์ •ํ•˜๋„๋ก ์ œํ•œ

  6. ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋งŒ ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œ๊ฐ€

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
     interface Plant { ... }
     class Flower implements Plant { ... }
     class Rose extends Flower implements Plant { ... }
        
     class Basket<T extends Plant> {
         private T item;
        
     		...
     }
        
     class Main {
         public static void main(String[] args) {
        
             // ์ธ์Šคํ„ด์Šคํ™”
             Basket<Flower> flowerBasket = new Basket<>();
             Basket<Rose> roseBasket = new Basket<>();
         }
     }
    
    • ํŠน์ • ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉด์„œ ๋™์‹œ์— ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋งŒ ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด &๋ฅผ ์‚ฌ์šฉ โ‡’ ์ด ๊ฒฝ์šฐ์—๋Š” ํด๋ž˜์Šค๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค ์•ž์— ์œ„์น˜ ์‹œ์ผœ์•ผ ํ•จ.

      1
      2
      3
      4
      
        class Basket<T extends **Flower** & Plant> { // (1)
            private T item;
            		...
        }
      

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

  1. ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ํŠน์ • ๋ฉ”์„œ๋“œ๋งŒ ์ œ๋„ค๋ฆญ์œผ๋กœ ์„ ์–ธ๊ฐ€๋Šฅ

    1
    2
    3
    4
    5
    6
    
     class Basket {
     		...
     		public <T> void add(T element) {
     				...
     		}
     }
    
    • ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ์˜ ํƒ€์ž… ๋งค๊ฐœ ๋ณ€์ˆ˜ ์„ ์–ธ์€ ๋ฐ˜ํ™˜ํƒ€์ž… ์•ž์—์„œ ์ด๋ฃจ์–ด์ง€๋ฉฐ, ํ•ด๋‹น ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ๋งŒ ์„ ์–ธํ•œ ํƒ€์ž… ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉ๊ฐ€๋Šฅ
  2. ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ์˜ ํƒ€์ž… ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค์˜ ํƒ€์ž… ๋งค๊ฐœ ๋ณ€์ˆ˜์™€ ๋ณ„๊ฐœ์˜ ๊ฒƒ

    1
    2
    3
    4
    5
    6
    
     class Basket<T> { // 1 : ์—ฌ๊ธฐ์—์„œ ์„ ์–ธํ•œ ํƒ€์ž… ๋งค๊ฐœ ๋ณ€์ˆ˜ T์™€
     		...
     		public <T> void add(T element) { // 2 : ์—ฌ๊ธฐ์—์„œ ์„ ์–ธํ•œ ํƒ€์ž… ๋งค๊ฐœ ๋ณ€์ˆ˜ T๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
     				...
     		}
     }
    
    • ํด๋ž˜์Šค๋ช… ์˜†์—์„œ ์„ ์–ธํ•œ ํƒ€์ž… ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ ํƒ€์ž…์ด ์ง€์ •๋จ
    • ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ์˜ ํƒ€์ž… ์ง€์ •์€ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์ด๋ฃจ์–ด์ง.

      1
      2
      3
      4
      5
      6
      
        Basket<String> basket = new Bakset<>(); 
        // ์œ„ ์˜ˆ์ œ์˜ 1์˜ T๊ฐ€ String์œผ๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค.
        basket.<Integer>add(10);                
        // ์œ„ ์˜ˆ์ œ์˜ 2์˜ T๊ฐ€ Integer๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค.
        basket.add(10);                         
        // ํƒ€์ž… ์ง€์ •์„ ์ƒ๋žตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
      
  3. static ๋ฉ”์„œ๋“œ์—์„œ๋„ ์„ ์–ธํ•˜์—ฌ ์‚ฌ์šฉ๊ฐ€๋Šฅ

    ํด๋ž˜์Šค ํƒ€์ž… ๋งค๊ฐœ ๋ณ€์ˆ˜์™€ ๋‹ฌ๋ฆฌ ๋ฉ”์„œ๋“œ ํƒ€์ž… ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” static ๋ฉ”์„œ๋“œ์—์„œ๋„ ์„ ์–ธํ•˜์—ฌ ์‚ฌ์šฉ๊ฐ€๋Šฅ

    1
    2
    3
    4
    5
    6
    
    class Basket {
    		...
    		static <T> int setPrice(T element) {
    				...
    		}
    }
    
  4. String ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋Š” ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ์‹œ์ ์— ์‚ฌ์šฉ๋ถˆ๊ฐ€ but, Object ํด๋ž˜์Šค๋Š” ๊ฐ€๋Šฅ

    1. ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์—์„œ ์ œ๋„ค๋ฆญ ํƒ€์ž…์ด ๊ฒฐ์ •๋˜๋ฏ€๋กœ, ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ์‹œ์ ์—์„œ๋Š” ์‹ค์ œ ์–ด๋–ค ํƒ€์ž…์ด ์ž…๋ ฅ๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— String ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€
    2. ๋ชจ๋“  ์ž๋ฐ” ํด๋ž˜์Šค์˜ ์ตœ์ƒ์œ„ ํด๋ž˜์Šค์ธ Object ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅ

      Ex) equals(), toString() ๋“ฑ์ด Object ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ

์™€์ผ๋“œ์นด๋“œ

์–ด๋– ํ•œ ํƒ€์ž…์œผ๋กœ๋“  ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ, ๊ธฐํ˜ธ?๋กœ ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉ๊ฐ€๋Šฅ

  1. ์ผ๋ฐ˜์ ์œผ๋กœ ์™€์ผ๋“œ์นด๋“œ๋Š” extends์™€ super ํ‚ค์›Œ๋“œ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ

    1
    
     <? extends T><? super T>
    
    • <? extends T>๋Š” ์™€์ผ๋“œ์นด๋“œ์— ์ƒํ•œ ์ œํ•œ์„ ๋‘๋Š” ๊ฒƒ์œผ๋กœ์„œ, T์™€ T๋ฅผ ์ƒ์†๋ฐ›๋Š” ํ•˜์œ„ ํด๋ž˜์Šค ํƒ€์ž…๋งŒ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์ง€์ •
    • <? extends T>๋Š” ์™€์ผ๋“œ์นด๋“œ์— ์ƒํ•œ ์ œํ•œ์„ ๋‘๋Š” ๊ฒƒ์œผ๋กœ์„œ, T์™€ T๋ฅผ ์ƒ์†๋ฐ›๋Š” ํ•˜์œ„ ํด๋ž˜์Šค ํƒ€์ž…๋งŒ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์ง€์ •

    • ๋ฐ˜๋ฉด, <? super T>๋Š” ์™€์ผ๋“œ์นด๋“œ์— ํ•˜ํ•œ ์ œํ•œ์„ ๋‘๋Š” ๊ฒƒ์œผ๋กœ, T์™€ T์˜ ์ƒ์œ„ ํด๋ž˜์Šค๋งŒ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋„๋ก ํ•จ
  2. extends ๋ฐ super ํ‚ค์›Œ๋“œ์™€ ์กฐํ•ฉํ•˜์ง€ ์•Š์€ ์™€์ผ๋“œ์นด๋“œ(<?>)๋Š” <? extends Object>
    • ๋ชจ๋“  ํด๋ž˜์Šค ํƒ€์ž…์€ Object ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฏ€๋กœ, ๋ชจ๋“  ํด๋ž˜์Šค ํƒ€์ž…์„ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธ
  3. ์˜ˆ์ œ
    1. ์‚ฌ์šฉํ•  ํด๋ž˜์Šค ์ •์˜ - ์ƒ์†๊ณ„์ธต๋„

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      
       class Phone {}
              
       class IPhone extends Phone {}
       class Galaxy extends Phone {}
              
       class IPhone12Pro extends IPhone {}
       class IPhoneXS extends IPhone {}
              
       class S22 extends Galaxy {}
       class ZFlip3 extends Galaxy {}
              
       class User<T> {
       		public T phone;
              
       		public User(T phone) {
       				this.phone = phone;
       		}
       }
      
    2. ํœด๋Œ€์ „ํ™”๋ณ„ ๊ธฐ๋Šฅ๋ณ„ ๋ถ„๋ฅ˜

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      
       class PhoneFunction {
           public static void call(User<? extends Phone> user) {
       			System.out.println("user.phone = " + user.phone.getClass().getSimpleName());
             System.out.println("๋ชจ๋“  Phone์€ ํ†ตํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.");
           }
              
           public static void faceId(User<? extends IPhone> user) {
       			System.out.println("IPhone๋งŒ Face ID๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ");
           }
              
           public static void samsungPay(User<? extends Galaxy> user) {
       	    System.out.println("Galaxy๋งŒ ์‚ผ์„ฑ ํŽ˜์ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ");
           }
              
           public static void recordVoice(User<? super Galaxy> user) {
                
           }
       }
      
    3. ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

      1
      2
      3
      4
      5
      6
      7
      8
      9
      
       public class Example {
       	public static void main(String[] args) {
        // PhoneFunction.faceId(new User<Phone>(new Phone())); // X
           PhoneFunction.faceId(new User<IPhone>(new IPhone()));
           PhoneFunction.faceId(new User<IPhone15Pro>(new IPhone15Pro
       	  PhoneFunction.recordVoice(new User<Phone>(new Phone()));
       //  PhoneFunction.recordVoice(new User<IPhone>(new IPhone()));
       //  PhoneFunction.recordVoice(new User<S24>(new S24())); // X
       //  PhoneFunction.recordVoice(new User<ZFlip5>(new ZFlip5())); // X
      
      • ์ฃผ์„ ์ฒ˜๋ฆฌ๋Š” ์—๋Ÿฌ ๋ฐœ์ƒ ํ•˜๋Š” ๋ถ€๋ถ„
        • faceId๋Š” <? extends IPhone> ํƒ€์ž…์ด ์™€์•ผ ํ•˜๋ฏ€๋กœ Iphone์˜ ํ•˜์œ„ํด๋ž˜์Šค๋งŒ ๊ฐ€๋Šฅ, ๊ทธ๋ž˜์„œ ์ƒ์œ„ํด๋ž˜์Šค์ธ phone์€ ์˜ฌ ์ˆ˜ ์—†์Œ
        • recordVoice ๋ฉ”์„œ๋“œ๋Š” (User<? super Galaxy> user) โ‡’ ๊ฐค๋Ÿญ์‹œ์˜ ์ƒ์œ„ํด๋ž˜์Šค์˜ ํƒ€์ž…๋งŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ, ๊ทธ๋ž˜์„œ ZFlip5์™€ S24๋Š” ์˜ฌ ์ˆ˜ ์—†๊ณ  Phone๋งŒ ๊ฐ€๋Šฅ.

Enum

  • ์—ด๊ฑฐํ˜•(enum; enumerated type)์€ ์—ฌ๋Ÿฌ ์ƒ์ˆ˜๋“ค์„ ๋ณด๋‹ค ํŽธ๋ฆฌํ•˜๊ฒŒ ์„ ์–ธ ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฐ”์˜ ๋ฌธ๋ฒ•์š”์†Œ = ์„œ๋กœ ์—ฐ๊ด€๋œ ์ƒ์ˆ˜๋“ค์˜ ์ง‘ํ•ฉ์„ ์˜๋ฏธ
  • ์„œ๋กœ ๊ด€๋ จ ์žˆ๋Š” ๋‚ด์šฉ๋“ค์„ ๋ชจ์•„ ํ•œ ๋ฒˆ์— ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ โ‡’ ์‹ค๋ฌด์—์„œ ๋งŽ์ด ์“ฐ์ž„

Enum์˜ ํ•„์š”์„ฑ

  1. ๊ธฐ์กด์— ์ƒ์ˆ˜๋Š” public static final์„ ์‚ฌ์šฉ์‹œ ๋‹จ์ 
    1. ์ƒ์ˆ˜ ๋ช…์ด ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒ

      1
      2
      3
      4
      5
      6
      7
      8
      9
      
       public static final int SPRING = 1;
       public static final int SUMMER = 2;
       public static final int FALL   = 3;
       public static final int WINTER = 4;
              
       public static final int DJANGO  = 1;
       public static final int SPRING  = 2; // ๊ณ„์ ˆ์˜ SPRING๊ณผ ์ค‘๋ณต ๋ฐœ์ƒ!
       public static final int NEST    = 3;
       public static final int EXPRESS = 4;
      
    2. ์œ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด ์ฃผ์–ด์•ผ ํ•จ.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      
       class Seasons {
           public static final Seasons SPRING = new Seasons();
           public static final Seasons SUMMER = new Seasons();
           public static final Seasons FALL   = new Seasons();
           public static final Seasons WINTER = new Seasons();
       }
              
       class Frameworks {
           public static final Frameworks DJANGO  = new Frameworks();
           public static final Frameworks SPRING  = new Frameworks();
           public static final Frameworks NEST    = new Frameworks();
           public static final Frameworks EXPRESS = new Frameworks();
       }
      
      • but, ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— switch๋ฌธ์— ํ™œ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
  2. Enum ์‚ฌ์šฉ ์ด์ 

    1
    2
    
     enum Seasons { SPRING, SUMMER, FALL, WINTER }
     enum Frameworks { DJANGO, SPRING, NEST, EXPRESS }
    

    1) switch๋ฌธ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
     enum Seasons {SPRING, SUMMER, FALL, WINTER}
        
     public class Main {
         public static void main(String[] args) {
             Seasons seasons = Seasons.SPRING;
             switch (seasons) {
                 case SPRING:
                     System.out.println("๋ด„");
                     break;
                 case SUMMER:
                     System.out.println("์—ฌ๋ฆ„");
                     break;
                 case FALL:
                     System.out.println("๊ฐ€์„");
                     break;
                 case WINTER:
                     System.out.println("๊ฒจ์šธ");
                     break;
             }
         }
     }
        
     //์ถœ๋ ฅ๊ฐ’
     ๋ด„
    

    2) ์—ฌ๋Ÿฌ ์ƒ์ˆ˜๋“ค์„ ๋ณด๋‹ค ํŽธ๋ฆฌํ•˜๊ฒŒ ์„ ์–ธํ•˜๊ณ  ๊ด€๋ฆฌ ๊ฐ€๋Šฅ

    3) ์ƒ์ˆ˜ ๋ช…์˜ ์ค‘๋ณต์„ ํ”ผํ•˜๊ณ , ํƒ€์ž…์— ๋Œ€ํ•œ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅ

Enum ์‚ฌ์šฉ๋ฒ•

  1. ์—ด๊ฑฐํ˜• ์ •์˜

    1
    
     enum ์—ด๊ฑฐํ˜•์ด๋ฆ„ { ์ƒ์ˆ˜๋ช…1, ์ƒ์ˆ˜๋ช…2, ์ƒ์ˆ˜๋ช…3, ...}
    
    • ์ƒ์ˆ˜๋Š” ๋Œ€์†Œ๋ฌธ์ž๋กœ ๋ชจ๋‘ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๊ด€๋ก€์ ์œผ๋กœ ๋Œ€๋ฌธ์ž๋กœ ์ž‘์„ฑ
    • ๋”ฐ๋กœ ๊ฐ’์„ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ์ž๋™์ ์œผ๋กœ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ •์ˆ˜๊ฐ’์ด ํ• ๋‹น๋˜์–ด ๊ฐ๊ฐ์˜ ์ƒ์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋จ (์•„๋ž˜ ์˜ˆ์ œ -1 ์ฐธ๊ณ )
    • ์—ด๊ฑฐํ˜•์— ์„ ์–ธ๋œ ์ƒ์ˆ˜์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ด๊ฑฐํ˜•์ด๋ฆ„.์ƒ์ˆ˜๋ช…
    • ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ํ•œ์ •์ ์ธ ๋ฐ์ดํ„ฐ๋“ค์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌ๊ฐ€๋Šฅ
    • ์—ด๊ฑฐํ˜•์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ (์ตœ์ƒ์œ„ ํด๋ž˜์Šค Object์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ๊ณผ ๋™์ผ)
      • java.lang.Enum ์— ์ •์˜

        ๋ฆฌํ„ด ํƒ€์ž… ๋ฉ”์„œ๋“œ(๋งค๊ฐœ๋ณ€์ˆ˜) ์„ค๋ช…
        String name() ์—ด๊ฑฐ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฌธ์ž์—ด์„ ๋ฆฌํ„ดํ•˜๋ฉฐ, ๋ฆฌํ„ด๋˜๋Š” ๋ฌธ์ž์—ด์€ ์—ด๊ฑฐํƒ€์ž…์„ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•œ ์ƒ์ˆ˜ ์ด๋ฆ„๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
        int ordinal() ์—ด๊ฑฐ ๊ฐ์ฒด์˜ ์ˆœ๋ฒˆ(0๋ถ€ํ„ฐ ์‹œ์ž‘)์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
        int compareTo(๋น„๊ต๊ฐ’) ์ฃผ์–ด์ง„ ๋งค๊ฐœ ๊ฐ’๊ณผ ๋น„๊ตํ•ด์„œ ์ˆœ๋ฒˆ ์ฐจ์ด๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
        ์—ด๊ฑฐ ํƒ€์ž… valueOf(String name) ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์˜ ์—ด๊ฑฐ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
        ์—ด๊ฑฐ ๋ฐฐ์—ด values() ๋ชจ๋“  ์—ด๊ฑฐ ๊ฐ์ฒด๋“ค์„ ๋ฐฐ์—ด๋กœ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
  2. ์˜ˆ์ œ-1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
     enum Seasons {
         SPRING, //์ •์ˆ˜๊ฐ’ 0 ํ• ๋‹น
         SUMMER,  //์ •์ˆ˜๊ฐ’ 1 ํ• ๋‹น
         FALL, //์ •์ˆ˜๊ฐ’ 2 ํ• ๋‹น
         WINTER //์ •์ˆ˜๊ฐ’ 3 ํ• ๋‹น
     }
        
     public class EnumExample {
         public static void main(String[] args) {
             System.out.println(Seasons.SPRING); // SPRING
            
    
    • Seasons๋ผ๋Š” ์ด๋ฆ„์˜ ์—ด๊ฑฐํ˜•์€ SPRING, SUMMER, FALL, WINTER๋Š” ์ด ๋„ค ๊ฐœ์˜ ์—ด๊ฑฐ ๊ฐ์ฒด๋ฅผ ํฌํ•จ
  3. ์˜ˆ์ œ -2

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
     enum Level {
       LOW, // 0
       MEDIUM, // 1
       HIGH // 2
     }
        
     public class EnumTest {
         public static void main(String[] args) {
             Level level = Level.MEDIUM;
        
             Level[] allLevels = Level.values();
             for(Level x : allLevels) {
                 System.out.printf("%s=%d%n", x.name(), x.ordinal());
             }
        
             Level findLevel = Level.valueOf("LOW");
             System.out.println(findLevel);
             System.out.println(Level.LOW == Level.valueOf("LOW"));
        
             switch(level) {
                 case LOW:
                     System.out.println("๋‚ฎ์€ ๋ ˆ๋ฒจ");
                     break;
                 case MEDIUM:
                     System.out.println("์ค‘๊ฐ„ ๋ ˆ๋ฒจ");
                     break;
                 case HIGH:
                     System.out.println("๋†’์€ ๋ ˆ๋ฒจ");
                     break;
             }
         }
     }
        
     //์ถœ๋ ฅ๊ฐ’
     LOW=0
     MEDIUM=1
     HIGH=2
     LOW
     true
     ์ค‘๊ฐ„ ๋ ˆ๋ฒจ
    
    • ํ–ฅ์ƒ๋œ for๋ฌธ๊ณผ ์—ด๊ฑฐํ˜•์˜ ์ตœ์ƒ์œ„ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ํ™•์žฅ๋œ name()๊ณผ ordinal()์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ๊ฐ ์ด๋ฆ„๊ณผ ์ˆœ์„œ๋ฅผ ์ถœ๋ ฅ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜
    • valueOf() ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ง€์ •๋œ ์—ด๊ฑฐํ˜•์—์„œ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•˜๋Š” ์—ด๊ฑฐํ˜• ์ƒ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
    • ๋ฐ˜ํ™˜๋œ ์ƒ์ˆ˜๊ฐ€ ์˜๋„ํ–ˆ๋˜ ์ƒ์ˆ˜์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์œผ๋กœ ํ™•์ธ
    • switch๋ฌธ์—์„œ level์€ ์œ„์—์„œ Levle.MEDIUM์œผ๋กœ ์ดˆ๊ธฐํ™” ๋˜์—ˆ๊ณ  case MEDIUM์ด ์‹คํ–‰๋˜์–ด ์ค‘๊ฐ„๋ ˆ๋ฒจ์ด ์ถœ๋ ฅ๋จ, ๋งจ ์œ—์ค„์— ํ•ด๋‹นํ•˜๋Š” Level level = Level.MEDIUM; ์ด ๊ฐ€์žฅ ๋Šฆ๊ฒŒ ์ถœ๋ ฅ๋˜๋Š” ๊ฑด switch๋ฌธ์ด ํ”„๋กœ๊ทธ๋žจ ์ œ์ผ ๋งˆ์ง€๋ง‰์— ์žˆ๊ธฐ ๋•Œ๋ฌธ



COMMENT

์˜ค๋Š˜์€ ๋ญ”๊ฐ€ ์‹ค๋ฌด์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์€ ๊ฒƒ๋“ค์— ๋Œ€ํ•ด ๋ฐฐ์› ๋‹ค. ์ œ๋„ค๋ฆญ์€ ์ž๋ฐ”์˜ ๊ฝƒ์ด๋ผ๊ณ  ํ•œ๋‹ค๋˜๋ฐ ํƒ€์ž…์„ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์ด์ ์ด ํ™•์‹คํ•œ ๋“ฏ. ํƒ€์ž…์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ์ž„์˜์˜ ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ธ๋ฐ ๋ชจ๋“  ํƒ€์ž…์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ํƒ€์ž…์„ ์ œํ•œํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•˜๋‹ˆ ์œ ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด๋ด์•ผ๊ฒ ๋‹ค.

์ง€๊ธˆ ๋‹น์žฅ์€ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋‚ฏ์„ค์–ด์„œ ํ™œ์šฉํ•œ ์ฝ”๋“œ๋„ ๋งŽ์ด๋ณด๊ณ  ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๋•Œ ์‚ฌ์šฉํ•ด์„œ ์ž์ฃผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.








JAVA-Learn ์นดํ…Œ๊ณ ๋ฆฌ ๋‚ด ๋‹ค๋ฅธ ๊ธ€ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

Leave a comment