JAVA/Do it! 자바 프로그래밍 입문

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

yun.data 2023. 4. 3. 11:05

1. 배열이란?

1-1. 배열

  • 자료가 연속적으로 나열된 자료 구조
  • 자료형이 같은 자료 여러 개를 한 번에 관리 가능

 

 

 

1-2. 배열 선언과 초기화

  • 자료형[] 배열이름 = new 자료형[개수];
  • 자료형 배열이름[] = new 자료형[개수];
    • ex) int[] studentIDs = new int[10];
  • 요소를 특정 값으로 초기화
  • new 자료형[개수] 부분 생략하고 요소만 입력 가능
    • ex) int[] studentIDs = new int[] {101, 102, 103}; (o)
    • ex) int[] studentIDs =  {101, 102, 103}; (o)
  • 배열의 자료형을 선언하고 초기화하는 경우 생략 불가능
  • 개수와 함께 쓰면 오류 발생
    • ex) int[] studentIDs = new int[] {101, 102, 103}; (o)
    • ex) int[] studentIDs = new int[3] {101, 102, 103}; (x)

 

 

 

1-3. 배열 사용

  • 인덱스 연산자 []를 통하여 요소에 값을 넣거나 불러옴
    • ex)  studentIDs[0] = 10;
  • 배열은 0부터 시작
  • 배열의 길이를 나타내는 length 속성을 가짐 (선언 개수와 동일)
  • 배열의 길이와 유효한 배열 요소 개수는 다름
    • ex) 길이 5의 배열에 요소 3개의 값을 저장했을 때, 요소 개수는 3, 길이는 5

 

 

 

1-4. 객체 배열

  • 자료형 변수도 배열로 사용할 수 있음
    • Book 클래스형으로 객체 배열을 생성
    • Book[ ] library = new Book[5];
    • 이때 Book 인스턴스 5개가 생성되는 것이 아니라 인스턴스를 가르키는 주소 값 공간이 생성됨 (각 공간은 null로 초기화)

 

[나 혼자 코딩] 객체 배열 만들어 활용하기(Student, StudentArray)

 

Student.java

public class Student {
	
	private int studentID;
	private String name;
	
	public Student() {}
	
	public Student(int studentID, String name) {
		this.studentID = studentID;
		this.name = name;
	}
	
	public void showStudnetInfo() {
		System.out.println(studentID + ", " + name);
	}
}

 

StudentArray.java

public class StudentArray {
	public static void main(String[] args) {
		Student[] students = new Student[3];
		
		students[0] = new Student(1001, "James");
		students[1] = new Student(1002, "Tomas");
		students[2] = new Student(1003, "Edward");
		
		for(int i=0; i<students.length; i++) {
			students[i].showStudnetInfo();
		}		
	}
}

 

출력 결과

1001, James
1002, Tomas
1003, Edward

 

 

+ StudentID의 값이 자동 부여 되도록 코드를 수정한다면?

 

Student.java

public class Student {
	
	private static int studentIDNum = 1000; // 상수 선언
	private int studentID;
	private String name;
	
	public Student() {}
	
	public Student(String name) {
		studentIDNum++;
		studentID = studentIDNum; // 수정된 코드
		this.name = name;
	}
	
	public void showStudnetInfo() {
		System.out.println(studentID + ", " + name);
	}
}

 

StudentArray

public class StudentArray {
	public static void main(String[] args) {
		Student[] students = new Student[3];
		
		students[0] = new Student("James");
		students[1] = new Student("Tomas");
		students[2] = new Student("Edward");
		
		for(int i=0; i<students.length; i++) {
			students[i].showStudnetInfo();
		}		
	}
}

 

출력 결과

1001, James
1002, Tomas
1003, Edward

 

 

 

