본문 바로가기
Java/CollectionFramework

ArrayList

by GGShin 2022. 5. 3.

Array는 생성 시에 그 크기를 정해야 합니다. 물론 크기를 늘릴 방법이 있기는 하지만 데이터 양이 많을 수록 작업이 쉽지 않게 됩니다. 배열과 유사하면서도 크기를 자동으로 조절해 주는 도구가 바로 ArrayList입니다. 자동으로 크기가 조절되기 때문에 배열 생성 시의 크기를 정하지 않아도 됩니다. 

 

private ArrayList<String> myArrayList = new ArrayList<String>();

 

ArrayList는 다른 타입의 변수들 선언과 모양이 살짝 다른데요, < > 안에 type of Object를 명시해주면 됩니다.

맨 뒤에 ()는 empty constructor인데, ArrayList가 class 이기 때문에 자신만의 constructor를 가지고 있는 것이라고 합니다.

보시다시피 안에 들어갈 데이터 타입만 명시했을 뿐 크기는 정하지 않았죠?

 

사용방법이 일반 array와는 조금 다른데 하나씩 알아보겠습니다. 

 

1. 데이터 추가하기: .add(element )

 

Array에서는 myArray[i] = 9 와 같이 몇번째(i)에 데이터를 저장할 것인지 명시해주어야 했습니다. 하지만 ArrayList에서는 그렇게 할 필요가 없습니다. 

 

1
2
3
4
5
6
7
8
import java.util.ArrayList;
 
public class Main {
    private static ArrayList<String> myArrayList = new ArrayList<String>();
    public static void main(String[] args) {
            myArrayList.add("Hi");
    }
}
cs

 

.add(추가할 데이터) 만 해주면 됩니다. Swift는 .append() 였는데 유사하더라구요! (Swift에선 array list type은 아니고 array에서도 가능합니다.) 

 

일반 Array에서 처럼 index를 지정해서 요소를 추가할 수도 있습니다. 

그럴때는 .add(index, element)로 추가하면 됩니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.ArrayList;
 
public class Main {
    private static ArrayList<String> myArrayList = new ArrayList<String>();
    public static void main(String[] args) {
            myArrayList.add("Hi");
            myArrayList.add("Hola");
            myArrayList.add(0"안녕하세요");
            
            //myArryaList = {안녕하세요, Hi, Hola}
    }
}
 
cs

 

중간 index에 요소를 하나 추가하는 경우에는 원하는 index 뒤의 요소들을 모두 한칸씩 미루고 생긴 공간에 새 요소를 넣게됩니다.

그렇기 때문에 arrayList에 데이터가 많다면 조금 비효율적일 수 있겠죠?

 

 

2. 배열의 길이 확인하기: .size()

 

Array의 .length()에 해당하는 기능은 .size()로 사용하면 됩니다.

For loop을 사용할 때 유용하게 쓰이겠죠?

 

1
myArrayList.size();
cs

 

3. 데이터의 위치 확인하기: .indexOf(데이터)

특정 데이터가 array list의 몇 번째에 위치하고 있는지 알고 싶다면 .indexOf()를 사용하면 됩니다.

만약에 데이터가 존재하지 않는 경우에는 -1 를 return 하게 됩니다. 

 

1
2
myArrayList.indexOf("Hi"); //returns 0
myArrayList.indexOf("Bye"); //returns -1
cs

 

4. 특정한 인덱스의 데이터 읽기: .get(index)

 

특정 위치의 데이터가 무엇인지 알고 싶다면 .get()을 사용하면 됩니다. (3번과는 반대 상황이죠?)

 

1
myArrayList.get(0); //returns Hi
cs

 

5. 특정 인덱스의 데이터 변경하기: .set(index, 변경 데이터)

데이터를 변경할 때는 parameter가 2개 들어갑니다. '바꾸고 싶은 데이터의 index와 대체할 데이터' 이렇게 넣어주면 됩니다. 

 

1
2
int index = myArrayList.indexOf("Hi");
myArrayList.set(index, "Hola");
cs

 

6. 특정 데이터 삭제하기: .remove(index) or .remove(데이터)

데이터를 삭제할 때에는 parameter에 index를 사용하는 방법과 데이터 자체를 사용하는 방법이 있습니다.

 

1
2
int index = myArrayList.indexOf("Hi");
myArrayList.remove(index);
cs

