기본형 타입의 값들을 객체로 사용 가능하게 도와주는 클래스
기본형 타입의 클래스 타입
int --> Integer
char --> Character
Wrapper클래스명 객체명 = new Wrapper생성자(값); //박싱
Wrapper클래스명 객체명 = (Wrapper클래스명)값;
기본자료형 변수명 = Wrapper객체.~~~Value(); //언박싱
오토박싱
객체명 = 값;
오토 언박싱
변수명 = 객체;
package wrapper;
public class WrapperTest {
public static void main(String[] args) {
//박싱
Integer obj = new Integer(10);
Integer obj2 = (Integer)10;
Double obj3 = (Double)10.24;
//언박싱
int data = obj.intValue();
Double data1 = obj3.doubleValue();
//오토박싱
obj = 20;
//오토 언박싱
data = obj;
}
}
기본형 타입의 값을 객체로 다루어야 할 때
기본형 타입이 아닌 객체로 값을 저장해야 할 때
매개변수로 객체를 넘길 때(특히 Object)
객체간의 비교가 필요할 때
package wrapper;
public class WrapperTest2 {
public static void main(String[] args) {
Test t = new Test();
t.f(30);
//int 자료형으로 호출한 f()
t.f((Integer)10);
//Integer 클래스로 호출한 f()
}
}
class Test{
void f(int data) {
System.out.println("int 자료형으로 호출한 f() : "+ data);
}
void f(Integer data) {
System.out.println("Integer 클래스로 호출한 f() : "+data);
}
//어떤 것이든 넘겨라 ! / 객체를 넘겨라 !
void f(Object obj) {
System.out.println("Object 클래스로 호출한 f() : "+ obj);
}
}
자료형을 선언할 때 정하지 않고, 객체를 생성할 때 정하는 기법
class 클래스명<키워드>{
내부에서 키워드를 타입으로 사용 가능
}
<키워드>
//개발자들이 자주 쓰는 키워드
E : Element
N : Number
T : Type
K : Key
V : Value
클래스 내부에서 사용될 자료형을 지정한다.
package generic;
// 키워드에는 아무거나 들어갈 수 있지만 키워드를 타입으로 사용기에 아래와 같이 사용
public class GClassTest<T> {
// 어떤 타입이 들어올지 모르지만 데이터가 들어오면 변수를 할당
T data;
// 같은 타입의 data를 사용함
T getData() {
return data;
}
}
메인 클래스를 하나 만들어서 사용해본다.
package generic;
public class GenericMain {
public static void main(String[] args) {
// 제네릭 클래스, int 타입이 아닌 클래스형의 기본타입이 들어간다.
GClassTest<String> obj = new GClassTest<String>();
obj.data = "제네릭 클래스";
System.out.println(obj.getData());
}
}
메소드 내부에서 사용될 자료형을 지정한다.
<키워드>리턴타입 메소드명(){
내부에서 키워드를 타입으로 사용 가능
}
package generic;
public class GMethodTest {
<T>T f(T data){
System.out.println(data);
return data;
}
}
메소드 또한 메인 클래스에서 사용해본다.
GMethodTest obj2 = new GMethodTest();
obj2.<String>f("Hello");
// 제네릭 메소드는 보통 키워드를 유추할 수 있기 때문에 따로 명시적으로 작성해주지 않아도 된다.
obj2.f(10);
인터페이스 내부에서 사용될 자료형을 지정한다.
interface 인터페이스명<키워드>{
내부에서 키워드를 타입으로 사용 가능
}
package generic;
public interface GInterTest<N1, N2> {
N1 add(N1 num1, N1 num2);
// 제네릭은 타입이 다르다고 확신할 수 없기 때문에 오버로딩 불가능
// N2 add(N2 num1, N2 num2);
N2 div(N2 num1, N1 num2);
}
이것 또한 메인 클래스에서 사용해본다
GInterTest<Integer, Double> obj3 = new GInterTest<Integer, Double>() {
@Override
public Double div(Double num1, Integer num2) {
return num1 / num2;
}
@Override
public Integer add(Integer num1, Integer num2) {
return num1 + num2;
}
};
System.out.println(obj3.div(10.0, 3));
System.out.println(obj3.add(2, 3));