brunch

You can make anything
by writing

C.S.Lewis

by 홍기린 Jul 19. 2024

Java에서 Array랑 List, 뭐가 다른거지?

JAVA 자료형에 대하여 (feat.프론트엔드 연쇄질문마)

* 줄곧 javascript로만 개발한 나는 요즘 java를 배우면서 이제서야 제대로 프로그래밍의 세계에 입문하는 느낌이다. Java에서 자료형을 배우고 있는데, 다 익숙해보여서 만만한 호수인줄 알았다. 하지만 알고 보니 엄청 깊은 바다인 느낌. 질문이 꼬리에 꼬리를 물고 공부를 하다 보니, 좀 정리를 하자 싶어서 글로 남겨본다.




Array? 그냥 배열 아니야?



1. 배열(Array) 선언하는 방법

일단, Array를 선언하는 모습을 보자. 기존 자바스크립트에서 배열을 선언할때의 모습과 가장 유사하다고 볼수 있다.

// Javascript
let numbers = [ ]
const animals = [ 'cat', 'dog', 2, { name: "개똥이", age: 12 } ]


// JAVA
int[] numbers = new int[5]
String[] 

단, javascript와의 차이점이라고 한다면, 다음과 같은 기본 특징이 있다.


자료형 선언 : 선언한 자료형에 맞는 자료만 넣을 수 있다. int[] 면, int(정수)만 넣을 수 있다. 

배열의 불변성 : 변수를 선언할 때 미리 크기가 정해진다. new int[5]면 정수 5개만 받을 수 있는 배열이라는 뜻이다. 크기는 처음 결정되면 불변하다. 




2. 뭐든지 다 Array로 만들 수 있다 : 기본 타입이든지, 참조형 타입이든지.

자료형 뒤에 "[]"만 붙여주면 그냥 배열Array가 된다.



기본 타입 배열 선언

: byte, short, int, long, float, double, char, boolean 이렇게 소문자로 시작하는 것들

int[] numbers = new int[5];
char[] characters = new char[5];
boolean[] flags = new boolean[3];
int[] numbers2 = { 1, 2, 3, 4, 5, 6, 7 } // 선언과 할당을 동시에. 크기는 7.
boolean[] codes = { true, false, false, true } // 선언과 할당을 동시에. 크기는 4.


참조 타입 배열 선언

: String, Object, Integer같은 클래스 혹은 List나 Map같은 인터페이스 참조형 타입

String[] names = new String[10];
String[] words = { "안녕하세요", "고맙습니다", "사랑합니다" }
Integer[] numbers = new Integer[4];
List<Integer>[] listOfScores = new List[10];


사용자 정의 클래스 타입 배열 선언 :

class Person {
     String name;
     int age;
}
Person[] peopleArray = new Person[3];





3. 기본 동작 및 가능한 연산들

이 또한 자바스크립트와 매우 유사하다.


- length : 배열의 길이를 알 수 있다.

int[] numbers = { 9, 9, 9, 9, 9 }
System.out.println(numbers.length) // 출력: 5

- sort : 정렬할 수 있다.

int[] numbers = {5, 2, 8, 1, 9};
Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers));  // 출력: [1, 2, 5, 8, 9]

- toString : 배열을 문자열로 변환

int[] numbers = {1, 2, 3, 4, 5};
System.out.println(Arrays.toString(numbers));  // 출력: [1, 2, 3, 4, 5]

- fill : 배열을 특정 값으로 채운다.

int[] numbers = new int[5];
Arrays.fill(numbers, 10); 
System.out.println(Arrays.toString(numbers)); // 출력: [10, 10, 10, 10, 10]

- 인덱스를 통한 요소 접근

int[] numbers = { 10, 20, 30, 40, 100 }
System.out.println(numbers[4]) // 출력: 100

- 인덱스를 통한 요소 수정

int[] numbers = {1, 2, 3, 4, 5};
numbers[2] = 10;






그럼 List는 뭐야? Array랑 뭐가 다르지?



기본 정의

Array : 고정된 크기같은 타입 요소들의 연속된 집합

List 순서가 있는 요소의 집합을 나타내는 인터페이스(Interface)

// Array
int[] numbersArray = new int[5];


// List
List<Integer> = new ArrayList<>();



메모리 사용

Array : 메모리 사용이 효율적이다.

List : 메모리 사용량이 Array보다 많다.



크기 변경

Array : 크기가 고정. 불변하다.

List : 크기가 가변적이다.

// Array
int[] numbers = new int[10];
System.out.println(numbers.length) // 10



// List
List<String> names = new ArrayList<>();

names.add("Eric")
names.add("Hong")
System.out.println(names.size()) // 2

names.remove(0)
System.out.println(names.size()) // 1
System.out.println(names.get(0)) // 출력: "Hong"



담을 수 있는 자료형

Array : 모든 자료형 가능

List : 참조형 타입만 가능하다.

List<String> names; // (O)
List<Integer> numbers; // (O)
List<int> numbers; // (X)
List<boolean> flags; // (X)



요소 추가 및 접근

Array : 인덱스로 빠르게 접근할 수 있다. 하지만 요소를 추가하고 삭제하기가 비효율적이다.

List : 요소를 추가하고 삭제, 검색하는 등의 다양한 메소드를 제공한다. (add, remove 등등)




결론


Array는 이미 크기가 고정되어 있는, 가볍고 기본적인 연산이 필요할 때, 컴파일 단계에서 결정되는 배열을 정의할 때 사용하면 좋고 List는 런타임 중에 동적으로 연산이 가능하고 가변적이며 다양한 조작이 필요할 때 쓰는 것이 좋다. 

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari