glenn-syj / more-effective-java

이펙티브 자바를 읽으며 자바를 더 효율적으로 공부합니다
4 stars 5 forks source link

[MEJ-007] 가변인수 출력 관련 보충 테스트 #153

Closed FickleBoBo closed 1 month ago

FickleBoBo commented 2 months ago

Based on : chapter_05/item32_손영준_제네릭과-가변-인자에-대한-심화-탐구.md by @Glenn-syj

main 메서드에 String[] args도 어떤 의미가 있겠지 싶었는데 이것이 가변 인자라는게 새삼 놀라웠습니다. 작성해주신 글을 읽어보며 마지막 코드의 getClass() 값이 독특하게 나오는 점이 흥미로워서 저도 몇가지 테스트를 해보았습니다.

출력되는 클래스 타입에 대해서는 해당 가변 인자들을 포함할 수 있는 가장 작은 타입 정도로만 보였는데 이에 대해 유의미한 자료를 찾지는 못했습니다. 다만 몇 번의 테스트를 통해 Serializable 타입 배열에 들어갈 수 있는 값들은 class [Ljava.io.Serializable; 로 출력되는 것으로 보였고(더 작은 공통 타입이 있으면 그것으로 나옴) Serializable 인터페이스를 구현한 ArrayList와 Stack 타입의 경우 잘 출력되는 것을 볼 수 있었습니다. List.of(2)의 경우 타입이 List인데 이는 Serializable 인터페이스를 구현하지 않고 있어서 Object가 출력되는 것으로 보였으며, ArrayList 타입으로 선언한 list를 List 타입으로 바꿀 경우 Serializable로 타입 캐스팅을 요구했습니다.


public class Main {
    public static void main(String[] args) {

        toArray("A", 1, List.of(2));
        toArray("A", 1, (Serializable) List.of(2));

        Serializable[] arr = new Serializable[3];
        arr[0] = "A";
        arr[1] = 1;

        ArrayList<Double> list = new ArrayList<>();
        list.add(3.14);
        arr[2] = list;
        toArray(arr[0], arr[1], arr[2]);

        Stack<Double> st = new Stack<>();
        st.push(2.71);
        arr[2] = st;
        toArray(arr[0], arr[1], arr[2]);
    }

    static <T> T[] toArray(T... arguments) {
        System.out.println(arguments.getClass());
        return arguments;
    }

}

//////////

class [Ljava.lang.Object;
class [Ljava.io.Serializable;
class [Ljava.io.Serializable;
class [Ljava.io.Serializable;
glenn-syj commented 2 months ago

저도 유의미한 자료를 찾지 못했는데... 이건 다음에 같이 한 번 날 잡고 찾아봐도 좋을 것 같네요!

일단 저도 정확한 정보를 찾게 되면 꼭 이슈로 글을 써서 올려보겠습니다.

저와 같이 함께 탐구해주셔서 감사합니다!