본문 바로가기
IT

[Do it! 자바 프로그래밍 입문] 07 배열과 ArrayList

by csongin 2022. 5. 26.
728x90
배열과 ArrayList
객체 배열 사용하기
다차원 배열
ArrayList 클래스

배열과 ArrayList

배열은 왜 써야 할까?

예를 들어 정수 20개를 이용한 프로그램을 만들 때 20개의 정수 타입의 변수를 선언해야 한다.

비효율적이고 변수 관리가 힘들다.

그러나 배열은 동일한 자료형의 변수를 한꺼번에 순차적으로 관리할 수 있다.

 

배열 선언하기

int[] arr = new int[10]; // 자료형[] 배열이름 = new 자료형[개수]

int arr[] = new int[10]; // 자료형 배열이름[] = new 자료형[개수]

배열 초기화

배열은 선언과 동시에 초기화할 수 있음

배열을 초기화 할 때는 배열의 개수를 명시하지 않음

int[] studentIDs = new int[] {101, 102, 103}; // 개수는 생략함

int[] studentIDs = new int[3] {101, 102, 103}; // 에러 발생

int[] studentIDS = {101, 102, 103}; // int형 요소가 3개인 배열 생성

아무런 초기값이 없이 선언만 한 경우 , 정수는 0, 실수는 0.0, 객체 배열은 null로 초기화됨

 

배열 사용하기

[ ]

인덱스 혹은 첨자 연산자

배열의 위치를 지정하여 자료를 가져옴

모든 배열의 순서는 0부터 시작함

n개 배열은 0부터 n-1 위치까지 자료가 존재

int[] num = new int[] {1,2,3,4,5,6,7,8,9,10}; // num 0 ~ num 9 까지의 자료가 존재

배열의 길이가 유효한 요소 값

배열의 길이의 속성 : length

public class ArrayTest {
    public static void main(String[] args) {
        double[] data = new double[5];
        
        data[0] = 10.0; // 배열 첫 번째 요소에 값 10.0을 대입
        data[1] = 20.0; // 배열 첫 번째 요소에 값 20.0을 대입
        data[3] = 30.0; // 배열 첫 번째 요소에 값 30.0을 대입
        
        for(int i = 0; i < data.length; i++){
            System.out.println(data[i]);
        }
    }
}
/* 출력 값
10.0
20.0
30.0
0.0
0.0
*/

자료가 있는 요소만 출력하려면 크기에 대한 저장을 따로 해야 함

public class ArrayTest1 {
    public static void main(String[] args) {
        double[] data = new double[5];
        
        int size = 0;
        
        data[0] = 10.0; size++;
        data[1] = 20.0; size++;
        data[3] = 30.0; size++;
        
        for(int i = 0; i < size; i++){
            System.out.println(data[i]);
        }
    }
}
/* 출력 값
10.0
20.0
30.0
*/

객체 배열 사용하기

객체 배열 만들기

참조 자료형을 선언하는 객체 배열

// 객체 배열 만들기 1

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);
    }
}

배열만 생성한 경우 요소는 null로 초기화됨

// 객체 배열 만들기2

public class BookArray {

    public static void main(String[] args) {
        Book[] library = new Book[5];
        
        for(int i=0; i<library.length; i++){
            System.out.println(library[i]);
        }        
    }
}
/* 출력 값
null
null
null
null
null
*/

각 요소를 new를 활용하여 생성, 저장하여야 함

// 객체 배열 만들기3

public class BookArray2 {

    public static void main(String[] args) {
        Book[] library = new Book[5];
        
        library[0] = new Book("태백산맥", "조정래");
        library[1] = new Book("데미안", "헤르만 헤세");
        library[2] = new Book("어떻게 살 것인가", "유시민");
        library[3] = new Book("토지", "박경리");
        library[4] = new Book("어린왕자", "생텍쥐페리");
        
        for(int i=0; i<library.length; i++){
            library[i].showBookInfo();
        }
    }
}
/* 출력 값
태백산맥, 조정래
데미안, 헤르만 헤세
어떻게 살 것인가, 유시민
토지, 박경리
어린왕자, 생텍쥐페리
*/

배열 복사하기

기존 배열과 같은 배열을 만들거나 배열이 꽉 찬 경우 더 큰 배열을 만들고 기존 배열 자료를 복사할 수 있습니다.

System.arraycopy(src, srcPos, dest, destPos, length);
/*
src : 복사할 배열 이름
srcPos : 복사할 배열의 첫 번째 위치
dest : 복사해서 붙여 넣을 대상 배열 이름
destPos : 복사해서 대상 배열에 붙여 넣기를 시작할 첫 번째 위치
length : src에서 dest로 자료를 복사할 요소 개수
*/
public class ArrayCopy {

    public static void main(String[] args) {

        int[] array1 = {10 ,20, 30, 40, 50};

        int[] array2 = {1, 2, 3, 4, 5};
        
        System.arraycopy(array1, 0, array2, 1, 4);
                
        for(int i=0; i<array2.length; i++){
            System.out.println(array2[i]);
        }
    }
}
/* 출력 값
1
10
20
30
40
*/

객체 배열의 얕은 복사

배열 요소의 주소만 복사되므로 배열 요소가 변경되면 복사된 배열의 값도 변경됨

