본문 바로가기
Study/프로그래밍 공부

java 기본 문법 - 제네릭의 정의 및 제네릭 타입.

by prlkt5200 2023. 10. 4.
반응형

제네릭에 대해서 다시 복습하면서 정리해보고자 글을 써봤습니다.

아직은 블로그를 어떻게 운영해야 될지 잘 몰라서, 난잡하지만 조금씩 깔끔하게 만들어보고자 하는데

이번 시도가 도움이 되었으면 바라며, 글을 시작하도록 하겠습니다.

 


제네릭이란?? 

 

멤버(필드, 메소드)와 같은 데이터들의  타입을, 타입파라미터를 이용하여 사용하는 순간(객체를 생성하거나 변수를 선언하거나 하는 등등)에 타입을 지정해주는 문법입니다.

 

타입 파라미터의 의미는, "타입이 아직 정해져 있지 않으니 사용할 때 원하는 타입으로 바꿔쓰세요~~"  정도록 이해하면 됩니다.

 <>내부에는 그냥 아무 알파벳이 와도 상관없으며, 본인이나 다른 이들이 이해하기 편한, 상징성을 띄는 글자로 해주면 좋습니다. 예를들어 타입이니까 T, 모델이니까 M 이런 식으로 작명지어도 좋습니다. 참고로 타입 파라미터를 변경하지 않고 사용시, Object 타입으로 인식합니다!!

 

2번째 사진은 실습한 부분인데(한번 보고 오실까요??)

<> 내부에 본인이 사용하길 희망하는 타입을 기재하여 객체를 생성하게 되면, 기재한 타입의 객체가 생성됩니다.

다시 그에 따라 기재한 타입의 변수가 있는 것이고요.

 

 

 

여기서 의문이 들 수도 있습니다. "처음부터, 클래스의 타입을 정하면 안되나??" 같은 경우인데....

 

그렇게 되면 다운 캐스팅(부모객체를 다시 자식 객체 타입으로 형변환)을  해야 하거나 박스라는 클래스를 원하는 타입별로 일일이 만드는 경우가 발생할 수 있습니다.

 

이것이 무슨 말인지 다시 예제와 함께 설명해 보겠습니다.

 

전제: 박스는 그 의미 그대로 여러가지 객체를 담을 수 있게 설계할 것이다.

public class Box{
public Object content;
}

첫번째 사진과는 다르게 타입 파라미터를 지우고 content의 타입을 모든 객체를 받을 수 있게 Object 타입으로 변경했습니다.(Object는 모든 클래스의 부모클래스이기에 그 하위 클래스 전부를 자식객체로 둡니다.)

public Box{
public Object content = "내용물";
}

최상위 클래스니까 문자열을 저장합니다.
이로인해 업캐스팅(자식객체의 타입을 부모타입으로 변환)

그리고 이것을 다시 꺼내 쓰기 위해서는, 최상위 부모클래스를 자식클래스 타입으로 형변환(다운캐스팅)
String str = (String)"내용물";

두번째의 경우 박스 안의 내용물(content)을(를) 꺼내서 사용하고자 할 때 다운캐스팅이 발생합니다.

이렇게 되면 불필요한 과정을 거치게 되고 또 상자 안의 내용물을 알 수 있을 때 써먹을 수 있다는 것입니다.

 

그렇다고 타입별로... "이것은 StringBox, 저것은 IntBox..." 하는 식으로 클래스를 만들기에는 비효율적이라 제네릭을 사용해서, 원할 때마다 타입을 지정해서 객체 및 변수, 메소드를 형성하는 것입니다.

 


제네릭 타입이란??

 

타입을 파라미터로 가지는 클래스와 인터페이스라 정의되어 있는데, 말그대로 타입파라미터를 가진 클래스 및 인터페이스라고 생각하면 끝납니다.


마지막 예제로 복습하시면 좋을 듯해서 올려봅니다.

 

 

반응형