제네릭이란 타입을 명시해 주는 것이다
그리고 리스트 외에 클래스나 메서드에서도 사용할 수 있다
하지만 리스트와는 용도가 다르다
아래 코드로 알아보자
코드1
package Study;
public class GenericClassStudy<T> {
private T memberId;
private T memberName;
public T getMemberId() {
return memberId;
}
public void setMemberId(T memberId) {
this.memberId = memberId;
}
public T getMemberName() {
return memberName;
}
public void setMemberName(T memberName) {
this.memberName = memberName;
}
public static void main(String[] args) {
GenericClassStudy<String> member = new GenericClassStudy<String>();
member.setMemberId("ABC123");//정상
member.setMemberId(123);//에러
}
}
코드2
package Study;
public class GenericClassStudy {
private String memberId;
private String memberName;
public String getMemberId() {
return memberId;
}
public void setMemberId(T memberId) {
this.memberId = memberId;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(T memberName) {
this.memberName = memberName;
}
public static void main(String[] args) {
GenericClassStudy member = new GenericClassStudy();
member.setMemberId("ABC123");//정상
member.setMemberId(123);//에러
}
}
결론적으로 말하자면 코드1과 코드2는 같다
코드2를 제네릭 클래스로 표현하면 코드1과 같이 된다
일반적으로 제네릭 안에는 String, Integer, Object등을 명시하나
타입을 알수 없거나 기존 코드를 동적으로 사용하기 위해 제네릭안에 임의의 알파벳을 작성한다
굳이 T가 아닌 다른 알파벳이여도 된다(대소문자 구분 없으나 대문자를 추천한다)
public class GenericClassStudy{
private String memberId;
private String memberName;
}
위 코드의 멤버변수 타입을 만약 int로 수정할려면 전부 수정해 줘야한다
하지만 제네릭 클래스를 사용하면 좀 다르다
package Study;
public class GenericClassStudy<T> {
private T memberId;
private T memberName;
public static void main(String[] args) {
GenericClassStudy<Integer> member = new GenericClassStudy<Integer>();
member.setMemberId("ABC123");//에러
member.setMemberId(123);//정상
}
}
객체생성을 할때 제네릭 안에 타입만 바꿔주면 전부 바뀐다
또한 여러개의 타입을 선언해 줄 수도 있다
package Study;
public class GenericClassStudy<I, S> {
private I memberNumber;
private S memberName;
public I getMemberNumber() {
return memberNumber;
}
public void setMemberNumber(I memberNumber) {
this.memberNumber = memberNumber;
}
public S getMemberName() {
return memberName;
}
public void setMemberName(S memberName) {
this.memberName = memberName;
}
public static void main(String[] args) {
GenericClassStudy<Integer, String> member = new GenericClassStudy<Integer, String>();
member.setMemberNumber(1);
member.setMemberName("ABC");
}
}
제네릭 메서드도 마찬가지이다
package Study;
public class GenericClassStudy<I, S> {
private I memberNumber;
private S memberName;
/*제네릭 메서드*/
public void Person(I age) {
System.out.println(age);//20
}
public static void main(String[] args) {
GenericClassStudy<Integer, String> member = new GenericClassStudy<Integer, String>();
member.Person(20);
}
}
남발하면 규모가 커질때 머리아프니 적당히
'Programming > JAVA' 카테고리의 다른 글
| [JAVA] GetBytes (0) | 2020.09.13 |
|---|---|
| [JAVA] HashCode (0) | 2020.09.12 |
| [JAVA] Generic (0) | 2020.09.11 |
| [JAVA] NullCheck (0) | 2020.09.11 |
| [JAVA] Bean(DTO, VO) (0) | 2020.09.11 |



