JAVA공부중
nextLine은 전에 nextInt 이후에 남은 줄바꿈 문자를 읽게되어 빈 문자열이나 잘못된 값을 입력받을 수 있음. nextInt 이후에 nextLine을 한 번 더 호출하는 걸로 방지할 수 있으나 next는 바로 문자열을 읽어들이기 때문에 더 간단한 방법.
(... 이어서)
package generic.ex4;
import generic.animal.Cat;
import generic.animal.Dog;
public class MethodMain3 {
public static void main(String[] args) {
Dog dog = new Dog("멍멍이", 100);
Cat cat = new Cat("야옹이", 300);
ComplexBox<Dog> hospital = new ComplexBox<>();
hospital.set(dog);
Cat returnCat = hospital.printAndReturn(cat);
System.out.println("returnCat = " + returnCat);
}
}
package generic.ex4;
import generic.animal.Animal;
public class ComplexBox <T extends Animal>{
private T animal;
public void set(T animal) {
this.animal = animal;
}
public <T> T printAndReturn(T t) {
System.out.println("animal.className: " + animal.getClass().getName());
System.out.println("t.className: "+ t.getClass().getName());
// t.getName(); // 호출 불가 메서드
return t;
}
}
// 반환결과
animal.className: generic.animal.Dog
t.className: generic.animal.Cat
returnCat = Animal{name='야옹이', size=300}
? 를 사용해서 제한 없이 모든 타입을 다 받을 수 있음.package generic.ex5;
import generic.animal.Animal;
public class WildcardEx {
// 와일드 카드 X
static <T> void printGenericV1(Box<T> box) {
System.out.println("T = " + box.get());
}
static <T extends Animal> void printGenericV2(Box<T> box) {
T t = box.get();
System.out.println("이름 = " + t.getName());
}
static <T extends Animal> T printAndReturnGeneric(Box<T> box) {
T t = box.get();
System.out.println("이름 = " + t.getName());
return t;
}
// 와일드 카드 O
static void printWildcardV1(Box<?> box) {
System.out.println("? = " + box.get());
}
static void printWildcardV2(Box<? extends Animal> box) {
Animal animal = box.get();
System.out.println("이름 = " + animal.getName());
}
static Animal printAndReturnWildcard(Box<? extends Animal> box) {
Animal animal = box.get();
System.out.println("이름 = " + animal.getName());
return animal;
}
}
package generic.ex5;
import generic.animal.Animal;
import generic.animal.Cat;
import generic.animal.Dog;
public class WildcardMain1 {
public static void main(String[] args) {
Box<Object> objectBox = new Box<>();
Box<Dog> dogBox = new Box<>();
Box<Cat> catBox = new Box<>();
dogBox.set(new Dog("멍멍이", 100));
// 와일드카드 X
WildcardEx.printGenericV1(dogBox);
WildcardEx.printGenericV2(dogBox);
Dog dog = WildcardEx.printAndReturnGeneric(dogBox);
// 와일드카드 O
WildcardEx.printWildcardV1(dogBox);
WildcardEx.printWildcardV2(dogBox);
Animal animal = WildcardEx.printAndReturnWildcard(dogBox);
}
}
static <T extends Animal> void printGenericV2(Box<T> box) {
T t = box.get();
System.out.println("이름 = " + t.getName());
}
static void printWildcardV2(Box<? extends Animal> box) {
Animal animal = box.get();
System.out.println("이름 = " + animal.getName());
}
// Animal 포함 상위 타입 전달 가능
writeBox(objBox);
writeBox(animalBox);
//writeBox(dogBox); // 하한이 Animal
//writeBox(catBox); // 하한이 Animal
static void writeBox(Box<? super Animal> box) { // 하한이 Animal // Animal 타입을 포함한 Animal타입의 상위 타입만 입력 받을 수 있다는 뜻.
box.set(new Dog("멍멍이", 100));
}