배열이란

  • 동일한 자료형의 순차적 자료 구조

  • 인덱스 연산자를 이용하여 빠른 참조가 가능

  • 물리적 위치와 논리적 위치가 동일

  • 배열의 순서는 0부터 시작

  • 자바에서는 객체 배열을 구현한 ArrayList를 많이 사용

ArrayTest.java

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

        int[] arr = new int[10];
        int total = 0;

        for(int i = 0,num = 1; i < arr.length ; i++){ //for로 대입하는 경우
            arr[i] = num++;
        }

        for (int num : arr){
            total += num;
        }//num의 처음부터 끝까지 더하는 for
        System.out.println(total);
        
==================================================================================================

        int[] arr = new int[] {1,2,3,4,5,6,7,8,9,10} ; //직접 대입하는 경우
        int total = 0;

        for (int num : arr){
            total += num;
        }//num의 처음부터 끝까지 더하는 for
        System.out.println(total);
    }
}

배열의 길이 != 요소의 개수

  • 배열을 선언한 개수보다 적은 데이터가 있을 수도 있음
  • .length를 사용하면 실제 데이터가 얼만큼 들어있는지는 모르기 때문에 오류가 나는 경우가 있다
    그경우 count, 요소의 개수에 대한 변수를 따로 두어 개수를 센다
    length가 아닌 count를 사용

문자를 배열로 사용하기

CharArrayTest.java

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

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

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

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

객체 배열 사용하기

  • 기본 자료형의 배열은 선언과 동시에 자료형의 크기만큼 메모리가 할당되지만 객체 배열의 경우 객체의 주소가 들어갈 메모리(4바이트/8바이트)만 할당하고 각 요소의 객체는 생성하여 저장한다

BookTest.java

public class BookTest {

    public static void main(String[] args) {
        Book[] library = new Book[5];

//        for (int i = 0; i < library.length ; i++){
//            System.out.println(library[i]);
//        } 하면 다 널 나옴

        library[0] = new Book("태백산맥1", "조정래");
        library[1] = new Book("태백산맥2", "조정래");
        library[2] = new Book("태백산맥3", "조정래");
        library[3] = new Book("태백산맥4", "조정래");
        library[4] = new Book("태백산맥5", "조정래");

        for (Book book : library){
            System.out.println(book);
            book.showInfo();
        }

    }

}

객체 배열 복사하기

  • System.arrayCopy(src, srcPos, dest, destPos, length) 자바에서 제공되는 배열 복사 메서드
  • 얕은 복사
    객체 주소만 복사되어 한쪽 배열의 요소를 수정하면 같이 수정 됨
    즉, 두 배열이 같은 객체를 가리킴

ObjectCopyTest.java

public class ObjectCopyTest {
    public static void main(String[] args) {
        Book[] library = new Book[5];
        Book[] copyLibrary = new Book[5];
        library[0] = new Book("태백산맥1", "조정래");
        library[1] = new Book("태백산맥2", "조정래");
        library[2] = new Book("태백산맥3", "조정래");
        library[3] = new Book("태백산맥4", "조정래");
        library[4] = new Book("태백산맥5", "조정래");

        System.arraycopy(library, 0, copyLibrary, 0, 5);
        //library에서 0부터 복사해서 copyLibrary에다가 0부터 5개 붙여넣어라
        System.out.println("=== library ===");
        for (Book book : library){
            System.out.println(book);
            book.showInfo();
        }
        System.out.println("=== copy library ===");
        for (Book book : copyLibrary){
            System.out.println(book);
            book.showInfo();
        }
    }
}

그 결과
=== library ===
ch21.Book@64616ca2
태백산맥1, 조정래
ch21.Book@2cb4c3ab
태백산맥2, 조정래
ch21.Book@13c78c0b
태백산맥3, 조정래
ch21.Book@12843fce
태백산맥4, 조정래
ch21.Book@3dd3bcd
태백산맥5, 조정래

