Shuttle에 많이 태우기 위해 코드를 수정한 후 생긴 사이드 이팩트
154
작성한 질문수 5
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
```
package generic.test.ex3;
import generic.test.ex3.unit.BioUnit;
public class Shuttle<T extends BioUnit> {
private BioUnit[] units;
private int unitCount;
public Shuttle() {
units = new BioUnit[10];
}
public void in(T unit) {
units[unitCount++] = unit;
}
public T out() {
return (T) units[0];
}
public void showInfo() {
for (int i = 0; i < unitCount; i++) {
System.out.println("이름: " + units[i].getName() + " HP: " + units[i].getHp());
}
}
}
package generic.test.ex3;
import generic.test.ex3.unit.Marine;
import generic.test.ex3.unit.Zealot;
import generic.test.ex3.unit.Zergling;
public class ShuttleTest {
public static void main(String[] args) {
Shuttle<Marine> shuttle1 = new Shuttle<>();
shuttle1.in(new Marine("마린", 40));
shuttle1.in(new Marine("마린2", 45));
shuttle1.showInfo();
Shuttle<Zergling> shuttle2 = new Shuttle<>();
shuttle2.in(new Zergling("저글링", 35));
shuttle2.in(new Zergling("저글링2", 35));
shuttle2.in(new Zergling("저글링3", 35));
shuttle2.in(new Zergling("저글링4", 35));
shuttle2.showInfo();
Shuttle<Zealot> shuttle3 = new Shuttle<>();
shuttle3.in(new Zealot("질럿", 100));
shuttle3.in(new Zealot("질럿2", 100));
shuttle3.in(new Zealot("질럿3", 100));
shuttle3.in(new Zealot("질럿4", 100));
shuttle3.showInfo();
UnitPrinter.printV1(shuttle1);
UnitPrinter.printV2(shuttle1);
}
}
Shuttle을 생성하고 내부에 많이 태우고 싶어서 코드를 조금 수정해 보았습니다 !
그런데 코드를 이렇게 수정하니 문제풀이 시간 때
package generic.test.ex3;
import generic.test.ex3.unit.BioUnit;
public class UnitPrinter {
public static <T extends BioUnit> void printV1(Shuttle<T> shuttle) {
T out = shuttle.out();
System.out.println("이름: " + out.getName() + "HP: " + out.getHp());
}
public static void printV2(Shuttle<? extends BioUnit> shuttle) {
BioUnit out = shuttle.out();
System.out.println("이름: " + out.getName() + "HP: " + out.getHp());
}
}이 코드를 출력하기 위해서 Shuttle 클래스에 out메서드에 unit 1명만 출력하기 위해 (T) units[0]을 반환하였는데요,
이렇게 한 덕분에 문제 요구사항 대로 잘 나왔지만,
Shuttle 클래스의 out 메서드에 이러한 린트가 발생합니다.
Unchecked cast: 'generic. test. ex3.unit. BioUnit' to 'T'
왜 이러한 문제가 발생하는지 파악을 하지 못했고,
혹시 코드를 이렇게 작성하게 된다면 어떤 문제점이 발생하는지, 어떻게 리팩터링 하면 좋을지 조언을 구하고 싶습니다 !
답변 1
1
안녕하세요. 강리눅스님, 공식 서포터즈 y2gcoder입니다.
제시해주신 메시지에서도 볼 수 있듯이 하위 클래스로 검사하지 않고 형변환이 일어나기 때문에 경고하는 메시지로 보입니다! 해당 코드에서는 문제가 발생할 것 같지는 않지만, 컴파일러 입장에서는 어쨋든 내부 배열의 타입이 BioUnit 인데 이를 BioUnit을 상속한 하위 클래스로 검사없이 형변환 하려고 하니 경고를 보여주는 것이라 생각해주시면 감사하겠습니다!
이는 본 강의를 끝까지 듣고 나시면 배울 컬렉션 프레임워크들 중 하나를 이용하실 수 있으실 겁니다! 컬렉션 프레임워크들은 제네릭을 지원하기 때문입니다 🙂
감사합니다.
제네릭 타입 매개변수 제한과 관련한 문의입니다.
0
80
3
강의가 좀 버겁다 느껴질 때 학습방법 문의
1
135
4
제네릭 반환값 및 파라미터 선언 방식의 변화 <T> T
0
62
1
new T()가 안 되는 니유
0
102
1
안녕하세요, 문제와 실행 결과가 다른 부분이 있어 제보드립니다.
0
98
2
자바 로드맵 선택 질문
0
111
2
실전 자바 중급 - 2편 후 추천 강의
0
176
2
실프로젝트에서 Java25버전 사용
0
121
1
Arrays.sort
0
68
1
블로그 작성 시, 저작권 문제에 대하여
0
166
1
중급2편 56강의 bucket.add(value); 메서드가 이해가 안됩니다.
0
94
3
pop()과 poll()의 차이
0
94
1
특정 index의 노드 조회하기 질문
0
66
2
List.of() 비어있는 불변 리스트 생성
0
81
2
문제2: 개 타입 반환
0
56
2
[리뷰] 중급2편까지 겨우 완강 했습니다.
0
114
2
문제와 풀이1 Ex2와 Ex3
0
65
2
노드 삭제시 노드 null값으로 초기화
0
77
2
강의영상에 대한 질문
0
57
1
타입 매개변수 제한
0
59
1
compareTo
0
68
1
직접 구현하는 연결리스트 3 - 추가 부분 질문있습니다
0
99
3
섹션 8-58 equals and hashcode 에서 코드가 다르게 생성됨
0
70
2
퀴즈 오류 관련 문의
0
109
1





