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();
}
}
기존 방식과 같지만 사용할 타입들을 설정함으로써
다양한 타입의 클래스를 이용하는 클래스를 만들어 사용이 가능해진다.
'PL(ProgrammingLanguage) > JAVA' 카테고리의 다른 글
Math클래스 (0) | 2021.10.21 |
---|---|
StringBuffer (0) | 2021.10.21 |
java.lang 패키지/ 오토박싱 (0) | 2021.10.20 |
Object와 overriding (0) | 2021.10.17 |
[프로그래머스] 약수의 합 (0) | 2021.10.16 |