본문 바로가기

JAVA/복습

Generic

Generic

 

Generic을 사용함으로써 선언할때는 가상의 타입으로 선언을 해주고(타입을 주는 것은 아님)

실제 사용할 때는  구체적으로 타입들을 설정함으로써 다양한 타입의 클래스를 이용하는 클래스를 만들어낼 수 있다.

 

제너릭을 사용하는  대표적인 클래스

 

Collection 프레임워크와 관련된 클래스들이 있다.

 


package java03.day02;


public class Box {

    // Box는 Object타입으로 obj라는 필드를 갖게 할거고요
	private Object obj;

    //이 필드에 값을 설정할 수 있는 setObj()와
    // 해당 Object의 값을 반환하는 getObj()라는 메소드를 설정
    // 값을 설정하는 부분이기때문에 리턴타입은 필요없다.
    // 값을 받아와서 설정해야할테니까 Object타입으로 값을 받아내면 된다.
    public void setObj(Object obj) {

        // 지금 obj라는 것이 매개변수로 들어온 변수의 obj와
        // 필드의 obj가 같기 때문에 this라는 키워드를 이용하여
        // obj의 값을 설정하게 하면 된다.
        this.obj = obj;
    }

    // 값을 꺼내다 쓸 수 있는 getObj()
    // 값을 리턴해줘야하니깐 리턴타입
    // object의 값을 리턴할거니깐 타입은 obj
    public Object getObj() {
        return obj;
    }
}
package java03.day02;

public class BoxExam {
    public static void main(String[] args) {
    	Box box = new Box();*/

    // 박스에다가 값을 넣어주고 싶을 때 이용하는 setObj()
    // Object 객체를 하나 생성해서 넣어주면 값을 담아낼 수 있다
		box.setObj(new Object());

        // 값을 꺼내서 쓸때
        // getObj()를 이용하면 박스가 가지고 있는 object 클래스를 리턴해줄 것이다.
        // box.getObj();
        // 그 값이 사용할 수 있도록 변수를 미리 준비해야한다.
       Object obj = box.getObj()

        // 박스에 String값을 넣어주고 싶을때
   		box.setObj("Hello");
        
        // 가능하다. 왜냐하면 상속 시 타입이 메소드상에서 들어 올 수 있는 타입이 Object 라는 것은
        // Object 타입이 Object라는 것은 Object 타입만 들어올 수 있는것이아니라
        // Object 타입의 후손/ 자식 클래스들이라면 무엇이든 들어올 수 있기때문이다.

        // Object타입으로 자식들을 다 가리킬 수 있었으나, 자식이 가진 메소드에는 접근할 수 없다.
        // String이 가지고 있는 특징들을 가지고 다 사용하고 싶다 ==> 형변환을 거쳐야만 한다.
		String str = (String)box.getObj();

        box.setObj(1);
        int value = (int) box.getObj();


    }
}

 

박스에 String값을 넣어주고 싶을때 아래와 같이 한다면?

    box.setObj("Hello");

가능하다. 

왜냐하면 상속 시 타입이 메소드상에서 들어 올 수 있는 타입이 Object 라는 것은
Object 타입이 Object라는 것은 Object 타입만 들어올 수 있는것이아니라
Object 타입의 후손/ 자식 클래스들이라면 무엇이든 들어올 수 있기때문이다.

Object타입으로 자식들을 다 가리킬 수 있었으나, 자식이 가진 메소드에는 접근할 수 없다.
String이 가지고 있는 특징들을 가지고 다 사용하고 싶다 ==> 형변환을 거쳐야만 한다.

String str = (String)box.getObj();

 


java 5에서는 제너릭이라는 하는 문법이 사용됨으로써
인스턴스를 만들 때, 사용하는 타입을 지정하는 문법이 추가되었다.

기존에 보면 Object 타입으로 받았기때문에 모든 객체가 다 들어갈 수 가 있지만,
모든 객체가 다 들어가기때문에 다시 꺼내서 사용할 때는 매번 형변환 작업을 해줘야한다.

 

 

그래서 제너릭으로 선언하게 되면 다음과 같다. (class 뒤쪽에다가 꺽새괄호를 이용)

package java03.day02;

public class Box<E> { // 제너릭 선언
  
    // 제너릭 선언 후 E로 수정
    private E obj;

    public void setObj(E obj) {
      
        this.obj = obj;
    }

    public E getObj() {
        return obj;
    }
}

Box는 가상클래스 E를 사용하겠다는 의미이다.
Object를 받아들여서 리턴하는 부분을 모두 E로 변경하고 있다.
E는 실제로 존재하는 클래스는 아니다.
이렇게 지정하는 것을 ' 제너릭을 사용했다 ' 라고 한다.

 


-- 제너릭 지정 후 사용

package java03.day02;

public class BoxExam {
    public static void main(String[] args) {
 
     // Box를 생성하는데 나는 Object타입을 받아들일 수 있도록 생성하겠다.
        Box<Object> box = new Box<>();

        box.setObj(new Object());
        Object obj = box.getObj();

        Box<String> box1 = new Box<>();
        //box1.setObj(3); //String 타입이 아니기 때문에 에러
        box1.setObj("Hello");
        String str = box1.getObj();

        Box<Integer> box2 = new Box<>();
        // box2.setObj("sdd"); //에러 Integer 타입만 입력 가능하기 때문
        box2.setObj(152);
        int v1 = box2.getObj();
    }
}

기존 방식과 같지만 사용할 타입들을 설정함으로써

다양한 타입의 클래스를 이용하는 클래스를 만들어 사용이 가능해진다.

 

 

 

'JAVA > 복습' 카테고리의 다른 글

Math클래스  (0) 2021.10.21
StringBuffer  (0) 2021.10.21
java.lang 패키지/ 오토박싱  (0) 2021.10.20
Object와 overriding  (0) 2021.10.17
사용자 정의 Exception  (0) 2021.10.16