자바 이론

[JAVA] 배열과 리스트의 차이 toString()

easy-6 2025. 4. 2. 06:06

배열과 리스트의 차이점에 대해 공부한 내용이 부족해서 보충하기 위해 작성하게 되었다.

 

1. ArrayList 코드 

import java.util.ArrayList;

public class ArrayListExample{

    
    public static void main(String[] args) {
        ArrayList<String> arr = new ArrayList<String>();
        // 값 추가
        arr.add("Hello");  // arr은 100 번지라고 가정
        arr.add("World");

        ArrayList<String> arr2 = arr; // ArrayList<String> arr2는 arr의 주소를 참조 
        arr2.remove(0); // 100 번지의 0번 인덱스 삭제 
        
        arr.add("Vinatect"); 
        // 변수명은 다르지만 arr2와 arr이 참조하는 값이 같으므로
        // 동일한 객체에 문자열을 추가함 
        ArrayList<String> arr3 = new ArrayList<>(); // new 연산자로 인해서 100 번지가 아닌 새로운 주소를 참조하는 arr3 리스트 생성
        arr3.add("하.. 문제 틀린거 너무 아쉽다...");
        arr.add("null");
        arr.add("하...");

        System.out.println(arr); // [World , Vinatect]이 출력됨
        System.out.println("-------------------");
        System.out.println(arr2); // [World , Vinatect]이 출력됨
        System.out.println(arr3); // [하.. 문제 틀린거 너무 아쉽다..., null, 하...] 출력됨
        
    }
}

 

아래는 위의 코드를 실행 후 결과를 볼 수 있다. 

[그림 1] 출력 결과


❌ 틀린 원인 

1. Java에서 객체를 출력할 때 기본적으로 호출되는 메서드는 toString()

 

2. 배열의 경우 toString()을 호출하면 기본적으로 타입 + 해시코드 형태로 출력된다.

그러나 ArrayList의 경우 toString()이 오버라이딩되어 있어 리스트 내부 요소가 배열의 Arrays.toString()와 같이

[ ] 안에 쉼표와 공백이 포함된 형태로 출력된다는 사실을 몰랐다. 

 

3. 자주 사용하는 for문과 get() 메서드를 통해 2의 내용을 알 지 못하고, toString()이 오버라이딩된 사실을 몰라 주소값이 정답이라고 생각하였다. 

 

리스트 예시

// 예제 1 :: 반복문을 사용해서 가져오는 경우 []와 쉼표가 적용되지 않음
for (String m : arr) {
    System.out.print(m + " ");
}

결과 1 

World Vinatect

 

 

리스트  예시 2 

// 개별 요소 출력
System.out.println(arr3.get(0));

결과 2 

하.. 문제 틀린거 너무 아쉽다...

 

리스트  예시

// ArrayList 자체를 출력
System.out.println(arr);

결과 3 

[World, Vinatect]

 


2. 배열과 리스트의 차이점

배열 예시

import java.util.Arrays;

public class ArrayExample {
    public static void main(String []args){
        int[] array = {1, 2, 3, 4};
        System.out.println("배열을 출력시, 해시코드와 타입으로 이루어진 값이 나옴");
        System.out.println("값 :: " + array);

        // 배열의 원소를 출력하기 위해 Arrays.toString()을 사용해야 함
        System.out.println("배열의 내부 원소: " + Arrays.toString(array));
    }
}

 

결과 1

배열을 출력시, 해시코드와 타입으로 이루어진 값이 나옴
값 :: [I@6d06d69c  // (해시코드와 타입)
배열의 내부 원소: [1, 2, 3, 4]

 


✔️ 배열과 리스트의 차이점을 표로 나타낸 정리 

항목 배열 (Array) 리스트 (ArrayList)
선언 방식 int[] arr = new int[5];
int [] arr = {1,2,3,4,5};
ArrayList<Integer> list = new ArrayList<>();
크기 변경 고정 크기(초기 크기 지정) 동적으로 크기 변경 가능
요소 추가 직접 인덱스에 할당 (arr[i] = value;) .add(value) 사용
요소 삭제 지원하지 않음 (새로운 배열 생성해야 함)
 
.remove(index) 사용 가능
출력 시 기본 형식 [I@해시코드 (객체의 메모리 주소) [요소1, 요소2, 요소3] (쉼표와 공백 포함)
내부 원소 출력 Arrays.toString(배열명) 사용 필요 System.out.println(리스트명)만으로 출력 가능
 

 

✔️ 이해한 내용 정리

1. 객체 출력 시 toString() 메서드가 자동 호출됨

  • 배열의 경우 Object의 toString()을 그대로 사용하여 해시코드와 타입 출력
  • 배열의 요소를 출력하려면 Arrays.toString()을 사용해야 함
  • ArrayList의 경우 toString()이 오버라이딩되어 있어 쉼표와 공백이 포함된 형태로 요소를 출력한다.

2. 객체 참조에 대한 이해

  • ArrayList<String> arr2 = arr; 는 새로운 객체를 만드는 것이 아니라 같은 주소를 공유하는 것이므로 값이 변경되면 arr과 arr2 모두 영향을 받음
  • new ArrayList<>() 를 사용하면 새로운 메모리 공간이 할당됨

'자바 이론' 카테고리의 다른 글

[JAVA] 소수 찾는 로직  (0) 2025.03.26
[Java] non-static 클래스 (내부 클래스)  (0) 2025.03.21
[java]HttpServletRequest  (0) 2024.12.12