자바 ArrayList 클래스 | 자바 입문강좌 23

자바 ArrayList 클래스

객체배열까지 학습을 마쳤다면 여러가지 의문이 생길 수 있습니다.

자바는 객체지향 프로그래밍 언어로 class 라는 복잡한 자료형을 중심으로 코딩 해야합니다. class 를 자료형이라 한 것은 여러 멤버변수를 메소드와 통합했기 때문입니다. 배열의 관점에서 class 는 하나의 자료형으로 볼 수 있습니다.

객체배열(array of objects) 의 경우 그냥 사용하기엔 좀 많이 불편해보입니다. 예를 들어 배열에 새로운 객체를 추가하거나 기존 객체를 삭제해야할 때 이미 크기가 정해져 있는 배열의 경우 자유롭지가 못합니다. 메모리가 낭비되거나 혹은 모자라서 새로운 배열을 만들어야 하는 상황이 생길 수도 있습니다.

그래서 자바에서는 배열을 더 유용하게 사용하기 위해서 JDK에 ArrayList 클래스를 제공하고 있습니다. Generic(제너릭) 프로그래밍을 배울 때 알게 됩니다만, ArrayList는 자바의 Collections Framework 에 속한 클래스로 자바 프로그래머들은 자료구조를 개발하지 않아도 빠르고 안정된 응용프로그램을 개발할 수 있습니다.

Collections Framework (콜렉션 프레임워크) 같이 또 어려운 단어가 등장했습니다. 컴퓨터 프로그래밍을 학습하는 과정은 끓임없는 새로운 용어와 개념을 받아들이는 과정입니다. 아마 이 프로그래밍을 그만두는 날까지 여기서 벗어나기 어려울 겁니다.

이게 상급단계에 가서도 계속 새로운 용어가 나오고 그러니까 평생 공부를 해야합니다. 그래서 프로그래밍에는 Master 가 없다고 합니다.

자 그럼 용기를 내서 새로운 개념을 공부해보겠습니다.

리스트 자료형

리스트 자료형은 아직 다루지 않았는데 간단히 언급하면 프로그래밍에서 리스트(List)는 일반적으로 연결리스트(Linked List)를 의미합니다.

고정된 크기에 인덱스로 정렬된 배열보다 탐색속도는 느리지만 쇠사슬 처럼 연결되어 있어서 중간에 삽입하거나 삭제가 가능한 자료형입니다.

ArrayList 는 탐색속도가 빠른 배열과 자료의 추가, 삭제가 쉬운 리스트의 장점을 결합한 클래스입니다. 자세한 내용은 자료구조와 알고리즘 관련 내용을 참고하는게 좋습니다.

String 객체를 ArrayList 에 사용

String(문자열)은 객체입니다. 문자 하나를 저장하는 기본 자료형인 char 가 있고 문자열을 저장하는 String 이 있어서 String 도 기본 자료형이라 생각하기 쉽지만 String 은 class 입니다. 이는 java.lang 패키지에 포함되 있어서 그간 import 하지 않아도 사용할 수 있었을 뿐입니다.

다음의 예제는 String 객체를 ArrayList 클래스를 사용하여 저장하는 코드입니다.

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<String>();

        arrayList.add("orange");
        arrayList.add("blue");
        arrayList.add("night");

        System.out.println(arrayList);

        arrayList.add(1,"coke");

        System.out.println(arrayList);
    }
}
[orange, blue, night]
[orange, coke, blue, night]

어떤가요? 객체배열을 사용하면서 삽질한 시간들이 있다면 인생의 쾌적함을 느낄 수 있습니다. ArrayList 는 배열과 리스트의 장점을 혼합한 방식으로 처음에 초기화를 할 필요도 없고 새로운 객체를 추가시키기만 하면됩니다.

여기서 ArrayList<String> 이란 새로운 < > 꺽쇄가 등장했습니다. 이게 Generic 프로그래밍인데요. ArrayList 가 저장하는 것은 String class 입니다. 이 String class 를 저장하겠다고 알려줘야 ArrayList 가 그에 맞는 메모리 공간과 사용방식을 준비 할 수 있겠죠? class 마다 멤버변수가 다르고 사용하는 공간이 다르기 때문에 알려줘야 합니다.

제너릭이 이것만 의미하는 것은 아니지만 일단 지금은 이 정도로 이해할 수 있습니다.

ArrayList 를 사용하기 위해서 할일은 class 를 알려주고 ArrayList 도 class로 new 키워드로 메모리에 생성하는 것입니다. ArrayList 는 인스턴스를 생성하여 객체를 관리합니다.

위 예제에서는 ArrayList 인스턴스에 문자열 리터럴(Literal) 객체를 추가하고 println 메소드를 사용해서 현재 ArrayList가 보유하고 있는 요소들을 출력합니다.

add 메소드는 요소를 끝에 추가하는데 인덱스를 사용해서 중간에 요소를 추가했습니다. 인덱스는 여기서도 0부터 시작합니다. 예를들어 인덱스 1을 사용하면 1에 있는 자료를 다음 인덱스인 2로 밀어내고 1의 자리에 들어갑니다.

