[Java] μ œλ„€λ¦­(Generic) 문법 정리: 클래슀, λ©”μ„œλ“œ, μ œν•œκΉŒμ§€

2025. 5. 23. 14:08Β·β˜•Java/πŸ“Java Programming

βœ… 1. μ œλ„€λ¦­μ΄λž€?

public class Box<T> {
    private T item;

    public void set(T item) {
        this.item = item;
    }

    public T get() {
        return item;
    }
}

public class Main {
    Box<String> box = new Box<>();
    box.set("String"); // <String> μ œλ„€λ¦­ 이기 λ•Œλ¬Έμ— νƒ€μž…μ€ String
}
  • 클래슀 λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•  데이터 νƒ€μž…μ„ μ™ΈλΆ€μ—μ„œ μ§€μ •ν•˜λŠ” 기법을 μ˜λ―Έν•œλ‹€.
  • 즉, 클래슀, μΈν„°νŽ˜μ΄μŠ€, λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•  λ•Œ νƒ€μž… λ§€κ°œλ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³  μžλ£Œν˜•μ˜ μ œν•œμ„ λ‘ μœΌλ‘œμ¨ νƒ€μž… μ•ˆμ „μ„±μ„ κ°€μ§„λ‹€.
  • μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λ©΄, μžλ°” ν”„λ‘œκ·Έλž¨μ˜ μž¬μ‚¬μš©μ„±μ„ 높이고 였λ₯˜λ₯Ό 쀄일 수 있게 λœλ‹€.
  • λ‹€μ–‘ν•œ ν˜•νƒœλ₯Ό 받을 수 μžˆλŠ” 클래슀λ₯Ό λ§Œλ“€ λ•Œ μ‚¬μš©μ„ ν•˜λ©°, ν˜•λ³€ν™˜μ„ μ‚¬μš©ν•˜μ§€ μ•Šμ„ 수 μžˆλ‹€. ( 보톡은 Object인데 μ‚¬μš©x )

(1) μ°Έκ³  사항

  • μ œλ„€λ¦­μ„ μ‚¬μš©ν•œ 클래슀λ₯Ό 생성 ν•  λ•ŒλŠ” νƒ€μž… νŒŒλΌλ―Έν„°λ₯Ό λͺ…μ‹œν•΄λ„λ˜κ³  μ•ˆν•΄λ„ λœλ‹€. ν•˜μ§€λ§Œ, ν•˜λŠ”κ²Œ μΌλ°˜μ μž„.
  • νƒ€μž… νŒŒλΌλ―Έν„°λŠ” κΈ°λ³Έμžλ£Œν˜•μ€ μ‚¬μš©μ΄ λΆˆκ°€λŠ₯ν•˜λ©°, μ°Έμ‘°μžλ£Œν˜•λ§Œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.
  • νƒ€μž… νŒŒλΌλ―Έν„°λŠ” ν•„λ“œμ˜ μžλ£Œν˜•, λ©”μ†Œλ“œ λ°˜ν™˜ν˜•, 인자의 μžλ£Œν˜•μœΌλ‘œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.
  • μžλ£Œν˜• λ§€κ°œλ³€μˆ˜ 즉, νƒ€μž… λ§€κ°œλ³€μˆ˜λ₯Ό κ°€μ§€λŠ” ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œλ„€λ¦­ νƒ€μž…μ΄λΌκ³  ν•œλ‹€.
  • νƒ€μž… νŒŒλΌλ―Έν„°λŠ” ν•˜λ‚˜κ°€ μ•„λ‹Œ μ—¬λŸ¬κ°œλ„ κ°€λŠ₯ν•˜λ‹€. <T1, T2 ...>
  • νƒ€μž… νŒŒλΌλ―Έν„°μ˜ 이름은 κ΄€λ‘€μ μœΌλ‘œ E, K, V, N, T ... 을 μ‚¬μš© ν•œλ‹€.

βœ… 2. μ œλ„€λ¦­ νƒ€μž… 객체 생성 방법

public class Main {
    Data<String> data = new Data<>();          // βœ… νƒ€μž… λͺ…μ‹œ + 닀이아λͺ¬λ“œ μ—°μ‚°μž μ‚¬μš©
    Data data = new Data();                   // βœ… raw type μ‚¬μš© (λΉ„μΆ”μ²œ)
    Data<String> data = new Data<String>();   // βœ… νƒ€μž… 전체 λͺ…μ‹œ
}

 

