인프런 커뮤니티 질문&답변

인프린님의 프로필 이미지

작성한 질문수

김영한의 실전 자바 - 중급 2편

문제와 풀이1

Set문의

24.06.25 13:14 작성

·

99

0

안녕하세요.

Set관련 2가지 질문드립니다.

1. 문제풀이에서 보면 Set의 내용을 출력할 때 for-each문으로 Set의 내용을 출력하였는데, 기본적인 인덱스 접근은 아닐텐데 어떻게 for-each문으로 값을 찾아서 출력이 가능한 걸까요 ?

(강의에 나온대로 hashIndex를 활용한 접근이라면 어느 index에 매핑될 지 모르니 내부에 가지고 있는 배열의 capacity만큼 다 돌아야 할 거 같아서요. 그렇다면 배열의 capacity는 default인지 아닐지 모르는데 이걸 일일히 확인하고 for문을 돌린다는 것도 이상하고요.)

  1. LinkedList 때도 문의 드린 건데 Set도 보면 toString을 따로 구현체들이 오버라이딩 하고 있지 않고 set.toString()을 찍어봐도 object에서 선언한 toString()을 가리키던데 어떻게 다음과 같이 출력이 될까요 ?

     

    System.out.println(set);

    [20, 10, 30]

  2. 아래 질문헀던 건데 답변을 못 받아서 재질문드립니다.
    HashSet의 toString 코드를 보다 문의사항이 있어 질문합니다.

     

    @Override
    public String toString() {
        return "MyHashSetV2{" +
                "buckets=" + Arrays.toString(buckets) +
                ", size=" + size +
                ", capacity=" + capacity +
                '}';
    }

    다음과 같이 되어 있고 출력을

    MyHashSetV2{buckets=[[Member{id='hi'}, Member{id='JPA'}], [], [], [], [], [], [Member{id='spring'}], [], [], [Member{id='java'}]], size=4, capacity=10}

     

    이렇게 하니까 Arrays.toString(buckets) 부분이

    [[Member{id='hi'}, Member{id='JPA'}], [], [], [], [], [], [Member{id='spring'}], [], [], [Member{id='java'}]]

    이 부분일텐데 따라 들어가면 toString 오버라이딩 된 형태가

     toString(Object[] a) {

    다음과 같고 실제 스트링으로 만드는 코드는

    StringBuilder b = new StringBuilder();
    b.append('[');
    for (int i = 0; ; i++) {
        b.append(String.valueOf(a[i]));

    이거인데요.

    여기서 말하는 a[i]는 LinkedList<Object>[] set의 각각의 인덱스에 위치한 LinkedList<Object> 일텐데 LinkedList나 상위의 List를 타고 들어가봐도 따로 toString 메서드를 살펴볼 수 없습니다. String.valueOf(LinkedList)가 어떻게 동작하는건가요 ? 출력물 보면 각 LinkedList안에 객체로 들어간 member의 toString을 출력하는 거 같기는 한데 LinkedList를 순차척으로 도는 코드를 확인 못하겠습니다.

    감사합니다.

     

답변 2

0

David님의 프로필 이미지

2024. 06. 25. 15:15

안녕하세요. 인프린님, 공식 서포터즈 David입니다.

Set은 Collection을 상속하고, Collection은 Itertable을 상속 받습니다.

Iterable을 상속 받는 것들은 for-each를 통해 반복 가능하게 됩니다.

image

https://github.com/AdoptOpenJDK/openjdk-jdk11/blob/master/src/java.base/share/classes/java/lang/Iterable.java#L42

감사합니다.

0

인프린님의 프로필 이미지
인프린
질문자

2024. 06. 25. 13:57

2번, 3번은 확인했고 1번만 답변 부탁드립니다.