[24.10.07] TIL

yy·2024년 10월 7일

개발일지

목록 보기
118/122

JAVA공부중

scanner.nextLine() 과 scanner.next() 차이

  • nextLine() : 줄바꿈을 포함하여 전체 줄 입력받음.
  • next() : 공백이나 줄바꿈을 기준으로 하나의 단어를 입력받음.

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));
}

타입 매개변수가 꼭 필요한 경우

  • 타입 매개변수는 반환타입, 매개변수를 다 바꿀 수 있지만 와일드카드는 그럴 수가 없다.
  • 반환타입, 매개변수의 타입을 내 마음대로 할 수가 없음.

타입 이레이저

  • 자바의 제네릭 타입은 컴파일 시점에만 존재. 런타임 시에는 제네릭 정보가 지워지는데 이것을 타입 이레이저라고 함.
profile
시간이 걸릴 뿐 내가 못할 건 없다.

0개의 댓글