위의 경우는 특정한 인덱스에 있는 데이터를 없앨 것이고, 아래의 경우는 "Hi"를 찾아서 없애줍니다.

1
  myArrayList.remove("Hi");
cs

만약에 Hi가 중복되어 있다면 다 없어질까요? 아닙니다. .remove(Object o)의 경우는 첫번째 Hi를 (여러 Hi 들 중에 가장 앞에 위치한 Hi) 삭제해줍니다!

 

7. 데이터가 포함되어 있는지 확인하기: .contains(데이터)

 

데이터 포함 여부에 따라서 true 또는 false가 반환이 됩니다. 

 

1
2
myArrayList.contains("Hi"); //returns true
myArrayList.contains("Hello"); //returns false
cs

 

8. 새로운 arrayList 참조변수에 original arrayList 내용 모두 넣기: .addAll(original array list)

 

1
2
ArrayList<String> anotherList = new ArrayList<String>();
anotherList.addAll(myArrayList);
cs

또는 새로운 arrayList를 선언/생성하면서 내용을 모두 넣을 수도 있다.

 

1
ArrayList<String> anotherList = new ArrayList<String>(myArrayList);
cs

 

9. ArrayList에서 regular Array (일반 배열)로 변경하기

 

1
2
String[] myArray = new String[myArrayList.size()];
myArray = myArrayList.toArray(myArray);
cs

일반 array로 바꾸고 싶다면 array를 하나 생성하고, 

해당 array를 참조하는 참조 변수에 arrayList를 array 형태로 바꾸어 넣어주기만 하면 됩니다.

대신 .toArray()부분에 parameter로 참조변수가 들어간다는 것만 주의하면 될 것 같습니다. 

 

ArrayList의 기본적인 기능에 대해서 알아보았습니다. 강의를 듣다보니 어떻게 활용하느냐에 따라 활용도가 굉장히 높아질 수 있겠더라구요! 추가적인 사항이 생기면 지속적으로 업데이트 하겠습니다. 감사합니다. ☺️

 

*ArrayList에 대한 추가적인 이야기..

 

ArrayList는 Collection Framework에 속하는 class 중에 하나입니다. 위 도표에서 초록색 상자가 interface이고 주황색 상자가 class인데요, ArrayList는 class이고 List라는 interface를 implement 하고 있습니다. 

 

 

*궁금증🤔

ArrayList 역시 일반 Array와 마찬가지로 reference type입니다. 

ArrayList에 담긴 데이터를 확인하려고 System.out.println(myArrayList); 를 하였더니 Array하고는 다르게 reference 주소가 나오는 게 아니라 실제 배열의 모습이 나오더라구요. 그래서 reference type이 아닌 건가? 싶었는데 결론은 reference type이 맞고 실제로 reference 변수를 하나 더 만든 후에 수정을 해보니 맞다는 사실도 확인했습니다. 

 

1
2
3
4
5
6
7
8
9
10
11
import java.util.ArrayList;
 
public class Main {
    private static ArrayList<String> myArrayList = new ArrayList<String>();
    public static void main(String[] args) {
            myArrayList.add("Hi");
            ArrayList<String> anotherList = myArrayList;
            System.out.println(myArrayList); //[Hi]
            System.out.println(anotherList); //[Hi]
    }
}
cs

 

일반적인 Array 였다면 [Hi] 이렇게 예쁘게 안나오고 주소가 나왔을 텐데 ArrayList는 변환 작업 없이도 바로 우리가 알아볼 수 있는 형태로 보여주더라구요. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.ArrayList;
 
public class Main {
    private static ArrayList<String> myArrayList = new ArrayList<String>();
    public static void main(String[] args) {
        //...
 
        //modification
        int index = myArrayList.indexOf("Hi");
        myArrayList.set(index, "Hi GG");
        System.out.println("After: " + myArrayList); //[Hi GG]
        System.out.println("After: " + anotherList); //[Hi GG]
    }
 
}
cs

 

myArrayList에만 변경을 줬는데도 anotherList도 같이 변경이 되어 나오는 것이 보이시죠?

Reference type이 맞다는 걸 확인했습니다. ㅎㅎ

 

반응형

'Java > CollectionFramework' 카테고리의 다른 글

LinkedList 사용하기  (2) 2022.05.22
Collection framework - Map  (0) 2022.05.15