배열과 ArrayList

Minji Lee·2025년 3월 19일
0

JAVA

목록 보기
10/13

배열

배열: 자료형이 같은 자료 여러 개를 한 번에 관리하는 연속으로 나열된 자료구조

배열 선언과 초기화

자료형[] 배열이름 = new 자료형[개수];
자료형 배열이름[] = new 자료형[개수];
int[] studentIDs = new int[10]; // int형 요소가 10개인 배열 선언
        
int[] studentIDs2 = new int[]{101,102,103}; // 선언+초기화, 개수 생략
// 초기화 동시 진행 시, 개수 쓰면 오류 발생
int[] studentIDs3 = new int[3]{101,102,103}; // 오류 발생
int[] studentIDs4 = {101,102,103}; // 선언+초기화, 개수 생략
        
int[] studentIDs5; // 배열 자료형 선언
// 선언과 초기화 따로 진행시, new int[] 생략 불가
studentIDs5 = new int[] {101, 102, 103}; 

배열 사용 → 인덱스 연산자 []

  • 배열을 처음 선언할 때 사용하는 연산자
  • 배열 요소가 저장된 메모리 위치를 찾아주는 역할
    ex) 배열에서 [i] 인덱스 연산을 하면 i번째 요소의 위치 찾아 해당 위치의 메모리에 값을 넣거나 이미 저장된 값을 가져와서 사용 가능
  • 배열 순서는 0부터

문자 저장 배열 만들기

ex) A부터 Z까지 저장한 후 각 요소 값을 알파벳 문자와 정수 값(아스키 코드 값)으로 출력

char[] alphabets = new char[26];
char ch = 'A';

for(int i=0;i<alphabets.length;i++, ch++){
	alphabets[i] = ch;
}

for(char al : alphabets){
	System.out.println(al+","+(int)al);
}

객체 배열 사용

package array;

public class Book {
    private String bookName;
    private String author;

    public Book() {}
    public Book(String bookName, String author){
        this.bookName = bookName;
        this.author = author;
    }

    public String getBookName(){
        return bookName;
    }
    public void setBookName(String bookName){
        this.bookName = bookName;
    }
    public String getAuthor(){
        return author;
    }
    public void setAuthor(String author){
        this.author = author;
    }
    public void showBookInfo(){
        System.out.println(bookName+","+author);
    }
}
package array;

public class BookArray {
    public static void main(String[] args){
        Book[] library = new Book[3]; // Book 클래스형으로 객체 배열 생성

        library[0] = new Book("태백산맥", "조정래");
        library[1] = new Book("데미안", "헤르만 헤세");
        library[2] = new Book("토지", "박경리");

        for(Book book: library){
            book.showBookInfo();
            /**
             * 태백산맥,조정래
             * 데미안,헤르만 헤세
             * 토지,박경리
             */
        }

        for (Book book : library) {
            System.out.println(book);
            /**
             * array.Book@279f2327
             * array.Book@2ff4acd0
             * array.Book@54bedef2
             */
        }
    }
}

배열 복사하기

System.arraycopy(src, srcPos, dest, destPos, length)

  • src: 복사할 배열 이름
  • srcPos: 복사할 배열의 첫 번째 위치
  • dest: 복사해서 붙여 넣을 대상 배열 이름
  • destPos: 복사해서 대상 배열에 붙여 넣기 시작할 첫 번째 위치
  • length: src에서 dest로 자료를 복사할 요소 개수
int[] array1 = {10, 20, 30, 40, 50};
int[] array2 = {1, 2, 3, 4, 5};

System.arraycopy(array1, 0, array2, 1, 4);;
for(int arr : array2){
  System.out.println(arr);
  /**
  * 1
  * 10
  * 20
  * 30
  * 40
  */
}

객체 배열 복사하기

package array;

