Wanna be Brilliant Full-Stack Developer

자바 제네릭이란 무엇인가? 본문

Some Memos/Java

자바 제네릭이란 무엇인가?

Flashpacker 2023. 3. 16. 23:53


제네릭이 조금은 어려울수있다!

바구니라는 클래스를 만들어서 어떨때는 문자열을 담고 경우에 따라 숫자를 담는다.

애를 숫자를 담는건지 문자를 담는건지 정의가 안되어 있다.

이떄 우리가 배운거 무엇을 쓰는가?

Object를 쓰면 된다.

이렇게 하고 나서 바구니를 메모리에 띄어보자! 

문자 하나 담어보자! 

새로운 바구니를 만들자

바구니 s2 = new 바구니();

s2.data = " 문자열" 을 담고 s2.data를 가져오면 

굉장히 잘나온다! 

이 Object에는 단점이 있다고 했다. 그 단점을 경험해보자!

 

이번에는 큰바구니를 만들어보자! 

이 바구니는 어떨떄는 호랑이를 담고 어떨때는 사자를 담는다.

여기서 오브젝트라고 했으니까 둘다받을 수 있따.

이렇게 하면 s1.data에는 호랑이의 주소를 가지고 있다. 근데 .하고 name이 안된다.

왜 안되는가? s1.data가 바라바고 있는것은 큰바구니이기 떄문에 호랑이가 아니라 변수를 채갈수가 없다.

그래서 다운캐스팅을 해야한다.

이렇게 하는것이 굉장히 불편하다! 

 

그래서 제네릭이라는것을 사용해보자! <> 꺽새를? T라고 하자!

이 제네릭은 오브젝트보다 훨씬 좋다! 

왜좋은지 사용해보자! 

경고 표시가 뜬다! 큰 바구니는 raw 타입이라 T자리에 먼가 넣어줘야한다.

파라미터를 하나 넣어줘야한다.

그러면 이 바구니가 큰 호랑이가 된다. 근데 아직도 오류가 난다?!

그리하여 뒤에도 <호랑이>를 붙여준다.

양쪽으로 바구니 옆에 호랑이를 적어두면 귀찮으니까 뒷부분은 생략이 가능하다

이게 제네릭의 문법이다!

그러면

이 부분에 호랑이가 들어간다! 이 Data는 호랑이 타입이 된다.

결국 호랑이가 들어오고 호랑이가 되는 것이다. 

 

s1.data가 호랑이니까 오브젝트가 아니니까 .name하면 바로 찾을 수 있다. 굉장히 편하다!? 

근데 nullPointerException이 떳다.

왜 이 오류가 뜨는가? 호랑이 호랑이가 들어갔는데 이 data값에 아무것도 안들어가 있어서 그렇다. 

널포인터 아무것도 없다는 뜻이다.

이게 제네릭이다,

제네렉은 어떤 객체를 만들떄 어떤 클래스를 만들떄 타입이 정해져있지 않으면
오브젝트로 하면 불편하니까

제네릭이라는 문법을 쓰라는것이다 굉장히 편안하니까?!