티스토리 뷰

목차



    반응형
    배열과 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();
            }
        }
    }
    반응형