=== copy library ===
ch21.Book@64616ca2
태백산맥1, 조정래
ch21.Book@2cb4c3ab
태백산맥2, 조정래
ch21.Book@13c78c0b
태백산맥3, 조정래
ch21.Book@12843fce
태백산맥4, 조정래
ch21.Book@3dd3bcd
태백산맥5, 조정래

완벽히 똑같고 주소까지 같은 것을 알 수 있다

  • 만약 library의 요소 하나를 바꾼다면?
		library[0].setAuthor("박완서");
        library[0].setTitle("나목");

        System.out.println("=== library ===");
        for (Book book : library){
            System.out.println(book);
            book.showInfo();
        }

        System.out.println("=== copy library ===");
        for (Book book : copyLibrary){
            System.out.println(book);
            book.showInfo();
        }
    }

결과
=== library ===
ch21.Book@64616ca2
나목, 박완서
ch21.Book@2cb4c3ab
태백산맥2, 조정래
ch21.Book@13c78c0b
태백산맥3, 조정래
ch21.Book@12843fce
태백산맥4, 조정래
ch21.Book@3dd3bcd
태백산맥5, 조정래

=== copy library ===
ch21.Book@64616ca2
나목, 박완서
ch21.Book@2cb4c3ab
태백산맥2, 조정래
ch21.Book@13c78c0b
태백산맥3, 조정래
ch21.Book@12843fce
태백산맥4, 조정래
ch21.Book@3dd3bcd
태백산맥5, 조정래

주소가 같기 때문에 모두 같이 바뀌어 버린다 = 얕은 복사

  • 같이 바뀌지 않도록 완전히 분리해서 복사하려면 하나하나 새로 생성한 후 복사하면 된다
public class ObjectCopyTest {
    public static void main(String[] args) {
        Book[] library = new Book[5];
        Book[] copyLibrary = new Book[5];
        library[0] = new Book("태백산맥1", "조정래");
        library[1] = new Book("태백산맥2", "조정래");
        library[2] = new Book("태백산맥3", "조정래");
        library[3] = new Book("태백산맥4", "조정래");
        library[4] = new Book("태백산맥5", "조정래");

        copyLibrary[0] = new Book();
        copyLibrary[1] = new Book();
        copyLibrary[2] = new Book();
        copyLibrary[3] = new Book();
        copyLibrary[4] = new Book();

        for (int i = 0; i < library.length; i++){
            copyLibrary[i].setAuthor(library[i].getAuthor());
            copyLibrary[i].setTitle(library[i].getTitle());
        }

        library[0].setAuthor("박완서");
        library[0].setTitle("나목");

        System.out.println("=== library ===");
        for (Book book : library){
            System.out.println(book);
            book.showInfo();
        }

        System.out.println("=== copy library ===");
        for (Book book : copyLibrary){
            System.out.println(book);
            book.showInfo();
        }
    }
}

그 결과
=== library ===
ch21.Book@64616ca2
나목, 박완서
ch21.Book@2cb4c3ab
태백산맥2, 조정래
ch21.Book@13c78c0b
태백산맥3, 조정래
ch21.Book@12843fce
태백산맥4, 조정래
ch21.Book@3dd3bcd
태백산맥5, 조정래
=== copy library ===
ch21.Book@97e1986
태백산맥1, 조정래
ch21.Book@26f67b76
태백산맥2, 조정래
ch21.Book@153f5a29
태백산맥3, 조정래
ch21.Book@7f560810
태백산맥4, 조정래
ch21.Book@69d9c55
태백산맥5, 조정래

다른 주소를 갖고 수정 사항이 반영되지 않은 것을 알 수 있다

2차원 배열 사용하기

  • 자료형 [ ][ ] 배열이름 = new 자료형[행개수][열개수];
  • 자료형 [ ][ ] 배열이름 = {{, ,}, {, ,}} 직접 초기화하는 방법
  • length는 중첩 for문을 이용해서 행을 기준으로 열을 돌리고 다음 행 돌리는 방식을 사용한다
