위 코드를 보면 객체 생성시 인자값의 타입을 하나만 받을 수 있다.
문자열을 받고 싶으면 클래스의 선언한 변수 값의 타입을 모두 string타입으로 받고 반환해야하고
정수값을 받고 싶으면 클래스의 선언된 벼수값과 메서드 모두 int타입으로 바꾸야한다.
코드의 수정과정없이 여러가지(모든) 타입을 모두 수용하는 방법은 없을까?
--> Object 타입을 사용한다.!!
class Sample{
//Field
private Object obj;
//Constructor
Sample(Object x){this.obj=x;}
//Method
public Object getObj() {
return obj;
}
void printInfo() {
System.out.println(obj.getClass().getName()); // 객체가 속하는 클래스의 정보를 출력하는 메서드
}
}
public class Java100_collection_Generic1 {
public static void main(String[] args) {
// [1] : 객체 생성 --> 문자열
Sample s1 = new Sample("안녕하세요~");
System.out.println(s1.getObj());
s1.printInfo();
//[2] : 객체 생성 --> 숫자
Sample s2 = new Sample(100); //Err
System.out.println(s2.getObj());
s2.printInfo();
}
}
출력결과 >
안녕하세요~
java.lang.String
100
java.lang.Integer
Sample s3 = new Sample(new Object());
System.out.println(s3.getObj());
s3.printInfo();
출력결과>
java.lang.Object@3ac3fd8b
java.lang.Object
위와 같이 사용시 단점이 존재한다.
어떤 타입을 받아도 반환되는 타입은 Object가 된다.
그래서 다른 타입으로 사용하려면 형변환을 강제적으로 해줘야한다.
형변환을 하지 않고 object로 받으면
--> 변수만 출력했을 때는 대입된 값을 잘 확인 할 수 있지만 변수의 길이와 같은 String 클래스함수들을 사용할 수 없다.
--> 형변환 또는 Object로 받아야되고 Object로 받았을 때도 빨간색으로 출력이 됬다?!
그리고 정수타입일때 쓸 수 있는 연산이 되지 않는다.
위와 같은 단점을 해결할 수 있는 방법을 찾다가 genic이 나오게 되었다.
규칙을 만들어 새로운 문법이 만들어지게 되었다.