언어/Java

제네릭과 Wrapper 클래스

뭉지(moonz) 2020. 9. 23. 21:10
반응형

제네릭 개념

----------------------------------------------------------------------------------------

▶클래스나 메소드를 형판에서 찍어내듯이 생산할 수 있도록 '일반화된 형판'을 만드는 기법

▶특정 타입만 다루지 않고, 여러 종류의 타입으로 쓰일 수 있도록 클래스나 메소드를 '일반화'시키는 기법

쉬운말로, 자료형을 정하지 않는 기법. (외부에서 지정) -> 외부에서 어떤 타입이 들어올지 모를 때 유용.

▶여러 종류를 받는 클래스,인스터페이스 이름옆에 <타입 매개변수>를 써준다.

  (타입을 파라미터로 가지는 클래스와 인터페이스가 된다.)

 

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.
        

 

반응형