📚 학습 기록/Java 기초 & 중급

자바 제네릭(Generic) 완벽 정리: 개념부터 활용까지

zenjoydev 2025. 4. 1. 00:28

안녕하세요, 여러분! 오늘은 자바 중급 과정에서 꼭 알아야 할 '제네릭(Generic)'에 대해 함께 알아보려고 해요. 김영한님의 실전 자바 중급 강의를 듣고 정리한 내용인데, 최대한 쉽게 풀어서 설명해 볼게요! 😊

📌 제네릭이란 무엇일까요?

제네릭은 간단히 말해 저장할 타입을 사용(컴파일)시 정하는 객체예요. 즉, 클래스나 메서드를 정의할 때 타입을 확정짓지 않고, 사용할 때 타입을 지정할 수 있게 해주는 기능이랍니다.

예를 들어, ArrayList<String>처럼 사용할 때 String 타입을 지정해주는 거죠!

📌 왜 제네릭이 필요할까요?

여러분, 혹시 Object 클래스를 사용해서 모든 타입을 저장할 수 있다고 생각하셨나요? 맞아요, 할 수는 있어요. 하지만 여기에는 큰 문제가 있어요!

1️⃣ Object 클래스 사용의 문제점

public class Box {
    private Object item;
    
    public void setItem(Object item) {
        this.item = item;
    }
    
    public Object getItem() {
        return item;
    }
}

이렇게 Object로 만들면 어떤 타입이든 저장할 수는 있지만:

  1. 타입 안정성이 떨어져요 - 원하지 않는 타입이 들어갈 수 있어요
  2. 타입 변환이 필요해요 - 꺼낼 때마다 원래 타입으로 형변환 해야 해요
Box box = new Box();
box.setItem("Hello"); // String 넣기
String str = (String) box.getItem(); // 형변환 필요!

box.setItem(123); // 다른 타입(Integer)도 넣을 수 있어요
// String str2 = (String) box.getItem(); // 런타임 오류 발생!

2️⃣ 제네릭의 장점

제네릭을 사용하면 이런 문제를 해결할 수 있어요:

  1. 컴파일 시점에 타입 체크 - 잘못된 타입이 들어가는 것을 방지해요
  2. 형변환 불필요 - 타입 캐스팅을 하지 않아도 돼요
  3. 타입 안정성 확보 - 의도한 타입만 사용할 수 있어요

📌 제네릭 클래스 만들어보기

제네릭 클래스는 <> 다이아몬드 기호를 사용해서 만들어요:

public class GenericBox<T> {
    private T item;
    
    public void setItem(T item) {
        this.item = item;
    }
    
    public T getItem() {
        return item;
    }
}

📝 사용 방법

// String 타입으로 지정
GenericBox<String> stringBox = new GenericBox<>();
stringBox.setItem("안녕하세요");
String str = stringBox.getItem(); // 형변환 필요 없음!

// Integer 타입으로 지정
GenericBox<Integer> intBox = new GenericBox<>();
intBox.setItem(100);
Integer num = intBox.getItem();

// 컴파일 오류! String 타입만 허용됨
// stringBox.setItem(100);

📌 제네릭 관련 용어 정리

용어의미예시

제네릭 타입 제네릭이 적용된 클래스 GenericBox<T>
타입 매개변수 제네릭에 사용할 매개변수 GenericBox<T>에서 T
타입 인자 실제로 사용할 타입 GenericBox<Integer>에서 Integer

📌 제네릭 명명 관례

제네릭 타입 매개변수는 일반적으로 대문자 한 글자를 사용하며, 의미에 맞는 단어의 첫 글자를 사용해요:

  • T: Type (일반적인 타입)
  • E: Element (요소, 주로 컬렉션에서 사용)
  • K: Key (키, 맵에서 사용)
  • V: Value (값, 맵에서 사용)
  • N: Number (숫자 관련)

📌 타입 추론

Java 7부터는 다이아몬드 연산자(<>)를 사용해 타입 추론이 가능해졌어요:

// Java 7 이전
GenericBox<String> box1 = new GenericBox<String>();

// Java 7 이후 (타입 추론)
GenericBox<String> box2 = new GenericBox<>(); // 뒤의 타입 생략 가능!

📌 제네릭의 기타 기능

1️⃣ 여러 타입 매개변수 사용하기

public class Pair<K, V> {
    private K key;
    private V value;
    
    // 생성자와 getter/setter
}

// 사용 예
Pair<String, Integer> pair = new Pair<>();
2️⃣ 내부 클래스에서도 사용 가능
public class Outer<T> {
    private T outerField;
    
    class Inner<S> {
        private S innerField;
        private T outerFieldRef; // 외부 클래스의 타입 매개변수도 사용 가능
    }
}

📌 주의사항

  1. 기본 타입은 사용할 수 없어요 - GenericBox<int> (X), GenericBox<Integer> (O)
  2. 지정한 타입만 사용 가능해요 - 다른 타입을 넣으면 컴파일 오류가 발생해요
  3. static 멤버에는 클래스 타입 매개변수를 사용할 수 없어요

📌 마무리

제네릭을 사용하면 타입 안정성을 높이고 코드의 재사용성을 향상시킬 수 있어요. 처음에는 어렵게 느껴질 수 있지만, 익숙해지면 정말 유용한 기능이랍니다!

다음 포스팅에서는 제네릭 메서드와 와일드카드에 대해 알아볼 예정이니 기대해 주세요! 💕

여러분의 코딩 생활에 도움이 되셨으면 좋겠네요. 질문이나 의견이 있으시면 댓글로 남겨주세요! 😊


이 글은 김영한님의 '실전 자바 - 중급 2편' 강의를 바탕으로 작성되었습니다.