(1) Data<String> data = new Data<>(); - ꢌμž₯ λ˜λŠ” 방식

  • μ œλ„€λ¦­ νƒ€μž…μ„ λͺ…μ‹œν•˜κ³ , μš°μΈ‘μ€ 닀이아λͺ¬λ“œ μ—°μ‚°μž<>λ₯Ό μ‚¬μš©ν•΄ νƒ€μž… 좔둠을 λ§‘κΈ°λŠ” 방식이닀.

(2) Data data = new Data(); - λΉ„κΆŒμž₯ 방식

  • μ œλ„€λ¦­ νƒ€μž…μ„ λͺ…μ‹œν•˜μ§€ μ•Šμ•„μ„œ μ»΄νŒŒμΌλŸ¬κ°€ νƒ€μž…μ„ μΆ”λ‘ ν•˜μ§€ λͺ»ν•œλ‹€. 즉, Object둜 κ°„μ£Όλ˜μ–΄μ„œ λ“€μ–΄κ°€κ²Œ λœλ‹€.
  • μ‰½κ²Œλ§ν•΄, Data<Object> data = new Data<>(); ν˜•μ‹μœΌλ‘œ λ“€μ–΄κ°„λ‹€λŠ” μ˜λ―Έμ΄λ‹€.

(3) Data<String> data = new Data<String>();

  • μ–‘μͺ½ λͺ¨λ‘ νƒ€μž…μ„ λͺ…μ‹œν•œ 전톡적인 μ œλ„€λ¦­ μ‚¬μš© λ°©μ‹μœΌλ‘œ, μ½”λ“œκ°€ κΈΈκ³  쀑볡이 λœλ‹€λŠ” 단점이 μžˆλ‹€.

βœ… 3. μ œλ„€λ¦­ μΈν„°νŽ˜μ΄μŠ€

// μ œλ„€λ¦­ μΈν„°νŽ˜μ΄μŠ€ μ •μ˜
interface Printer<T> {
    void print(T item);
}

// μ œλ„€λ¦­ μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„ - String νƒ€μž… μ „μš©
class StringPrinter implements Printer<String> {
    public void print(String item) {
        System.out.println("λ¬Έμžμ—΄ 좜λ ₯: " + item);
    }
}

// μ œλ„€λ¦­ μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„ - Integer νƒ€μž… μ „μš©
class IntegerPrinter<T> implements Printer<Integer> {
    public void print(Integer item) {
        System.out.println("μ •μˆ˜ 좜λ ₯: " + item);
    }
}

// 메인 클래슀
public class Main {
    public static void main(String[] args) {
        Printer<String> stringPrinter = new StringPrinter();
        stringPrinter.print("μ•ˆλ…•ν•˜μ„Έμš”");

        Printer<Integer> intPrinter = new IntegerPrinter<>();
        intPrinter.print(123);
    }
}
  • μ œλ„€λ¦­ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“€κ²Œλ˜κ³ , κ΅¬ν˜„ ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€ 클래슀 μ œλ„€λ¦­ νƒ€μž…μ„ λͺ…μ‹œν•΄μ€˜μ•Ό ν•œλ‹€. λͺ…μ‹œλ₯Ό ν•˜κ²Œ 되면, κ΅¬ν˜„ν•˜λŠ” μΆ”μƒλ©”μ„œλ“œμ˜ νƒ€μž…μ€ λͺ…μ‹œν•œ νƒ€μž…μœΌλ‘œ μ •μ˜λ₯Ό ν•΄μ•Ό λœλ‹€. μ•ˆκ·ΈλŸ¬λ©΄ 였λ₯˜κ°€ λ‚œλ‹€.

βœ… 4. μ œλ„€λ¦­ λ©”μ†Œλ“œ

(1) μΈμŠ€ν„΄μŠ€ μ œλ„€λ¦­ λ©”μ†Œλ“œ

