Contents

Generic에 λŒ€ν•΄μ„œ(with. Java)

   Jan 2, 2024     3 min read

β€œGeneric에 λŒ€ν•΄μ„œβ€ λ¬Έμ œμ— λŒ€ν•˜μ—¬ μ•Œμ•„λ³Έ κΈ€μž…λ‹ˆλ‹€.

λ‹€λ₯Έ λΆ„λ“€μ˜ μž‘μ—…λ¬Όμ„ κ΅¬κ²½ν•˜λ˜ 쀑 νƒ€μž…μ— λŒ€ν•΄μ„œ 보게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

학뢀생 μ‹œμ ˆ 정적언어(Java, C λ“±)을 ν•™μŠ΅ν•˜λ©° 봀던 기얡이 μžˆμŠ΅λ‹ˆλ‹€.

μ‹œκ°„μ΄ 흘러 λ‹€μ‹œ ν•œ 번 μ œλŒ€λ‘œ μ•Œμ•„λ³΄μ•„ κ³΅μœ ν•˜κ³ μž ν•©λ‹ˆλ‹€.

κ°œλ…

μ œλ„€λ¦­(Generic)은 μžλ°” ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ μ€‘μš”ν•œ νŠΉμ§• 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

μ΄λŠ” ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  λ•Œ νƒ€μž…μ„ νŒŒλΌλ―Έν„°ν™”ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λ©΄ ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•  λ•Œ νƒ€μž…μ„ μ§€μ •ν•˜μ§€ μ•Šκ³ , μ‚¬μš©ν•  λ•Œ ꡬ체적인 νƒ€μž…μ„ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.

이λ₯Ό 톡해 μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±κ³Ό νƒ€μž… μ•ˆμ •μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.

μ œλ„€λ¦­μ˜ κΈ°λ³Έ ꡬ쑰

μžλ°”μ—μ„œ μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λ €λ©΄ 클래슀, μΈν„°νŽ˜μ΄μŠ€, λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  λ•Œ νƒ€μž… λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

νƒ€μž… λ§€κ°œλ³€μˆ˜λŠ” 데이터 νƒ€μž…μ˜ μΌμ’…μœΌλ‘œ, μ‹€μ œ μ‚¬μš©λ  λ•Œ ꡬ체적인 νƒ€μž…μœΌλ‘œ λŒ€μ²΄λ©λ‹ˆλ‹€.

  1. ν΄λž˜μŠ€μ—μ„œ μ œλ„€λ¦­ μ‚¬μš©
public class Box<T> {
    private T data;

    public void setData(T data) {
        this.data = data;
    }

    public T getData() {
        return data;
    }
}

μœ„μ˜ μ˜ˆμ œμ—μ„œ Box ν΄λž˜μŠ€λŠ” μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό λ‹΄λŠ” μƒμžλ₯Ό ν‘œν˜„ν•©λ‹ˆλ‹€.

TλŠ” νƒ€μž… λ§€κ°œλ³€μˆ˜λ‘œ, 클래슀λ₯Ό μ‹€μ œλ‘œ μ‚¬μš©ν•  λ•Œ μ–΄λ–€ νƒ€μž…μ˜ 데이터λ₯Ό λ‹€λ£° 것인지λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

  1. λ©”μ„œλ“œμ—μ„œ μ œλ„€λ¦­ μ‚¬μš©
public <T> T findFirst(List<T> list) {
    if (list != null && !list.isEmpty()) {
        return list.get(0);
    }
    return null;
}

μœ„μ˜ μ˜ˆμ œμ—μ„œ findFirst λ©”μ„œλ“œλŠ” μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜μ—¬ 리슀트의 첫 번째 μš”μ†Œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

λ©”μ„œλ“œ μ„ μ–Έμ—μ„œ λŠ” ν•΄λ‹Ή λ©”μ„œλ“œκ°€ μ œλ„€λ¦­ νƒ€μž…μ„ μ‚¬μš©ν•œλ‹€λŠ” 것을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

μ œλ„€λ¦­μ˜ μž₯점

