제네릭(Generic)이란?
: Generic은 Java에서 클래스나 메서드에서 사용할 데이터 타입을 동적으로 정의할 수 있게 해주는 기능이다.
: 타입 안정성과 코드 재사용성을 높이기 위해 사용
: 래퍼 클래스(Wrapper Class)를 사용해야 하며, 기본 데이터 타입(Primitive Type)은 직접 사용할 수 없다.
특징 :
1. 타입 안정성 제공
: 컴파일 단계에서 타입 체크를 수행하여 잘못된 타입의 데이터가 사용되지 않도록 방지
: 런타임 오류 대신 컴파일 오류를 제공하므로 디버깅이 용이하다.
2. 코드 재사용성 증가
: 다양한 데이터 타입에 대해 하나의 클래스나 메서드로 작업할 수 있다.
3. 가독성 향상
: 명시적으로 타입을 선언하므로 코드 이해가 더 쉬워진다.
단일 데이터 타입 예제
public class MainClass {
public static void main(String[] args) {
Box box = new Box(123);
System.out.println(box.getTemp());
}
}
class Box<T>{
T temp;
public Box(T temp) {
this.temp = temp;
}
public T getTemp() {
return temp;
}
public void setTemp(T temp) {
this.temp = temp;
}
}
: 원래는 "Box<Integer> box = new Box<Integer>(123);" 이렇게 선언해줘야 한다.
" 근데 코드에서는 "Box box = new Box(123);" 이렇게 선언되어 있다.
: 이렇게 되면 원시 타입(Raw Type)으로 간주하고 제네릭의 타입 매개변수를 "Object"로 취급한다.
: 그래서 에러가 발생하지 않고 출력이 된다.(하지만 타입 안정성을 보장할 수 없음)
Box<Integer> iBox = new Box<Integer>(123); // Integer 타입으로 동작
System.out.println(iBox.getTemp());
Box<String> sBox = new Box<String>("ABC"); // String 타입으로 동작
System.out.println(sBox.getTemp() + "EDF");
: 이렇게 Integer와 String를 선언해주고 사용하면 된다.
: "Box<String> sBox = new Box<String>("ABC")" -> "Box<String> sBox = new Box<>("ABC")"
: 저렇게 변경하고 사용해도 상관은 없다.
다중 데이터 타입 예제
public class MainClass {
public static void main(String[] args) {
BoxMap<Integer, String> bMap = new BoxMap(1122, "멍멍");
System.out.println(bMap.toString());
BoxMap<Double, String> dMap = new BoxMap(123.45, "야옹");
System.out.println(dMap.toString());
}
}
class BoxMap<Key, Value>{
Key key;
Value valye;
public BoxMap(Key key, Value valye) {
this.key = key;
this.valye = valye;
}
public Key getKey() {
return key;
}
public void setKey(Key key) {
this.key = key;
}
public Value getValye() {
return valye;
}
public void setValye(Value valye) {
this.valye = valye;
}
@Override
public String toString() {
return "BoxMap{" +
"key=" + key +
", valye=" + valye +
'}';
}
}
: 선언된 멤버 변수는 Integer, String, double 등등 래퍼 클래스 중 다 사용 가능
: 기본 타입은 사용 불가(int, char, double 등등)
제네릭끼리 연산은 불가능
class Calculator<One, Two, Three>{
One number1;
Two number2;
Three result;
public Calculator(One number1, Two number2) {
this.number1 = number1;
this.number2 = number2;
}
public void Process(){
result = number1 + number2;
} // 자바에선 Generic 끼리 연산을 막아놨다.
}
: 자바에서 제네릭 간 연산을 막아두었다.
: 이를 해결하려면 제한된 타입(bound type)으로 제네릭을 정의하거나 별도의 연산 메서드를 작성해야 한다.
'Java' 카테고리의 다른 글
Java) 구체 클래스 의존 vs 인터페이스 기반 설계 : 다형성과 확장성의 차이 (0) | 2025.01.11 |
---|---|
Java) List 활용: ArrayList 기본 CRUD 예제 (0) | 2025.01.11 |
Java) 변수의 종류와 접근 범위 (0) | 2025.01.09 |
Java) static 키워드의 이해와 활용 예제 (0) | 2025.01.09 |
Java) final 키워드: 변수, 메서드, 클래스 제약 이해하기 (0) | 2025.01.09 |