본문 바로가기
자바(Java)

자바 중급7 - Generic

by codeyaki 2022. 1. 17.
반응형

해당 강의를 듣고 정리한 것입니다

https://programmers.co.kr/learn/courses/9

 

자바 중급

평가 5.0 17개의 평가 ★★★★★17 ★★★★0 ★★★0 ★★0 ★0 ds02168 2021.08.20 15:37 Yeonggwang 2021.06.28 01:48 강신우 2021.04.23 10:20 HyeonWoo Jeong 2021.04.08 17:12 이용준 2021.01.26 19:23 리뷰 더보기

programmers.co.kr


Generic

선언할 때는 가상의 타입으로 선언 후, 사용 시에 구체적인 타입을 설정하여 다양한 타입의 클래스를 이용하는 클래스를 생성할 수 있다.

대표적으로 컬렉션 프레임워크와 관련된 클래스


Box클래스

public class Box {
    private Object obj;
    public void setObj(Object obj){
    this.obj = obj;
    }

    public Object getObj(){
    return obj;
    }
}

BoxExam클래스

public class BoxExam {
    public static void main(String[] args) {
        Box box = new Box();
        box.setObj(new Object());
        Object obj = box.getObj();

        box.setObj("hello");
        String str = (String)box.getObj();
        System.out.println(str);

        box.setObj(1);
        int value = (int)box.getObj();
        System.out.println(value);
    }
}
  • Box는 매개변수 Object를 하나 받아들이고, Object를 반환한다.
  • Object를 받아들일 수 있다는 것은 Object의 자손이라면 무엇이든 받아들일 수 있다는 것이다.
  • 그러나, 다시 해당 오브젝트를 반환하여 저장할 때 항상 형 변환을 해주어야 한다.
    이유는 String을 box에 넣어줘도 Object로 변환되어 저장되고 반환 또한 Object타입으로 반환되기 때문에 String의 필드와 메서드를 사용할 수 없기 때문에 오류가 발생하기 때문에 형 변환을 꼭 해주어야 하는 것이다.

이러한 과정을 편하게 사용할도록 Generic문법을 사용한다.


Generic : 인스턴스를 만들때 사용하는 타입을 지정해주는 문법 ( java5에서 추가)

Generic을 사용한 Box클래스

public class Box<E> {
	private E obj;
	
	public void setObj(E obj) {
		this.obj = obj;
	}
	public E getObj() {
		return obj;
	}
}
  • 클래스 생성시 이름 뒤에 <E>가 제네릭을 적용한 것. Box는 가상의 클래스 E를 사용한다는 뜻이다.
    (E의 이름은 자유롭게 변경가능)
  • Object를 받아들이고, 리턴하던 부분이 E로 변경, E는 실제로 존재하는 클래스는 아님.

Generic을 이용하여 수정한 Box를 이용하는 BoxExam클래스

public class BoxExam {
	public static void main(String[] args) {
	Box<Object> box = new Box<>();
	box.setObj(new Object());
	Object obj2 = box.getObj();
	
	Box<String> box2 = new Box<>();
	box2.setObj("hello");
	String str2 = box2.getObj();
	
	Box<Integer> box3 = new Box<>();
	box3.setObj(5);
	int value2 = box3.getObj();	
	}
}
  • 참조 타입에 <Object>, <String>, <Integer>를 사용.
  • Box<Object> box = new Box<>();  : Object를 사용하는 Box를 인스턴스로 생성
  • Box<String> box2 = new Box<>();  : String을 사용하는 Box인스턴스를 생성
  • Box<Integer> box3 = new Box<>();  : Integer를 사용하는 Box인스턴스를 생성
반응형

'자바(Java)' 카테고리의 다른 글

자바 중급9 - List  (0) 2022.01.17
자바 중급8 - Set  (0) 2022.01.17
자바 중급6 - java.util패키지  (0) 2022.01.17
자바 중급5 - Math클래스  (0) 2022.01.15
자바 중급4 - 스트링 클래스 문제점  (0) 2022.01.14