1-5. 배열 복사

  • 배열 복사가 필요한 경우
    • 기존 배열과 자료형 및 배열 크기가 똑같은 배열을 새로 만드는 경우
    • 배열의 모든 요소에 자료가 꽉 차서 큰 배열을 만들어 기존 배열에 저장된 자료를 가져오려는 경우

 

  • 배열을 복사하는 방법
    • 기존 배열과 배열 길이가 같거나 더 긴 배열을 만들고 for문을 사용하여 요소 값을 복사
    • System.arraycopy() 매서드 사용
  • System.arraycopy(scr, scrPos, dest, destPos, length)
매개변수 설명
scr 복사할 배열 이름
scrPos 복사할 배열의 첫 번째 위치
dest 복사해서 붙여 넣을 대상 배열 이름
destPos 복사해서 대상 배열에 붙여넣기를 시작할 첫 번째 위치
length scr에서 dest로 자료를 복사할 요소 개수
  • 복사할 대상 배열 전체 길이가 복사할 요소 개수보다 작다면 오류 발생

 

  • 객체 배열 복사 - 얕은 복사(shallow copy)
    • 인스턴스 자체가 아니고 인스턴스 주소 값 복사
    • 객체 배열 복사시 인스턴스를 따로 생성하는 것이 아니라 기존 인스턴스의 주소 값만 복사
    • 하나의 값이 바뀌면 두 배열 모두 영향을 받음

 

  • 객체 배열 복사 - 깊은 복사(deep copy)
    • 인스턴스를 따로 생성한 후 요소 값을 복사
    • 복사한 배열 요소는 기존 배열 요소와 서로 다른 인스턴스를 가리키므로 기존 배열의 요소 값이 변경되어도 영향을 받지 않음

 

 

 

1-6. 향상된 for문과 배열

  • 향상된 for문(enhanced for loop)
    • 자바 5부터 제공
    • 배열의 처음부터 끝까지 모든 요소를 참조할 때 사용하면 편리한 반복문
    • 배열 요소 값을 순서대로 하나씩 가져와 변수에 대입함
    • 초기화와 종료 조건이 없기 때문에 모든 요소가 실행됨
    • ex) for(String name: nameArray) { 반복 실행문; }

 

 

 


2. 다차원 배열

2-1. 다차원 배열

  • 여러 행과 열로 이루어진 다차원 배열 생성 가능
  • 평면이나 공간 개념을 구현하는 데 사용

 

 

 

2-2. 이차원 배열

  • int[] [] arr = new int [2][3]; // 2행 3열의 이차원 배열 선언
  • 배열의 모든 요소를 참조하려면 각 행을 기준으로 열 값을 순회하면 됨
  • arr.length: 행의 개수
  • arr[i].length: 열의 개수

 

 

 


3. ArrayList 클래스 사용하기

3-1. 기존 배열의 단점과 ArrayList

  • 배열은 중간에 있는 요소를 비워둘 수 없음
  • 배열은 사용하는 중 배열 길이를 변경할 수 없음
  • 기존 배열의 단점을 극복 가능한 객체 배열 클래서 ArrayList 제공

 

 

 

3-2. ArrayList 클래스의 주요 메서드

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

 

 

 

3-3. ArrayList 클래스 활용

  • ArrayList<E> 배열이름 = new ArrayList<E>();
    • ex) ArrayList<Book> library = new ArrayList<Book>();
  • 코드 맨 위에 ArrayList를 임포트(import) 해줘야 함
    • import java.util.ArrayList;

 

 

 

[나 혼자 코딩] ArrayList 활용 - 위의 Student 배열을 ArrayList로 변환

 

Student.java 위와 코드 동일

 

StudentArrayList.java

import java.util.ArrayList;

public class StudentArrayList {

	public static void main(String[] args) {
		ArrayList<Student> students = new ArrayList<Student>();

		students.add(new Student("James"));
		students.add(new Student("Tomas"));
		students.add(new Student("Edward"));
		
		for(Student stu : students) {
			stu.showStudnetInfo();
		}
	}
}

 

출력 결과

1001, James
1002, Tomas
1003, Edward