사이먼's 코딩노트

[Java] ArrayList 본문

Java/Java

[Java] ArrayList

simonpark817 2024. 2. 19. 21:36

[ArrayList]

  • 배열 객체를 생성할 때 예를 들어 사람 a사람 = new 사람[3]; 과 같이 생성한다면, 3개의 배열 공간을 가진다는 것을 코드를 통해 알 수 있다.
  • 이는 특정 개수를 알고 있을 때 배열 공간의 크기를 정해주지만, 상황에 따라서 배열 공간을 정하지 않고 원하는 대로 넣고 싶을 때가 있다.
  • 아래는 배열 공간을 최대한 유연하고 융통성있게 지정하는 코드로 총 4단계로 나눠서 작성해보았다.
  • 1 ~ 4단계 코드는 모두 배열 타입의 객체가 생성될 때 마다 고유 번호를 1씩 증가시켜 출력하는 코드이다.

 

[1단계]

public class Main {
    public static void main(String[] args) {
        exam01();
    }
    static void exam01() {
        Article[] articles = new Article[1000];

        int articlesSize = 0;

        articles[0] = new Article();
        articlesSize++;
        articles[1] = new Article();
        articlesSize++;
        articles[2] = new Article();
        articlesSize++;

        for(int i = 0; i < articlesSize; i++) {
            System.out.println(articles[i].id);
        }
    }
}

class Article {
    static int lastId;

    static {
        lastId = 0;
    }
    int id;
    String regDate;
    Article(int id, String regDate) {
        this.id = id;
        this.regDate = regDate;
    }
    Article() {
        this(lastId + 1, "2024-02-15");
        lastId++;
    }
}
  • 1단계는 배열의 공간을 1000개로 지정하여 하나씩 객체를 생성하는 코드이다.
  • Article 객체를 생성할 때마다 각 articles는 id와 regDate가 생성자 때문에 초기 세팅이 된다.
  • Article 클래스를 보면 lastId라는 변수가 있고 앞에 static이 붙었는데 이는 클래스에 하나만 생성되는 변수를 의미한다. 즉, 공공재 지역에 생성되어 서로 다른 객체끼리 같은 lastId값을 가질 수 있다는 뜻이다.
  • static도 생성자를 쓸 수 있고, static 생성자는 프로그램이 시작할 때 딱 한번만 실행이 된다. 여기서는 프로그램이 시작될 때 lastId를 0으로 세팅한다는 뜻이다.
  • Article 클래스에서 하나 더 특이점은 생성자가 두개라는 것이다. 이 생성자들은 각각 가지고 있는 매개변수가 다르기 때문에 두 생성자가 동시에 실행되지 않고 Main 메서드에서 객체 생성 시 인자의 형태에 맞춰 실행된다.
  • Article() 생성자의 역할은 객체를 하나씩 생성할 때마다 lastId값이 1씩 늘어나고 regDate의 값을 모두 '2024-02-15'로 저장한다.
  • Article() 생성자에서 this() 메서드는 다른 생성자한테 일을 미루는 역할을 함으로써 여기선 매개변수를 가진 Article() 생성자에게 일을 미룬다.
  • 그렇게 되면 new Article() 를 통해 객체가 생성될 때마다 lastId는 1씩 증가, regDate는 초기값으로 세팅되고 전역변수 id와 regDate에 해당 값을 저장하게 된다.
  • exam01() 메서드에서는 총 3개의 Article를 생성하여 articles[0]부터 차례대로 id와 regDate를 저장하고있다.
  • 반복문을 통해 보폭을 articles.length로 하게 되면 0부터 999까지 모든 배열의 공간의 id값을 확인하기 때문에 nullPointerException이라는 에러를 보게될 것이다.
  • 이 에러를 없애기 위해서는 articlesSize라는 변수를 만들어서 1000개 중에 생성된 개수만큼만 출력되도록 해줘야한다.

 

[2단계]

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        exam02();
    }
    static void exam02() {
        ArrayList articles = new ArrayList();

        articles.add(new Article());
        articles.add(new Article());
        articles.add(new Article());
        articles.add(new Article());
        articles.add(new Article());

        for(int i = 0; i < articles.size(); i++) {
            Article article = (Article)articles.get(i);
            System.out.println(article.id);
        }
    }
}

class Article {
    static int lastId;
    