지금 이렇게 add() 같은 메소드 사용방식을 앞으로 많이 보게 될 겁니다. 자바 언어 뿐만 아니라 다른 주요 컴퓨터 언어에서도 인스턴스.add( ) 처럼 간단한 방식을 사용합니다.

한가지 권장사항은 시간적으로 여력이 있을 때 C언어를 배워두는 것이 좋습니다. 자바에서 이해해야 하는 수많은 설명들의 기초가 C언어에 있습니다. 자바 학습의 어려움은 C언어를 건너뛰고 객체 지행에 바로 들어가버리면서 생략된 내용에 있습니다.

사용자 정의 class를 ArrayList에 저장

String 객체는 사용법이 다소 단순합니다.

이번에는 필드를 두개 갖는 사용자 정의 class 를 ArrayList 에 저장해보겠습니다.

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<myObject> arrayList = new ArrayList<myObject>();

        arrayList.add(new myObject(201, "Police"));
        arrayList.add(new myObject(202, "Firefighter"));
        arrayList.add(new myObject(202, "nurse"));

        System.out.println(arrayList);

        for (int i = 0; i < arrayList.size(); i++) {
            arrayList.get(i).showInfo();
        }

        arrayList.add(0, new myObject(301, "doctor"));

        System.out.println(arrayList);
        
        for (int i = 0; i < arrayList.size(); i++) {
            arrayList.get(i).showInfo();
        }
    }
}
class myObject{
    int id;
    String name;
    myObject(){
    }
    public myObject(int id, String name) {
        this.id = id;
        this.name = name;
    }
    public void showInfo(){
        System.out.println("(id) : " + id);
        System.out.println("(name) : " + name);
    }
}
[com.kay.myObject@7ef20235, com.kay.myObject@27d6c5e0, com.kay.myObject@4f3f5b24]
(id) : 201
(name) : Police
(id) : 202
(name) : Firefighter
(id) : 202
(name) : nurse
[com.kay.myObject@34a245ab, com.kay.myObject@7ef20235, com.kay.myObject@27d6c5e0, com.kay.myObject@4f3f5b24]
(id) : 301
(name) : doctor
(id) : 201
(name) : Police
(id) : 202
(name) : Firefighter
(id) : 202
(name) : nurse

약간 코드가 깁니다. 사실 Java 언어가 객체지향을 철저하게 추구하는 프로그래밍이라 코드가 길어지는 경향도 있습니다. 그런데 막상 내용을 보면 별 내용 없이 길기만 한 코드도 있으니 너무 압박감을 느낄 필요는 없습니다.

보면 객체를 집어넣을 때 add 메소드 안에 (new 생성자()) 형식으로 들어가죠. 이 때 생성자가 반환하는 것은 com.kay.myObject@7cc355be 같은 namespace와 해시값입니다. 즉 객체가 메모리상 어디에 생성되어 있는지 가져온다는 말입니다.

ArrayList<myOject>에서 이 객체를 처리할 충분한 정보를 제공한 상태죠? 참조변수와 객체의 정보가 있으므로 이들을 ArrayList에 엮을 수 있습니다. 그게 ArrayList 인스턴스가 하는 일입니다.

add와 remove 등 레퍼런스는 외부참고문서의 Java Doc 에서 확인할 수 있습니다.

namespace는 각자 인텔리제이에서 프로젝트를 생성할 때 다르게 설정하므로 당연히 다를 수 있고요. 중요한 것은 주소가 각자 다른 인스턴스가 생성되었다는 것 입니다.

요약

자바 ArrayList 클래스를 학습했습니다. 처음 콜렉션 프레임워크(Collections Framework) 챕터에 들어가면 이게 일부러 프로그래밍을 어렵게 만든 것 아닌가 하는 생각이 들 수도 있습니다.

여기서 빡쳐서 나는 적성에 안맞는다 하고 그만두는 사람도 있습니다. 어느 컴퓨터 언어나 그런 포인트가 있는데요. 오히려 그럴 때야 말로 실력을 제대로 늘릴 수 있는 기회입니다.

그 단계를 넘어서면 또 다른 세계가 펼쳐집니다. 그것은 아무리 유명한 강의를 들어도 본인이 자각하지 않으면 의미가 없습니다.

이 강좌도 블로그라는 매체를 사용해서 책이 다루지 못하는 부분을 더 다룰 수 있다는 장점때문에 시작했는데요. 일반적인 책에서 더 잘다룰 수 있는 부분은 최대한 줄이려 하고는 있는데 불완전한 부분이 많습니다.

프로그래밍 학습을 완성시키는 것은 학습자 본인의 의지와 얼마나 많은 실습을 통해 단련을 했냐에 달려있습니다. 입문자들에게는 이 이후의 챕터도 계속 도전적인 내용이 될 것 같은데 어려움이 있어도 용기를 내서 잘 극복하시길 바랍니다.

외부참고문서

자바 ArrayList 클래스 (Java Platform SE 8 ) (oracle.com)

다형성, 자바 ArrayList 클래스의 활용 자바 강좌 8-4

ArrayList in java with example programs – Collections Framework (beginnersbook.com)

자바 ArrayList 클래스 (w3schools.com)

Leave a Comment