public class BookArray {
    public static void main(String[] args){
        Book[] book1 = new Book[3];
        Book[] book2 = new Book[3];

        book1[0] = new Book("태백산맥", "조정래");
        book1[1] = new Book("데미안", "헤르만 헤세");
        book1[2] = new Book("토지", "박경리");
        System.arraycopy(book1, 0, book2, 0, 3);

        for(Book b : book2){
            b.showBookInfo();
            /**
             * 태백산맥,조정래
             * 데미안,헤르만 헤세
             * 토지,박경리
             */
        }
    }
}

객체 배열 얕은 복사

package array;

public class BookArray {
    public static void main(String[] args){
        Book[] book1 = new Book[3];
        Book[] book2 = new Book[3];

        book1[0] = new Book("태백산맥", "조정래");
        book1[1] = new Book("데미안", "헤르만 헤세");
        book1[2] = new Book("토지", "박경리");
        System.arraycopy(book1, 0, book2, 0, 3);

        for(Book b : book2){
            b.showBookInfo();
        }

        book1[0].setBookName("나목"); // book1 배열의 첫 번째 요소 값 변경
        book1[0].setAuthor("박완서");

        System.out.println("=== bookArray1 ===");
        for(Book b1: book1){
            b1.showBookInfo();
        }

        System.out.println("=== bookArray2 ===");
        for(Book b2: book2){
            b2.showBookInfo();
        }
    }
}

  • 객체 배열의 요소에 저장된 값은 인스턴스 자체가 아니고 인스턴스 주소값이므로 객체 배열을 복사할 때 기존 인스턴스의 주소 값만 복사됨

깊은 복사

package array;

public class BookArray {
    public static void main(String[] args){
        Book[] book1 = new Book[3];
        Book[] book2 = new Book[3];

        book1[0] = new Book("태백산맥", "조정래");
        book1[1] = new Book("데미안", "헤르만 헤세");
        book1[2] = new Book("토지", "박경리");

        // 디폴트 생성자로 book2 배열 인스턴스 생성
        book2[0] = new Book();
        book2[1] = new Book();
        book2[2] = new Book();

        for(int i=0;i<book1.length;i++){
            book2[i].setBookName(book1[i].getBookName());
            book2[i].setAuthor(book1[i].getAuthor());
        }

        for(Book b : book2){
            b.showBookInfo();
        }

        book1[0].setBookName("나목"); // book1 배열의 첫 번째 요소 값 변경
        book1[0].setAuthor("박완서");

        System.out.println("=== bookArray1 ===");
        for(Book b1: book1){
            b1.showBookInfo();
        }

        System.out.println("=== bookArray2 ===");
        for(Book b2: book2){
            b2.showBookInfo();
        }
    }
}


다차원 배열

자료형[][] 배열이름 = new 자료형[행개수][열개수]

int[][] arr = new int[2][3]; // 2x3 배열
        
int[][] arr2 = {{1,2,3}, {4,5,6}}; // 배열 선언 및 초기화

ArrayList 클래스 사용하기

기존의 배열은 항상 배열 길이 정하고 시작하므로, 중간에 배열 길이 변경할 수 없어서 코드 수정해야함!
→ 자바는 객체 배열 좀 더 쉽게 사용할 수 있도록 객체 배열 클래스 ArrayList 제공

  • import java.util.ArrayList; 문장 반드시 써주고 사용해야함!

ArrayList 클래스의 주요 메서드

메서드설명
boolean add(E e)요소 하나를 배열에 추가(E는 요소의 자료형)
int size()배열에 추가된 요소 전체 개수 반환
E get(int index)배열의 index 위치에 있는 요소 값 반환
E remove(int index)배열의 index 위치에 있는 요소 값 제거하고 그 값 반환
boolean isEmpty()배열이 비어있는지 확인

ArrayList 클래스 활용

ArrayList<E> 배열이름 = new ArrayList<E>();

package array;

import java.util.ArrayList;

public class BookArray {
    public static void main(String[] args){
        ArrayList<Book> library = new ArrayList<Book>();

        library.add(new Book("태백산맥", "조정래"));
        library.add(new Book("데미안", "헤르만 헤세"));
        library.add(new Book("토지", "박경리"));

        for(Book book: library){
            book.showBookInfo();
        }
    }
}

0개의 댓글