public class Printer {
    public <T> void print(T data) {
        System.out.println(data);
    }
}
// νƒ€μž… μΆ”λ‘  λ©”μ„œλ“œ 호좜
public class Main {
    public static void main(String[] args) {
        Printer p = new Printer();
        p.print("Hello"); // λ¬Έμžμ—΄
        p.print(1); // μ •μˆ˜
    }
}
// νƒ€μž…λ§€κ°œλ³€μˆ˜ λͺ…μ‹œ λ©”μ„œλ“œ 호좜
public class Main {
    public static void main(String[] args) {
        Printer p = new Printer();
        p.<String>print("Hello");
        p.<String>print(1); // 였λ₯˜ : λ§€κ°œλ³€μˆ˜ κ°’ String νƒ€μž…μ΄ μ•„λ‹˜.
    }
}
  • λ§€κ°œλ³€μˆ˜λ‚˜ λ°˜ν™˜κ°’μ˜ νƒ€μž…μ„ λ©”μ„œλ“œ 호좜 μ‹œμ μ— μ§€μ •ν•  수 μžˆλ„λ‘ λ§Œλ“  λ©”μ„œλ“œλ₯Ό μ˜λ―Έν•œλ‹€.
  • μ‰½κ²Œλ§ν•΄, 호좜 λ‹Ήν•˜λŠ” μͺ½ λ©”μ„œλ“œμ˜ <> μ œλ„€λ¦­μ„ λΆ€μ—¬ν•¨μœΌλ‘œμ¨, λ§€κ°œλ³€μˆ˜ 및 λ°˜ν™˜κ°’μ˜ νƒ€μž…μ„ λ§žμΆ°μ£ΌλŠ” 방식이닀.
  • ν•˜λ‚˜μ˜ λ©”μ†Œλ“œ μ •μ˜λ‘œ μ—¬λŸ¬ μœ ν˜•μ˜ 데이터λ₯Ό μ²˜λ¦¬ν•  λ•Œ μœ μš©ν•˜λ‹€.
  • λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ νƒ€μž…λ§€κ°œλ³€μˆ˜λ₯Ό μƒλž΅ν•΄λ„ λ§€κ°œλ³€μˆ˜ νƒ€μž…μœΌλ‘œ μΆ”λ‘ ν•΄μ„œ λ„£μ–΄μ€€λ‹€.
  • ν•˜μ§€λ§Œ, νƒ€μž…λ§€κ°œλ³€μˆ˜λ₯Ό 넣을 μˆ˜λ„ μžˆλŠ” ν˜•νƒœμ΄λ‹€.

(1) 클래슀 μ œλ„€λ¦­ λ©”μ†Œλ“œ ( statck μ œλ„€λ¦­ λ©”μ†Œλ“œ)

public class Printer {
    public static <T> void print(T data) {
        System.out.println(data);
    }
}
// νƒ€μž… μΆ”λ‘  λ©”μ„œλ“œ 호좜
public class Main {
    public static void main(String[] args) {
        Printer.print("Hello"); // λ¬Έμžμ—΄
        Printer.print(1); // μ •μˆ˜
    }
}
// νƒ€μž…λ§€κ°œλ³€μˆ˜ λͺ…μ‹œ λ©”μ„œλ“œ 호좜
public class Main {
    public static void main(String[] args) {
        Printer.<String>print("Hello");
        Printer.<String>print(1); // 였λ₯˜ : λ§€κ°œλ³€μˆ˜ κ°’ String νƒ€μž…μ΄ μ•„λ‹˜.
    }
}
  • μœ„μ˜ μΈμŠ€ν„΄μŠ€ μ œλ„€λ¦­ λ©”μ„œλ“œμ™€ λ™μΌν•˜κ²Œ νƒ€μž…λ§€κ°œλ³€μˆ˜λ₯Ό λ„£κ±°λ‚˜ μƒλž΅ν•  수 μžˆλ‹€.
  • 일반 static λ©”μ„œλ“œμ—μ„œ μ œλ„€λ¦­μ΄ λ“€μ–΄κ°„ ν˜•νƒœμ΄λ‹€.

βœ… 5. μ œλ„€λ¦­ νƒ€μž… μ œν•œ

public class Data<T extends Number> {
    public void print(T data) {
        System.out.println(data); // T μžλ£Œν˜•μ— λ§žλŠ” λ³€μˆ˜κ°’ 좜λ ₯
    }
}
public class Main {
    public static void main(String[] args) {
        Data<Integer> data = new Data<>();
        data.print(123);
        Data<String> data = new Data<>(); // 컴파일 μ—λŸ¬: String은 Number의 ν•˜μœ„ ν΄λž˜μŠ€κ°€ μ•„λ‹˜.
    }
}
  • μ œλ„€λ¦­ 클래슀, μ œλ„€λ¦­ μΈν„°νŽ˜μ΄μŠ€, μ œλ„€λ¦­ λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•  λ•Œ μ μš©κ°€λŠ₯ν•œ μžλ£Œν˜•μ— μ œν•œμ„ λ‘λŠ” 것을 μ˜λ―Έν•œλ‹€.
  • μ œλ„€λ¦­ λ§€κ°œλ³€μˆ˜λ‘œ μžλ£Œν˜• νƒ€μž…μ˜ μ œν•œμ„ λ‘λŠ” 것이며, μ„œλΈŒ 클래슀인 κ²½μš°μ—λ§Œ κ°€λŠ₯ν•˜κ²Œ μ œν•œμ„ λ‘˜ 수 μžˆλ‹€.

