배열과 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();
}
}
}
'IT' 카테고리의 다른 글
[Java 개발자가 되기 위한 첫걸음 2] 01 메소드 (0) | 2022.05.27 |
---|---|
[Java 개발자가 되기 위한 첫걸음 1] 04 배열 (0) | 2022.05.27 |
[Do it! 자바 프로그래밍 입문] 06 클래스와 객체2 (0) | 2022.05.25 |
[Do it! 자바 프로그래밍 입문] 05 클래스와 객체1 (0) | 2022.05.25 |
[Java 개발자가 되기 위한 첫걸음 1] 03 코드의 흐름 제어 (0) | 2022.05.24 |