본문 바로가기

Programming Language/JAVA

[JAVA] 래퍼 클래스(Wrapper class) 및 제네릭(Generic)

▶ 래퍼 클래스(Wrapper class) 및 제네릭(Generic) 

 

 

 

 

래퍼 클래스(Wrapper class)

: 기본 데이터타입 (int,double,String,char등)의 데이터를 객체로 취급해야하는 경우가 있습니다.
메소드의 인수로 객체 타입만 요구하면, 기본타입을 그대로 사용할 수 없습니다.
이때는 기본타입의 데이터를 먼저 객체로 변환하고 인수로 넣어줘야하는데
8개의 기본데이터타입에 해당하는 데이터를 객체로 만들어 주는 클래스를 말합니다.
( java.lang 패키지에서 제공합니다. )

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

제네릭(generic)
: 보통 데이터타입에는 int,String,long 등....과 같은 기본 데이터타입이 존재합니다.
제네릭은 이런 데이터 타입을 명시하지않은 상태라고 생각하시면 됩니다.
데이터타입을 미리 정의하지않고, 클래스의 객체를 생성해서 데이터타입으로 지정해주는 방식입니다.

 

 

 

 

 

class Print{
	private Object object;
	public Object get() {
		return object;
	}
	public void set(Object object) {
		this.object = object;
	}
}
public class Test {
	
	public static void main(String[] args) {
		Print p1 = new Print();
		p1.set(12345);
		int num = p1.get();  에러
		//int num = (Integer)p1.get();
		System.out.println(num);
	}

}

제네릭을 사용하기 앞서서, 위 예제를 먼저 살펴보겠습니다.
main메소드가 있는 Test클래스에서 Print클래스의 객체를 생성해주고 p1 인스턴스는
set메소드의 인자값으로 12345를 주었습니다. 현재 set메소드는 매개변수로 Object클래스타입으로
받아주고있기에 에러가 발생하지않습니다. 그리고나서 지역변수 int num을 선언해주고 get메소드를
호출해서 리턴된 값을 받아오려하지만, 실제 이클립스로 작성해보면 이부분에서 에러가 발생합니다.
아래 주석되어있는 것은 get메소드를 리턴받은 값이 Object타입이기에 (Integer)로 형변환해줘야 정상처리됩니다.
이처럼 제네릭을 사용하지않으면 매번 강제로 캐스팅을 해줘야하고 프로그램 성능저하가 발생합니다.
이제 아래 제네릭으로 바꿔서 코드를 짜보겠습니다.
( Object클래스는 어떤 클래스든간에 모두 Object클래스를 상속합니다. 즉, '최상의 클래스'라고합니다.
다음장에서 자세히 설명해드리겠습니다. )

 

 

 

 

 

 

class Print<T>{
	private T t;
	public T get() {
		return t;
	}
	public void set(T t) {
		this.t = t;
	}
}
public class Test {
	
	public static void main(String[] args) {
		Print<Integer> p1 = new Print<Integer>();
		p1.set(12345);
		int num = p1.get();
		System.out.println(num);
	}

}

이번에는 제네릭을 사용해봤습니다.

Print p1 = new Print();로 객체를 생성해주었습니다.
Print클래스에서 T는 그냥 임의로 지정해주었습니다. 내부적으로 T제네릭타입은 Integer이 자동 구성됩니다.
그리고나서 p1인스터스의 set메소드로 12345인자를 넘겨주면 p1인스터스의 필드 t는 12345가 저장됩니다.
get메소드를 통해 출력하면 이전에했던 소스랑 다르게 형변환을 해줄필요가없이 int타입인 num변수에 저장됩니다.
만약 제네릭이 없다면 필요한 데이터타입에 맞게 새로운 클래스 or 메소드를 작성해줘야합니다.
그렇기에 제네릭은 반복적인 코드를 절약해주고 코드 재사용성의 장점을 가지고있습니다.
또한, 불필요한 강제타입 형변환을 하지않는 장점이 있습니다.