    static {
        lastId = 0;
    }
    int id;
    String regDate;
    Article(int id, String regDate) {
        this.id = id;
        this.regDate = regDate;
    }
    Article() {
        this(lastId + 1, "2024-02-15");
        lastId++;
    }
}
  • 2단계는 1단계와 다르게 배열의 크기를 따로 정하지 않고 원하는 대로 넣는 ArrayList()를 사용한 모습이다.
  • ArrayList()를 사용하기 위해서는 코드 상단에 import java.util.ArrayList;를 반드시 import 시켜야한다.
  • 따로 배열의 크기를 지정하지 않고 articles.add를 통해 객체를 계속해서 생성할 수 있다.
  • 1단계와 마찬가지로 Article 생성자 때문에 new Article()로 객체를 생성할 때마다 id 값은 1씩 증가하게 된다.
  • ArrayList() 안에는 객체뿐만 아니라 다른 타입인 문자, 숫자, 참, 거짓 모두 들어갈 수 있다. (articles.add(10), articles("문장") 등)
  • 반복문을 통해 보폭을 articles.size로 하게 되면 추가된 배열의 크기만큼 즉, 0부터 4까지만 반복하여 출력문을 출력할 수 있다.
  • 출력문을 출력하기 전에 각 배열의 위치에 맞게 정보를 가져오기 위해서는 articles.get(i)을 사용한다.
  • Article article로 Article 타입의 article 변수를 만들어 주고 배열 articles의 0번 배열부터 해당 정보를 article에 저장한다.
  • 이 때 articles.get(i) 앞에 (Article)이 붙은 이유는 현재 자바 시스템이 볼 때 articles이 ArrayList()로 생성되었기 때문에 Article 타입말고도 다른 타입이 articles에 저장될 수 있기 때문에 강제 캐스팅을 해준것이다.

 

[3단계]

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        exam03();
    }
    static void exam03() {
        ArrayList<Article> articles = new ArrayList();

        articles.add(new Article());
        articles.add(new Article());
        articles.add(new Article());
        articles.add(new Article());
        articles.add(new Article());

        for(int i = 0; i < articles.size(); i++) {
            Article article = articles.get(i);
            System.out.println(article.id);
        }
    }
}

class Article {
    static int lastId;

    static {
        lastId = 0;
    }
    int id;
    String regDate;
    Article(int id, String regDate) {
        this.id = id;
        this.regDate = regDate;
    }
    Article() {
        this(lastId + 1, "2024-02-15");
        lastId++;
    }
}
  • 3단계는 2단계와 다르게 강제 캐스팅이 필요없이 처음에 객체를 생성할 때 타입을 지정한다.
  • ArrayList<Article> articles = new ArrayList(); 와 같이 작성하면 된다.
  • < >은 제너릭이라고 하며 <Article>을 작성하게 되면 ArrayList에는 Article을 제외한 다른 타입이 절대 들어올 수 없게 된다.
  • 만약에 제너릭 안에 Integer가 들어오면 정수만 들어올 수 있고, String이 들어오면 문자열만 들어올 수 있다.

 

[4단계]

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        exam04();
    }
    static void exam04() {
        List<Article> articles = new ArrayList();

        articles.add(new Article());
        articles.add(new Article());
        articles.add(new Article());
        articles.add(new Article());
        articles.add(new Article());

        for(int i = 0; i < articles.size(); i++) {
            Article article = articles.get(i);
            System.out.println(article.id);
        }
    }
}

class Article {
    static int lastId;

    static {
        lastId = 0;
    }
    int id;
    String regDate;
    Article(int id, String regDate) {
        this.id = id;
        this.regDate = regDate;
    }
    Article() {
        this(lastId + 1, "2024-02-15");
        lastId++;
    }
}
  • 4단계는 3단계와 다르게 타입의 형태를 ArrayList가 아닌 List로 변경하였다.
  • List<Article> articles = new ArrayList(); 와 같이 작성하면 된다.
  • 이 때도 마찬가지로 Article 타입 이외에는 다른 문자, 숫자, boolean이 들어가지는 못한다. (articles.add(10), articles("문장") 등)
  • 1~4단계 중에 앞으로 많이 사용되는 배열의 형태는 4단계일 경우가 많을 것이다.
반응형

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

[Java] 문제풀이(2)  (0) 2024.03.11
[Java] 문제풀이(1)  (0) 2024.03.11
[Java] 종합 문제풀이  (0) 2024.02.19
[Java] 추상 클래스 / 인터페이스  (0) 2024.02.14
[Java] 생성자 문제풀이  (1) 2024.02.14