JAVA/개념정리
Generic
inderrom
2022. 10. 31. 00:55
package kr.or.ddit.basic.generic;
/*
- 제네릭 클래스를 만드는 방법
형식)
class 클래스명<제네릭타입글자>{
제네릭타입글자 변수명; // 변수 선언에 제네릭을 사용할 경우
제네릭타입글자 메서드명(매개변수들...){ //메서드의 반환값 자리에 사용할 경우
.....
return 반환값;
}
반환값타입 메서드명(제네릭타입글자 변수명, ...){ // 메서드의 매개변수에 사용할 경우
}
}
-- 많이 사용되는 제네릭타입글자 --
T ==> Type
K ==> Key
V ==> Value
E ==> Element
*/
class MyGeneric<T>{
private T value; // 변수 선언에 사용
public T getValue() { // 메서드의 반환값 자료형에 사용
return value;
}
public void setValue(T value) { //메서드의 매개변수에 사용
this.value = value;
}
}
class NonGeneric{ // 형변환이 자동으로 될때 자식 객체를 부모한테 넣으면됌
private Object value;
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
}
public class GenericTest {
public static void main(String[] args) {
NonGeneric ng1 = new NonGeneric();
ng1.setValue("가나다라");
NonGeneric ng2 = new NonGeneric();
ng2.setValue(100);
//Object strTemp = ng1.getValue(); // getValue()가 오브젝트이므로 안됨
String strTemp = (String)ng1.getValue();
System.out.println("문자열 반환값 : "+ strTemp);
//Integer intTemp = (Integer) ng2.getValue(); // 일반데이터가 객체형으로 바뀜(박싱)-근데 자동으로 바꿔줌 - 그게 오토박싱
int intTemp = (int)ng2.getValue(); // -- object 자식이므로 자동 형변환됨
System.out.println("정수형 반환값 : " + intTemp);
System.out.println("---------------------------------");
MyGeneric<String>mg1 = new MyGeneric();
mg1.setValue("안녕하세요");
//mg1.setValue(100); // 제네릭과 다른 자료형의 데이터를 저장할 수 없다.
MyGeneric<Integer> mg2 = new MyGeneric();
mg2.setValue(200);
//mg2.setValue("문자열"); // Error
String strMg = mg1.getValue(); // 데이터를 꺼내올 때 형변환 없이 꺼내올 수 있다.
int intMg = mg2.getValue();
System.out.println("제네릭 문자열 반환값 : "+ strMg);
System.out.println("제네릭 정수형 반환값 : "+ intMg);
System.out.println("----------------------------------");
// 컴파일에러는 빨간줄 나는 거 --> 에러표시를 해줌
// 런타임에러 실행단계에서 나는 에러
int test = (int)ng1.getValue(); // ng1은 스트링으로 저장되어 있어서 보기엔 오류가 없어보여도 실행시키면 런타임오류
System.out.println("test = " + test );
// int test2 = mg1.getValue(); 제네릭은 오류를 바로 컴파일에러로 보여줌
}
}