본문 바로가기
캠퍼스/Java

48. 제네릭

by Sylar 2022. 8. 8.

-제네릭?


데이터의 타입(data type)을 일반화한다(generalize)는 것을 의미한다.


제네릭을 설명하기 위해 입력값에 따라 데이터를 나누는 코드를 작성할거다.
데이터를 구분하는 공간은 static으로 띄웠다.


화살표 둘다 getDate에 1을 전달한다.

Date 를 heap에 띄운후에 return은 적용되나 return new는 오류가 난다.

1을 집어넣으면 if에서 ture가 나오니 조건식이 종료될거다.


1을 받으면 Date1에 1을 리턴하고 다른숫자는 Date2에 리턴하려고 하는데 에러가 난다.

date1 타입을 리턴해야 하는데 서로 타입이 달라 안됨 .


부모를 만들어 상속시킨후 Date에서 값을 분별하게 만들었다.
이렇게 하면 오류가 해결되나 문제가 생긴다.


분명히 Date를 heap에 띄웠는데 num과 name을 찾을수가 없다.
호출이 안되는 모습. = > 다운캐스팅 하여 써야함 .

-다운캐스팅?


Date d = getDate(1);

date << 호출시 가르킴

date1 ( num 가짐 )

다운캐스팅은 포인터가 바라보는 위치를 바꿔줌.


어떻게 하냐?

Date1 d = (Date1) getDate(1); 와 같이 한다.
포인터를 Date1으로 안바꾸면 heap 에는 Date1 밖에 안떠서 아예 찾을 수가 없음.
즉 date로 잡으면 date는 heap에 안떠서 못찾는다는 이야기.

date

date1 ( num 가짐 ) << 호출시 가르킴

이렇게 다운 캐스팅 해야 System.out.println(d.num); 호출 할 수 있음. 출력값은 10.

이제 쉬운방법이다.



class Box 에 < > 를 옆에 쓴후 아무 대문자나 쓴다.
보통 T를 쓴다.


< > 안에 받고싶은 타입을 쓰면 된다.
근데 String은 에러가 안나고 int는 에러가 난다.
왜그러냐면 제네릭은 class타입만 쓸수 있다.

int - > Integer
double - > Double
long - > Long
boolean - > Boolean

이라고 자바가 친절히 변경해놨다.


에러가 없어진 모습.


return 할 값은 타입을 맞춰서 적어야 한다.


에러가 해결된 모습.


식은 1을 넣으면 그 값을 int 에 저장하고 아닌경우 String에 저장하라는 뜻이다.


출력시 정상적으로 작동하는 모습.


화살표가 가르키는 방향은 다 입력하지 않아도 된다.
아래에서 맞춰서 받기 때문.

-그래서 이걸 왜쓰나 ?

클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높이고

반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있다고 한다.

'캠퍼스 > Java' 카테고리의 다른 글

50. 자바와 DB 연동하기  (0) 2022.08.12
49.ArrayList  (0) 2022.08.08
47. 인터페이스  (0) 2022.08.07
46. 추상 클래스  (0) 2022.08.07
45.생성자 오버로딩  (0) 2022.08.07