public class TwoDimensionTest {
    public static void main(String[] args) {
        int[][] arr = {{1,2,3}, {1,2,3,4}};

        int i, j;

        for(i = 0 ; i < arr.length ; i++){ //arr.length는 행의 길이

            for (j = 0 ; j < arr[i].length ; j++ ){
                System.out.print(arr[i][j] + ",");
            }
            System.out.println("\t" + arr[i].length); //arr[i].length는 i 행의 열의 길이
        }
    }
}

객체 배열 구현 클래스 - ArrayList

  • 자바 패키지에서 ArrayList 클래스를 제공
  • 기존의 배열 선언과 사용은 배열의 길이를 정하고, 그 요소의 개수가 정한 것보다 커지면 배열을 재할당하고 복사했어야 하고
    배열의 요소를 추가하거나 삭제하면 다른 요소들의 이동에 대해 구현해야한다
  • ArrayList는 객체 배열을 좀 더 효율적으로 관리하기 위해 자바에서 제공하는 클래스
  • 위에서 한 Book 예제를 ArrayList를 이용해서 작성하자
public class ArrayListTest {
    public static void main(String[] args) {

        ArrayList<Book> library = new ArrayList<>();

        library.add(new Book("태백산맥1", "조정래"));
        library.add(new Book("태백산맥2", "조정래"));
        library.add(new Book("태백산맥3", "조정래"));
        library.add(new Book("태백산맥4", "조정래"));
        library.add(new Book("태백산맥5", "조정래"));

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

ArrayList를 활용한 성적 산출 프로그램 실습

  • 1001학번 Lee와 1002학번 Kim, 두 학생이 있습니다.
    Lee 학생은 국어와 수학 2과목을 수강했고, Kim 학생은 국어, 수학, 영어 3 과목을 수강하였습니다.
    Lee 학생은 국어 100점, 수학 50점입니다.
    Kim 학생은 국어 70점, 수학 85점, 영어 100점입니다.
    Student와 Subject 클래스를 만들고 ArrayList를 활용하여 두 학생의 과목 성적과 총점을 출력하세요

  • Student 클래스

public class Student {

    public int studentID;
    public String studentName;

    ArrayList<Subject> subjectList;
    public Student(int studentID, String studentName){
        this.studentID = studentID;
        this.studentName = studentName;

        subjectList = new ArrayList<Subject>();
    }

    public void addSubject(String name, int score) {
        Subject subject = new Subject();
        subject.setName(name);
        subject.setScorePoint(score);

        subjectList.add(subject);
    }

    public void showStudentInfo() {
        int total = 0;

        for (Subject subject : subjectList) {
            total += subject.getScorePoint();
            System.out.println(studentName + "학생의 " + studentName + " 과목의 성적은 " + subject.getScorePoint() + " 입니다.");
        }
        System.out.println(studentName + "학생의 총점은 " + total + "점 입니다.");
    }
}
  • Subject 클래스
public class Subject {

    private String name;
    private int scorePoint;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getScorePoint() {
        return scorePoint;
    }

    public void setScorePoint(int scorePoint) {
        this.scorePoint = scorePoint;
    }
}
  • StudentTest 클래스

public class StudentTest {

	public static void main(String[] args) {
		Student studentLee = new Student(1001, "Lee");
		
		studentLee.addSubject("국어", 100);
		studentLee.addSubject("수학", 50);
		
		Student studentKim = new Student(1002, "Kim");
		
		studentKim.addSubject("국어", 70);
		studentKim.addSubject("수학", 85);
		studentKim.addSubject("영어", 100);
		
		studentLee.showStudentInfo();
		System.out.println("======================================");
		studentKim.showStudentInfo();
	}
}
profile
안녕하세요. Chat JooPT입니다.

0개의 댓글