안녕하세요, 여러분! 오늘은 자바 중급 과정에서 꼭 알아야 할 '제네릭(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로 만들면 어떤 타입이든 저장할 수는 있지만:
- 타입 안정성이 떨어져요 - 원하지 않는 타입이 들어갈 수 있어요
- 타입 변환이 필요해요 - 꺼낼 때마다 원래 타입으로 형변환 해야 해요
Box box = new Box();
box.setItem("Hello"); // String 넣기
String str = (String) box.getItem(); // 형변환 필요!
box.setItem(123); // 다른 타입(Integer)도 넣을 수 있어요
// String str2 = (String) box.getItem(); // 런타임 오류 발생!
2️⃣ 제네릭의 장점
제네릭을 사용하면 이런 문제를 해결할 수 있어요:
- 컴파일 시점에 타입 체크 - 잘못된 타입이 들어가는 것을 방지해요
- 형변환 불필요 - 타입 캐스팅을 하지 않아도 돼요
- 타입 안정성 확보 - 의도한 타입만 사용할 수 있어요
📌 제네릭 클래스 만들어보기
제네릭 클래스는 <> 다이아몬드 기호를 사용해서 만들어요:
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<>();
public class Outer<T> {
private T outerField;
class Inner<S> {
private S innerField;
private T outerFieldRef; // 외부 클래스의 타입 매개변수도 사용 가능
}
}
📌 주의사항
- 기본 타입은 사용할 수 없어요 - GenericBox<int> (X), GenericBox<Integer> (O)
- 지정한 타입만 사용 가능해요 - 다른 타입을 넣으면 컴파일 오류가 발생해요
- static 멤버에는 클래스 타입 매개변수를 사용할 수 없어요
📌 마무리
제네릭을 사용하면 타입 안정성을 높이고 코드의 재사용성을 향상시킬 수 있어요. 처음에는 어렵게 느껴질 수 있지만, 익숙해지면 정말 유용한 기능이랍니다!
다음 포스팅에서는 제네릭 메서드와 와일드카드에 대해 알아볼 예정이니 기대해 주세요! 💕
여러분의 코딩 생활에 도움이 되셨으면 좋겠네요. 질문이나 의견이 있으시면 댓글로 남겨주세요! 😊
이 글은 김영한님의 '실전 자바 - 중급 2편' 강의를 바탕으로 작성되었습니다.
'📚 학습 기록 > Java 기초 & 중급' 카테고리의 다른 글
자바 제네릭 완전정복: 와일드카드의 모든 것 (김영한의 자바 중급) (0) | 2025.04.03 |
---|---|
자바 제네릭 마스터하기: 타입 매개변수 제한과 제네릭 메서드 완벽 가이드 (0) | 2025.04.02 |
자바로 만든 나만의 쇼핑몰 여행기 (3) - UI 계층 구현편 (5) | 2025.03.27 |
자바로 만든 나만의 쇼핑몰 여행기 (2) - 서비스 계층 구현편 (1) | 2025.03.26 |
자바로 만든 나만의 쇼핑몰 여행기 (1) - 기본 클래스 구현편 (3) | 2025.03.25 |