배열과 리스트의 차이점에 대해 공부한 내용이 부족해서 보충하기 위해 작성하게 되었다.
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. Java에서 객체를 출력할 때 기본적으로 호출되는 메서드는 toString()
2. 배열의 경우 toString()을 호출하면 기본적으로 타입 + 해시코드 형태로 출력된다.
그러나 ArrayList의 경우 toString()이 오버라이딩되어 있어 리스트 내부 요소가 배열의 Arrays.toString()와 같이
[ ] 안에 쉼표와 공백이 포함된 형태로 출력된다는 사실을 몰랐다.
3. 자주 사용하는 for문과 get() 메서드를 통해 2의 내용을 알 지 못하고, toString()이 오버라이딩된 사실을 몰라 주소값이 정답이라고 생각하였다.
리스트 예시 1
// 예제 1 :: 반복문을 사용해서 가져오는 경우 []와 쉼표가 적용되지 않음
for (String m : arr) {
System.out.print(m + " ");
}
결과 1
World Vinatect
리스트 예시 2
// 개별 요소 출력
System.out.println(arr3.get(0));
결과 2
하.. 문제 틀린거 너무 아쉽다...
리스트 예시 3
// ArrayList 자체를 출력
System.out.println(arr);
결과 3
[World, Vinatect]
2. 배열과 리스트의 차이점
배열 예시 1
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 |