public class ObjectCopy2 {
    public static void main(String[] args) {
        Book[] bookArray1 = new Book[3];

        Book[] bookArray2 = new Book[3];
        
        bookArray1[0] = new Book("태백산맥", "조정래");
        bookArray1[1] = new Book("데미안", "헤르만 헤세");
        bookArray1[2] = new Book("어떻게 살 것인가", "유시민");
         System.arraycopy(bookArray1, 0, bookArray2, 0, 3);
        
        for(int i=0; i<bookArray2.length; i++){
            bookArray2[i].showBookInfo();
        }
        
        bookArray1[0].setBookName("나목");
        bookArray1[0].setAuthor("박완서");
        
        System.out.println("=== bookArray1 ===");
        for(int i=0; i<bookArray1.length; i++){
            bookArray1[i].showBookInfo();
        }
        
        System.out.println("=== bookArray2 ===");
        for(int i=0; i<bookArray2.length; i++){
            bookArray2[i].showBookInfo();
        }
    }
}
/* 출력 값
태백산맥,조정래
데미안,헤르만 헤세
어떻게 살 것인가,유시민
=== bookArray1 ===
나목,박완서
데미안,헤르만 헤세
어떻게 살 것인가,유시민
=== bookArray2 ===
나목,박완서
데미안,헤르만 헤세
어떻게 살 것인가,유시민
*/

객체 배열의 깊은 복사

서로 다른 인스턴스의 메모리를 요소로 가지게 됨

public class ObjectCopy3 {
    public static void main(String[] args) {
        Book[] bookArray1 = new Book[3];

        Book[] bookArray2 = new Book[3];
        
        bookArray1[0] = new Book("태백산맥", "조정래");
        bookArray1[1] = new Book("데미안", "헤르만 헤세");
        bookArray1[2] = new Book("어떻게 살 것인가", "유시민");
         
        bookArray2[0] = new Book();
        bookArray2[1] = new Book();
        bookArray2[2] = new Book();
        
        for(int i=0; i<bookArray1.length; i++){
            bookArray2[i].setBookName(bookArray1[i].getBookName());
            bookArray2[i].setAuthor(bookArray1[i].getAuthor());
        }
        
        for(int i=0; i<bookArray2.length; i++){
            bookArray2[i].showBookInfo();
        }
        
        bookArray1[0].setBookName("나목");
        bookArray1[0].setAuthor("박완서");
        
        System.out.println("=== bookArray1 ===");
        for(int i=0; i<bookArray1.length; i++){
            bookArray1[i].showBookInfo();
        }
        
        System.out.println("=== bookArray2 ===");
        for(int i=0; i<bookArray2.length; i++){
            bookArray2[i].showBookInfo();
        }
    }
}
/* 출력 값
태백산맥,조정래
데미안,헤르만 헤세
어떻게 살 것인가,유시민
=== bookArray1 ===
나목,박완서
데미안,헤르만 헤세
어떻게 살 것인가,유시민
=== bookArray2 ===
태백산맥,조정래
데미안,헤르만 헤세
어떻게 살 것인가,유시민
*/

향상된 for 문(enhanced for loop)

배열 요소의 처음부터 끝까지 모든 요소를 참조할 때 편리한 반복문

public class EnhancedForLoop {

    public static void main(String[] args) {


        String[] strArray = {"Java", "Android", "C", "JavaScript", "Python"};
        
        for(String lang : strArray){ // 변수 : 배열
            System.out.println(lang); // 반복 실행문
        }
    }
}
/* 출력 값
Java
Android
C
JavaScript
Python
*/

다차원 배열

2차원 이상의 배열

지도, 게임 등 평면이나 공간을 구현할 때 많이 사용됨

이차원 배열의 선언과 구조

int[][] arr = new int[2][3]; // 자료형, 배열이름, 행 개수, 열 개수

2차원 배열 사용하기

전체 모든 요소를 출력하려면 중첩된 for 문을 사용해야 함

public class TowDimension {


    public static void main(String[] args) {
        
        int[][] arr = {{1,2,3},{4,5,6}}; // 2차원 배열 선언과 동시에 초기화
        
        for(int i=0; i<arr.length; i++){
            for(int j=0; j<arr[i].length; j++){
                System.out.println(arr[i][j]);
            }
            System.out.println();
        }
    }
}
/* 출력 값
1
2
3

4
5
6
*/

ArrayList 클래스

기존 배열은 길이를 정하여 선언하므로 사용 중 부족한 경우 다른 배열로 복사하는 코드를 직접 구현해야 함

중간의 요소가 삭제되거나 삽입되는 경우도 나머지 요소에 대한 조정하는 코드를 구현해야 함

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>( );

사용할 객체를 E 위치에 넣고 ArrayList 메서드를 활용하여 추가하거나 참조할 수 있음

import java.util.ArrayList;

public class ArrayListTest {
    public static void main(String[] args) {

        ArrayList<Book> library = new ArrayList<Book>();
        
        library.add( new Book("태백산맥", "조정래") );
        library.add( new Book("데미안", "헤르만 헤세") );
        library.add( new Book("어떻게 살 것인가", "유시민") );
        library.add( new Book("토지", "박경리") );
        library.add( new Book("어린왕자", "생텍쥐페리") );
        
        for(int i=0; i<library.size(); i++){
    
            Book book = library.get(i);
            book.showBookInfo();
        }
        
        System.out.println();
        System.out.println("=== 향상된 for문 사용 ===");
        for(Book book : library){
            book.showBookInfo();
        }
    }
}
반응형