제네릭과 Wrapper 클래스
제네릭 개념
----------------------------------------------------------------------------------------
▶클래스나 메소드를 형판에서 찍어내듯이 생산할 수 있도록 '일반화된 형판'을 만드는 기법
▶특정 타입만 다루지 않고, 여러 종류의 타입으로 쓰일 수 있도록 클래스나 메소드를 '일반화'시키는 기법
쉬운말로, 자료형을 정하지 않는 기법. (외부에서 지정) -> 외부에서 어떤 타입이 들어올지 모를 때 유용.
▶여러 종류를 받는 클래스,인스터페이스 이름옆에 <타입 매개변수>를 써준다.
(타입을 파라미터로 가지는 클래스와 인터페이스가 된다.)
1. 제네릭 클래스
class GClass<E> {
private E data;
public E getData() { return data; }
public void setData(E data) { this.data = data; }
}
이 제네릭 클래스를 활용하여 객체를 생성하고 출력해보자.
puvlic class Gnr {
public static void main(String[] args) {
//E가 String인 경우
GClass<String> s = new GClass<String>();
s.setData("hello");
System.out.println(s.getData()); //"hello" 출력.
//E가 Integer인 경우
GClass<Integer> n = new GClass<Integer>();
n.setData(5);
System.out.println(n.getData()); //숫자 5 출력.
}
}
▶대표적인 대문자.
<E> Element
<K> Key
<N> Number
<T> Type
<V> Value
▶<> 안에 들어갈 수 있는 것은 Wrapper 클래스. (즉 객체화된 데이터가 들어가야 한다.) ex) Integer
Wrapper 클래스
JAVA의 기본 타입에는 byte, short, int, long, float, double, char, boolean이 있다.
모두가 알듯이, 이 기본 타입들에 데이터를 저장하는데, 이 데이터를 객체로 만들어서 써야할 때가 있다.
예를 들어, 메소드의 매개변수로 객체 타입을 요구한다면, 기본 타입의 데이터를 그대로 사용할 수 없으므로, 객체로 변환한 후 작업을 수행해야 한다.
이때 기본 타입을 객체로 다루기 위해 사용하는 클래스가 Wrapper 클래스.
** 래퍼 클래스로 감싸고 있는 기본 타입값은 외부에서 변경할 수 없다.
값을 변경하려면 그 기본타입값의 새로운 포장객체를 또 만들어야 한다.
래퍼클래스의 이름은 약간의 변화만 있다. (Integer, Character 빼곤 앞글자를 대문자로 바꿔주면 끝.)
기본 타입 | Wrapper 클래스 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
그래서 기본타입의 값을 객체로 포장. 해주는 과정을 Boxing
포장된 객체에서 기본타입의 값을 얻어내는 과정을 Unboxing 이라고 한다.
즉, 기본 타입의 값을 내부에 포장하여 객체를 생성한다. 그래서 포장(박싱) 객체라고도 한다.
이 객체로 생성하는데에 Wrapper클래스가 쓰이는 것이다.
박싱/언박싱 방법을 살펴보자면,
Boxing / Unboxing
public class Boxing_Ex {
public static void main(String[] args) {
//Boxing
Integer a = new Integer(10);
//a+a=10; (x), 객체는 변경 불가
//Integer a = new Integer(); 불가능. 데이터없이 Boxing 불가능.
String b = "20";
Integer bx = new Integer(b); //가능. 하지만 "10a"는 불가능.
System.out.println(bx);
//Unboxing, 기본타입이 int일때는 intValue() 메서드를 이용한다.
int c = a.intValue(); //a 안에 존재하는 int값을 내보낸다.
c=c+10; //변경 가능. 객체가 아니니까.
System.out.println(c);
}
}
하지만, 저렇게 많은 자료형들마다 boxing, unboxing 해주는 것이 불편하다.
char타입은
Character ch = new Character('B');
char c = ch.charValue();
이렇게 다 다른 형식이 있다. intValue(), charValue(),
그래서 자동 boxing, unboxing 방법이 있다.
자동 Boxing, 자동 Unboxing
요즘에는 자동 boxing, unboxing이 되기 때문에 이것이 이루어지는지 모르고 사용할 수 있는데, 필자는 boxing, unboxing 과정이 발생한다는 것을 인지하고 있어야 한다고 생각한다.
public class Boxing_Ex {
public static void main(String[] args) {
//Auto Boxing
Integer a = 10; //기본 자료형으로 변수 선언하는 것처럼 boxing하여 객체를 생성할 수 있다.
//Auto Unboxing
int b = a; //기본 타입에 객체를 넣어주면 자동 unboxing.