
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
'JAVA > Do it! 자바 프로그래밍 입문' 카테고리의 다른 글
[Do it 자바 프로그래밍 입문] 07 배열과 ArrayList 연습문제 (0) | 2023.04.03 |
---|---|
[Do it 자바 프로그래밍 입문] 06 클래스와 객체 2 연습문제 (0) | 2023.03.25 |
[Do it 자바 프로그래밍 입문] 06 클래스와 객체 2 (0) | 2023.03.25 |
[Do it 자바 프로그래밍 입문] 05 클래스와 객체 1 연습문제 (0) | 2023.03.24 |
[Do it 자바 프로그래밍 입문] 05 클래스와 객체 1 (0) | 2023.03.24 |