νƒ€μž… μ•ˆμ •μ„±(Type Safety): μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λ©΄ μ»΄νŒŒμΌλŸ¬κ°€ μ½”λ“œμ—μ„œ νƒ€μž… κ΄€λ ¨ 였λ₯˜λ₯Ό μž‘μ•„λ‚΄κΈ° μ‰¬μ›Œμ§‘λ‹ˆλ‹€. λŸ°νƒ€μž„ μ‹œμ μ— λ°œμƒν•  수 μžˆλŠ” νƒ€μž… λ³€ν™˜ 였λ₯˜λ₯Ό 컴파일 μ‹œμ μ— μž‘μ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ½”λ“œ μž¬μ‚¬μš©μ„±: μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λ©΄ ν•˜λ‚˜μ˜ ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œλ₯Ό μ—¬λŸ¬ μ’…λ₯˜μ˜ νƒ€μž…μ— λŒ€ν•΄ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ΄ λ†’μ•„μ§‘λ‹ˆλ‹€.

μ•Œκ³ λ¦¬μ¦˜μ˜ μΌλ°˜ν™”: μ œλ„€λ¦­μ„ 톡해 μ•Œκ³ λ¦¬μ¦˜μ„ 더 일반적으둜 μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. νŠΉμ • νƒ€μž…μ— μ˜μ‘΄ν•˜μ§€ μ•Šκ³  λ‹€μ–‘ν•œ νƒ€μž…μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ œλ„€λ¦­μ˜ 예제

public class Main {
    public static void main(String[] args) {
        // Box 클래슀λ₯Ό ν™œμš©ν•œ μ œλ„€λ¦­ 예제
        Box<String> stringBox = new Box<>();
        stringBox.setData("Hello, Generics!");
        String data = stringBox.getData();
        System.out.println(data);

        // μ œλ„€λ¦­ λ©”μ„œλ“œλ₯Ό ν™œμš©ν•œ 예제
        List<Integer> integerList = List.of(1, 2, 3, 4, 5);
        Integer firstElement = findFirst(integerList);
        System.out.println("First element: " + firstElement);
    }

    public static <T> T findFirst(List<T> list) {
        if (list != null && !list.isEmpty()) {
            return list.get(0);
        }
        return null;
    }
}

μœ„μ˜ μ˜ˆμ œμ—μ„œ Box 클래슀λ₯Ό 톡해 λ¬Έμžμ—΄ 데이터λ₯Ό 담은 μƒμžλ₯Ό λ§Œλ“€κ³ , findFirst λ©”μ„œλ“œλ₯Ό 톡해 μ •μˆ˜ 리슀트의 첫 번째 μš”μ†Œλ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ 예제λ₯Ό 톡해 μ œλ„€λ¦­μ΄ μ–΄λ–»κ²Œ μ‚¬μš©λ˜λŠ”μ§€ 감을 μž‘μ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

κ²°λ‘ 

μ œλ„€λ¦­μ€ μžλ°”μ—μ„œ κ°•λ ₯ν•œ κΈ°λŠ₯ 쀑 ν•˜λ‚˜λ‘œ, μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±κ³Ό νƒ€μž… μ•ˆμ •μ„±μ„ λ†’μ—¬μ€λ‹ˆλ‹€.

클래슀, μΈν„°νŽ˜μ΄μŠ€, λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  λ•Œ νƒ€μž…μ„ νŒŒλΌλ―Έν„°ν™”ν•˜μ—¬ λ‹€μ–‘ν•œ νƒ€μž…μ— λŒ€ν•΄ μœ μ—°ν•˜κ²Œ λŒ€μ²˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ œλ„€λ¦­μ„ ν™œμš©ν•˜λ©΄ μ»΄νŒŒμΌλŸ¬κ°€ 더 λ§Žμ€ 였λ₯˜λ₯Ό 사전에 κ²€μΆœν•  수 있으며, μ½”λ“œμ˜ μΌλ°˜μ„±κ³Ό ν™•μž₯성을 μ¦κ°€μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

μžλ°” ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ€ μ œλ„€λ¦­μ„ 적절히 ν™œμš©ν•˜μ—¬ 더 κ°„κ²°ν•˜κ³  μ•ˆμ •μ μΈ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.