'β˜•Java > πŸ“Java Programming' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Java] java.lang νŒ¨ν‚€μ§€ 정리: Object, String, Math 클래슀 총정리  (0) 2025.05.26
[Java] μžλ°” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ™€ λžŒλ‹€μ‹(Lambda Expression) μ‰½κ²Œ 배우기  (1) 2025.05.23
[Java] 읡λͺ… 클래슀(Anonymous Class)  (1) 2025.05.22
[Java] λ‹€ν˜•μ„±(polymorphism)  (1) 2025.05.22
[Java] 좔상화 - μΆ”μƒν΄λž˜μŠ€, μΆ”μƒλ©”μ„œλ“œ, μΈν„°νŽ˜μ΄μŠ€  (0) 2025.05.20
'β˜•Java/πŸ“Java Programming' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [Java] java.lang νŒ¨ν‚€μ§€ 정리: Object, String, Math 클래슀 총정리
  • [Java] μžλ°” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ™€ λžŒλ‹€μ‹(Lambda Expression) μ‰½κ²Œ 배우기
  • [Java] 읡λͺ… 클래슀(Anonymous Class)
  • [Java] λ‹€ν˜•μ„±(polymorphism)
junbin2
junbin2
java.lang.NullPointerException
  • junbin2
    bin's Development Diary
    junbin2
  • 전체
    였늘
    μ–΄μ œ
    • 전체보기 (151)
      • πŸŽ“λ°©μ†‘ν†΅μ‹ λŒ€ν•™κ΅ (26)
        • πŸ–₯️컴퓨터과학과 (1)
        • πŸŒμœ λΉ„μΏΌν„°μŠ€ μ»΄ν“¨νŒ… (11)
        • βš™οΈμ»΄ν“¨ν„°μ˜ 이해 (11)
        • πŸ›οΈμ„Έκ³„μ˜μ •μΉ˜μ™€κ²½μ œ (3)
      • πŸ“šComputer Science (0)
      • πŸ› οΈBackend (2)
      • β˜•Java (20)
        • πŸ“Java Programming (19)
        • 🧩Java Design Pattern (1)
      • 🌳Spring (9)
        • 🌱Spring Framework (6)
        • 🌱Spring Security (1)
      • ⚑Python (13)
      • πŸ›’οΈDatabase (0)
      • 🌿GitHub (1)
      • 🌐 Network (7)
        • πŸ“œHTTP (7)
      • πŸš€DevOps (1)
      • Algorithm Problem Solving (2)
      • Data Structure (1)
      • JavaScript (1)
      • β›ΊμŠ€νŒŒλ₯΄νƒ€μ½”λ”©ν΄λŸ½ (65)
      • μž‘λ‹΄ (1)
      • 정리가 ν•„μš”ν•œ κΈ€ (2)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

    • GitHub
  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    μŠ€ν”„λ§
    Java
    Spring Framework
    λ°©μ†‘ν†΅μ‹ λŒ€ν•™κ΅
    λ°©μ†‘λŒ€
    μ»΄ν“¨ν„°μ˜ 이해
    파이썬
    μœ λΉ„μΏΌν„°μŠ€ μ»΄ν“¨νŒ…κ°œλ‘ 
    클래슀
    spring
    ν΄λΌμš°λ“œ
    λ‹€ν˜•μ„±
    컴파일러
    Python
    μœ λΉ„μΏΌν„°μŠ€ μ»΄ν“¨νŒ…
    λ°©ν†΅λŒ€
    세계화
    μžλ°”
    μœ λΉ„μΏΌν„°μŠ€
    μž…μΆœλ ₯
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.1
junbin2
[Java] μ œλ„€λ¦­(Generic) 문법 정리: 클래슀, λ©”μ„œλ“œ, μ œν•œκΉŒμ§€
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”