제네릭스 질문이있습니다.
기존에 제네릭스를 사용하기 위해
Wrapper클래스를 사용하여 Integer, Double과 같이 정의한 뒤에 사용했었는데 현 강의에서는
public static <T, V> void orderCoffee(T name, V coffee){
System.out.println(coffee + " 준비 완료 : "+name);
}이와같이 선언 한뒤
orderCoffee(27, "라떼")
와 같이 호출을 하는데 Wrapp를 사용해주어야하는 경우와 아닌 경우가 구분이 잘 가지 않습니다...
답변 1
1
안녕하세요?
이해를 돕기 위해 강의에서 사용된 Coffee 클래스를 조금 변경하겠습니다. 생성자가 아닌 setName() 메소드를 추가하여 이 메소드가 호출될 때 이름 정보를 설정하도록 하겠습니다.
public class Coffee <T>{
public T name;
public void setName(T name) {
this.name = name;
}
public void ready() {
System.out.println("커피 준비 완료 : " + name);
}
}이때 제네릭 클래스인 Coffee 는 아래와 같이 객체를 생성할 때 자료형이 결정됩니다. c1 의 경우 자료형을 Integer 로 하였기 때문에 setName() 메소드를 호출할 때 정수만 사용 가능합니다. c2 의 경우 자료형을 String 으로 하였기 때문에 setName() 메소드를 호출할 때 문자열만 사용 가능합니다.
Coffee<Integer> c1 = new Coffee<>(); // 자료형 : 정수
c1.setName(35);
c1.ready();
Coffee<String> c2 = new Coffee<>(); // 자료형 : 문자열
c2.setName("나도코딩");
c2.ready();반면에 제네릭 메소드는 메소드를 호출할 때 자료형이 결정됩니다. 메소드를 호출하면서 원하는 형태의 값을 전달하게 되는데요.
orderCoffee(35, "아메리카노"); // <정수, 문자열>
orderCoffee("나도코딩", "라떼"); // <문자열, 문자열>이때, 자바 컴파일러는 전달값으로 입력한 <35, "아메리카노"> 또는 <"나도코딩", "라떼"> 로부터 orderCoffee() 메소드의 T, V 를 각각 Integer, String 등으로 유추할 수 있습니다. 그래서 <Integer>, <String> 을 따로 명시하지 않고 생략 가능합니다.
public static <T, V> void orderCoffee(T name, V coffee) {
System.out.println(coffee + " 준비 완료 : " + name);
}생략하지 않고 사용하는 형태는 이렇습니다. 설명을 위해 orderCoffee() 메소드를 별도의 클래스로 이동하였습니다.
public class Cafe {
public static <T, V> void orderCoffee(T name, V coffee) {
System.out.println(coffee + " 준비 완료 : " + name);
}
}그리고 main() 메소드에서 다음과 같이 이 메소드를 호출해보겠습니다.
Cafe.<Integer, String>orderCoffee(35, "아메리카노");
Cafe.<String, String>orderCoffee("나도코딩", "라떼");이렇게 하면 첫 줄에는 전달값으로 반드시 <정수, 문자열> 형태의 값을 넣어야 하며, 둘째 줄에는 <문자열, 문자열> 형태의 값을 넣어야 합니다. 단, 앞서 말씀드린대로 제네릭 메소드는 전달값으로부터 자료형을 유추할 수 있기 때문에 위 문장은 다음처럼 작성할 수 있습니다. 이때는 전달값으로 입력되는 데이터에 따라 자료형이 결정됩니다.
Cafe.orderCoffee(35, "아메리카노");
Cafe.orderCoffee("나도코딩", "라떼");이해에 도움되시길 바라겠습니다 😊
감사합니다.
자바를 처음 배울 때 이런 고민이 드는 게 정상일까요?
1
146
2
static이 뭐였는지 기억이 안나요 ㅜㅜ
0
119
2
Iterator (알 수 없음) 데이터 삭제 후 초기화 관련 문의
0
72
1
사고력 키우는 법이 어떤게 있나요?
0
94
2
getter setter
0
103
2
섹션9. 66 메소드 오버로딩 시 질문이 있습니다.
0
80
1
안녕하세요 갑자기 프로그램 에러가 떠서 안되네요
0
76
2
변수 이름짓는법
0
114
2
intelli J 실행오류
0
115
2
혹시 이건 수학적 사고가 부족한 걸까요?
0
152
2
영상이 재생이 안됩니다.
0
167
3
이중 반복문 (후반전) 오른쪽으로 치우친 별 쌓기에 질문이 있습니다.
0
117
2
응용이 어렵습니다.
0
206
2
IntelliJ가 보이지 않습니다.
0
187
3
JDK 버전 문의
0
130
2
BlackBox 파일 내에서 메소드 정의
0
136
1
동기화
0
123
2
Iterator 문의
0
105
1
코드 순서 문의
0
143
1
클래스 메소드
0
150
2
Quiz_05 관련 질문드립니다 !
0
118
2
다운로드가 안됩니다
0
165
2
다형성
0
120
2
HashMap
0
81
2





