java 22

산야(Sanya)·2024년 1월 26일

java 족보

목록 보기
24/28

1. Generic 메소드에 대하여 설명하시오.

제네릭 메소드는 메소드의 선언부에 타입 파라미터를 갖는 메소드를 말합니다. 이를 통해 메소드가 다양한 타입의 객체를 처리할 수 있게 됩니다. 제네릭 메소드는 메소드의 반환 타입 앞에 타입 파라미터를 선언하며, 이 타입 파라미터는 메소드 내에서 타입으로 사용됩니다.

2.Generic(제네릭) 클래스의 타입 인자 제한하는 방법과 효과는?

제네릭 클래스의 타입 인자를 제한하는 방법은 바운디드 타입(Bounded Type)을 사용하는 것입니다. 이는 타입 파라미터가 특정 타입의 하위 타입만 가능하도록 제한하는 것을 말합니다. 이를 통해 타입 안정성을 높이고, 잘못된 타입의 객체를 사용하는 것을 방지할 수 있습니다.

3.와일드 카드란?

와일드 카드는 제네릭 타입의 인자를 제한하지 않는 것을 말합니다. 이는 <?>로 표현되며, 어떤 타입의 객체도 허용한다는 의미입니다. 이를 통해 제네릭 타입의 인스턴스를 더 유연하게 처리할 수 있습니다.

4.다음 질문에 답하라.

Class JClass {
	static String take(String s[], int index) {
		if(index > s.length) {
			System.out.println("인덱스가 범위를 벗어났습니다.");
			return null;
		}
		return s[index];
	}
}

(1) JClass의 take() 메소드는 무엇을 처리하는 코드인가?

JClasstake 메소드는 문자열 배열 s에서 주어진 인덱스 index에 해당하는 요소를 반환하는 메소드입니다. 만약 index가 배열의 범위를 벗어나면, 오류 메시지를 출력하고 null을 반환합니다.

(2) JClass의 take() 메소드가 임의의 타입에 대해 동작하도록 제네릭 메소드로 수정하여 JGenClass를 작성하라.

class JGenClass {
    static <T> T take(T[] arr, int index) {
        if(index >= arr.length) {
            System.out.println("인덱스가 범위를 벗어났습니다.");
            return null;
        }
        return arr[index];
    }
}

(3) JGenClass를 활용하는 코드 사례를 보여라

public class Main {
    public static void main(String[] args) {
        Integer[] intArr = {1, 2, 3, 4, 5};
        String[] strArr = {"Apple", "Banana", "Cherry", "Date", "Elderberry"};

        Integer intElement = JGenClass.take(intArr, 2);
        String strElement = JGenClass.take(strArr, 3);

        System.out.println("Selected element from integer array: " + intElement);
        System.out.println("Selected element from string array: " + strElement);
    }
}

5. 아래가 에러나는 이유를 설명하시오.

class Plastic {}
class Toy extends Plastic {}
class Car extends Toy {}
class Robot extends Toy {}

class Box<T> {
	private T ob;

	public void set(T o) { ob = o; }
	public get() { return ob; }

	public static void inBox(Box<? super Toy> box, Toy n) {
			box.set(n); // 넣는 것! OK!
			Toy myToy = box.get(); // 꺼내는 것! Error!
	}
}

Box<? super Toy> boxToy 또는 그 상위 클래스의 인스턴스를 저장할 수 있는 Box를 의미합니다. 따라서 box.set(n)은 문제가 없습니다. 그러나 box.get()Object 타입을 반환하므로, 이를 Toy 타입의 변수에 할당하려고 하면 컴파일 오류가 발생합니다. 이를 수정하려면 반환 값을 Toy 타입으로 캐스팅해야 합니다: Toy myToy = (Toy) box.get();.

6.아래의 소스코드 중에


System.out.println(zBox.get().get().get()); 부분을 설명하시오.
class Box<T> {
	private T ob;

	public void set(T o) {
		ob = o;
	}

	public T get() {
		return ob;
	}
}
public class BoxInBox {
	public static void main(String[] args) {

		Box<String> sBox = new Box<>(); //Box<T>에 데이터타입을 String으로 결정
		sBox.set("I am so happy."); //sBox set함수에 문자열 set

		Box<Box<String>> wBox = new Box<>(); //Box<T>에 데이터타입을 Box<String>으로 결정
		wBox.set(sBox); //sBox의 값을 wBox값으로 set

		Box<Box<Box<String>>> zBox = new Box<>(); //Box<T>에 데이터타입을 Box<Box<String>>으로 결정
		zBox.set(wBox);  //wBox의 값을 zBox값으로 set

		System.out.println(zBox.get().get().get()); //-> 이부분을 설명하세요.
        //zBox의 get함수 호출 시  zBox의 값은 wBox에서 가져왔으므로 한번 더 .get()을 해주고
        //wBox의 값은 sBox에서 가져왔으므로 한번 더 .get()을 해준 것이다. 
	}
}

출력값
I am so happy.

System.out.println(zBox.get().get().get());zBox에서 wBox를 가져오고(zBox.get()), wBox에서 sBox를 가져오고(wBox.get()), 마지막으로 sBox에서 문자열을 가져옵니다(sBox.get()). 따라서 이 코드는 zBox에 저장된 문자열을 출력합니다.

7.와일드 카드와 상한 제한, 하한 제한에 대하여 설명하시오.

와일드 카드는 제네릭 타입의 인자를 제한하지 않는 것을 말합니다. 이는 <?>로 표현되며, 어떤 타입의 객체도 허용한다는 의미입니다. 상한 제한(<? extends T>)은 타입 인자가 T 또는 T의 하위 클래스만 가능하도록 제한합니다. 하한 제한(<? super T>)은 타입 인자가 T 또는 T의 상위 클래스만 가능하도록 제한합니다.

8.아래와 같이 메소드 오버로딩이 되지 않는 이유는?

   public static void outBox(Box<? extends Toy> box) {...}
   public static void outBox(Box<? extends Robot> box) {...}

메소드 오버로딩은 메소드 이름이 같고, 매개변수의 타입, 개수, 순서가 다른 경우에만 가능합니다. 그러나 Box<? extends Toy> boxBox<? extends Robot> box는 제네릭 타입의 인자가 다르지만, 이는 메소드 시그니처를 구성하는 요소가 아닙니다. 따라서 이 두 메소드는 같은 메소드 시그니처를 가지므로 오버로딩이 불가능합니다. 이를 수정하려면 메소드 이름을 변경하거나, 매개변수의 타입, 개수, 순서를 변경해야 합니다.

profile
개발일지

0개의 댓글