[TIL] java 제네릭(Generic)의 배경

빼곰·2023년 1월 7일
0

문제

  • 제네릭(Generic)의 개념과 필요성에 대해서 예제 코드로 설명해보시오.
  • 모든 타입을 다 받는 클래스를 만들어보시오.

1. 모든 타입을 받는 클래스 만들기

  • 위 코드를 보면 객체 생성시 인자값의 타입을 하나만 받을 수 있다.
    문자열을 받고 싶으면 클래스의 선언한 변수 값의 타입을 모두 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

  • object객체를 생성해보기
Sample s3 = new Sample(new Object());
System.out.println(s3.getObj());
s3.printInfo();

출력결과>
java.lang.Object@3ac3fd8b
java.lang.Object

2. 단점

  • 위와 같이 사용시 단점이 존재한다.
    어떤 타입을 받아도 반환되는 타입은 Object가 된다.

    그래서 다른 타입으로 사용하려면 형변환을 강제적으로 해줘야한다.

  • 형변환을 하지 않고 object로 받으면

--> 변수만 출력했을 때는 대입된 값을 잘 확인 할 수 있지만 변수의 길이와 같은 String 클래스함수들을 사용할 수 없다.

  • 정수 타입도 살펴보자

--> 형변환 또는 Object로 받아야되고 Object로 받았을 때도 빨간색으로 출력이 됬다?!
그리고 정수타입일때 쓸 수 있는 연산이 되지 않는다.

3. genic이 나온 이유

위와 같은 단점을 해결할 수 있는 방법을 찾다가 genic이 나오게 되었다.
규칙을 만들어 새로운 문법이 만들어지게 되었다.

profile
개발 블로그

0개의 댓글