배열
자료를 순차적으로 관리하는 구조.
예를 들어 정수 20개를 이용한 프로그램을 할 때, 20개의 정수 타입의 변수를 선언해야 한다.
하지만 이러한 방식은 비효율적이고 변수관리도 힘들다.
배열은 동일한 자료형의 변수를 한꺼번에 순차적으로 관리할 수 있다.
배열 선언하기
자료형[] 배열이름 = new 자료형[개수];
자료형 배열이름[] = new 자료형[개수];
int[] arr = new int[10];
int arr[] = new int[10];
배열 초기화하기
int [] studentIDs = new int[]{101,102,103}; //개수 생략
int [] studentIDs = new int[3]{101,102,103}; //이 코드는 오류가 발생한다.
int [] studentIDs = {101,102,103}; //int형 요소가 3개인 배열 생성
배열 사용하기
[] : 인덱스 혹은 첨자 연산자
배열의 위치를 지정하여 자료를 가져옴
모든 배열의 순서는 0부터 시작함
n개 배열은 0부터 n-1 위치까지 자료가 존재
studentIDs[0] = 10; //배열의 첫 번째 요소에 값 10을 저장
배열 초기화하고 출력하기
package com.kh.array;
public class ArrayTest {
public static void main(String[] args) {
//배열을 사용하지 않을 때
//다량의 데이터를 기록하고자 할 때
// int score1 = 90;
// int score2 = 80;
// int score3 = 70;
// int score4 = 60;
// int score5 = 50;
int[] score = {90,80,70,60,50};
// System.out.println(score1);
// System.out.println(score2);
// System.out.println(score3);
// System.out.println(score4);
// System.out.println(score5);
int sum=0;
for(int i=0;i<score.length;i++) {
System.out.println(score[i]);
sum+=score[i];
}
// int sum = score1 + score2 + score3 + score4 + score5;
System.out.println(sum);
}
}
자료형 배열의 기본값
package com.kh.array;
public class ArrayTest2 {
public static void main(String[] args) {
int[] studentIDs = new int[5];
String[] studentIDs_str = new String[5];
for(int i = 0; i<studentIDs.length;i++) {
System.out.println(studentIDs[i]);
}
for(int i = 0; i<studentIDs_str.length;i++) {
System.out.println(studentIDs_str[i]);
}
}
}
int형 배열의 기본값과 string형 배열의 기본값을 출력해보았다.
0
0
0
0
0
null
null
null
null
null
int형 배열의 기본값은 0이고, 객체형 배열의 기본값은 null로 출력이 되었다.
문자 저장 배열 만들기
문자를 저장하는 배열을 만들고, 알파벳을 대입한 후 아스키코드값도 동시에 출력해 보자.
package com.kh.array;
public class CharArray {
public static void main(String[] args) {
char[] alphabets = new char[26];
char ch = 'A';
for (int i = 0; i < alphabets.length; i++, ch++) {
alphabets[i] = ch;
System.out.println(alphabets[i] + "," + (int)alphabets[i]);
}
}
}
결과창
A,65
B,66
C,67
D,68
E,69
F,70
G,71
H,72
I,73
J,74
K,75
L,76
M,77
N,78
O,79
P,80
Q,81
R,82
S,83
T,84
U,85
V,86
W,87
X,88
Y,89
Z,90
객체 배열 만들기
참조 자료형으로 선언하는 객체 배열이다. Book 클래스를 만들고 참조 자료형 배열인 Book 배열을 만들어 보자.
package com.kh.objectarray;
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);
}
}
이제 이 Book 객체를 사용할 BookArray 메인 메소드를 만들어 보자.
package com.kh.objectarray;
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]);//Book이 참조 자료형이라 null이 출력됨.
}
System.out.println("==============================");
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.out.println("==============================");
for (int i = 0; i < library.length; i++) {
System.out.println(library[i]);//객체를 직접적으로 출력하는 방법. 객체의 메모리 주소가 출력이 된다.
}
}
}
배열 복사하기
배열을 복사하는 방법은 두 가지가 있는데 첫 번째는 기존 배열과 배열 길이가 같거나 더 긴 배열을 만들고 for 문을 사용하여 각 요소 값을 반복해서 복사하는 방법이다. 두 번째는 System.arraycopy() 메소드를 사용하는 방법인데 이 메소드의 매개변수는 아래와 같다.
매개변수 | 설명 |
src | 복사할 배열 이름 |
srcPos | 복사할 배열의 첫 번째 위치 |
dest | 복사해서 붙여 넣을 대상 배열 이름 |
destPos | 복사해서 대상 배열에 붙여 넣기를 시작할 첫 번째 위치 |
length | src에서 dest로 자료를 복사할 요소 개수 |
package com.kh.arraycopy;
public class ArrayCopy {
public static void main(String[] args) {
//System 클래스에서 제공하는 arraycopy() 메소드를 이용한 복사.
int[] array1 = {10,20,30,40,50};
int[] array2 = new int[10];
//array1을 array2에 넣되, 0번째 요소 부터 5번째 자리부터 array1.length개를 복사하는~
System.arraycopy(array1, 0, array2, 5, array1.length);
for (int i = 0; i < array1.length; i++) {
System.out.print(array1[i]+ " ");
}
System.out.println();
//자바 새로운 for문 기능. 배열의 모든 요소를 조회한다.
for(int i : array2) {
System.out.print(i + " ");
}
}
}
출력 결과
10 20 30 40 50
0 0 0 0 0 10 20 30 40 50
추가(배열 복사)
//메소드 오버로딩이란? : 메소드 명은 같지만 매개변수(갯수 혹은 자료형)가 다른 메소드들..
//java.lang 패키지는 import할 필요가 없다.
//Arrays 같은 패키지는 java.util이라 import해주어야 한다.
//배열을 복사할 수 있는 좋은 라이브러리. Arrays.copyOf
int[] array3 = Arrays.copyOf(array1, 3);//첫 요소부터 3번째 요소까지(index 0 ~ 2까지)
for(int i:array3)System.out.print(i+" ");
System.out.println();
//clone() 메소드를 이용한 복사. 가장 간단하고 편하다.
int[] array4 = array1.clone();
for(int i:array4)System.out.print(i+" ");
//for문을 사용한 복사. 가장 원시적인 방법.
int[] array5 = new int[array1.length];
for(int i = 0;i<array1.length;i++) {
array5[i] = array1[i];
}
for(int i:array5)System.out.print(i+" ");
실행결과
10 20 30//Arrays.copyOf()
10 20 30 40 50//clone()
10 20 30 40 50//for문 사용
얕은 복사
간단하게 말하면 배열의 주소 값만 복사하는 것이다. 주소가 가르키는 값이 아닌 주소를 복사한다.
위 코드에서 사용했던 Array.copyOf , clone(), for문을 사용한 복사는 전부 다 얕은 복사이다.
아래는 예시 코드이다.
package com.kh.arraycopy;
import com.kh.objectarray.Book;
public class ObjectCopy {
public static void main(String[] args) {
Book[] bookArray1 = {
new Book("태백산맥","조정래"),
new Book("데미안", "헤르만 헤세"),
new Book("어떻게 살 것인가", "유시민")
};
Book[] bookArray2 = new Book[3];
System.arraycopy(bookArray1, 0, bookArray2, 0, 3);
for(Book book : bookArray2) {
book.showBookInfo();
}
bookArray1[0].setBookName("나목");
bookArray1[0].setAuthor("박완서");
System.out.println("========bookArray1========");
for(Book book : bookArray1) {
book.showBookInfo();
}
System.out.println("========bookArray2========");
for(Book book : bookArray2) {
book.showBookInfo();
}
}
}
이렇게 bookArray1을 bookArray2에 복사하고 bookArray1만 값을 변경하였다.
bookArray1와 bookArray2의 값을 출력해 보면 아래와 같이 나타난다.
태백산맥,조정래
데미안,헤르만 헤세
어떻게 살 것인가,유시민
========bookArray1========
나목,박완서
데미안,헤르만 헤세
어떻게 살 것인가,유시민
========bookArray2========
나목,박완서
데미안,헤르만 헤세
어떻게 살 것인가,유시민
깊은 복사
위 코드는 인스턴스 주소 자체를 복사하지만 아래 코드는 값을 복사한다.
//주소 값을 복사하지 않고 주소의 멤버변수를 복사함.
for(int i = 0;i<bookArray1.length;i++) {
bookArray2[i] = new Book();
bookArray2[i].setBookName(bookArray1[i].getBookName());
bookArray2[i].setAuthor(bookArray1[i].getAuthor());
}
배열의 정렬
package com.kh.arraysort;
import java.util.Arrays;
import java.util.Collections;
public class ArraySort {
/*
* 배열 정렬
* - 데이터를 순차적으로 나열하는 과정을 정렬이라 한다. (성적순, 이름순, 나이순, 최신순, 인기순,....)
* - 오름차순(Ascending, ASC)은 작은 데이터부터 큰 데이터로 나열하는 방식이다.
* - 내림차순(Descending, DESC)은 큰 데이터부터 작은 데이터로 나열하는 방식이다.
* - 종류
* - 선택 정렬
* - 버블 정렬
* - 삽입 정렬
* - 퀵 정렬
* - 병합 정렬
* - 쉘 정렬
*/
public static void main(String[] args) {
int[] arr = {2,5,7,1,3};
for(int num : arr) {
System.out.print(num+ " ");
}
System.out.println();
//오름차순으로 정렬
Arrays.sort(arr);
for(int num : arr) {
System.out.print(num+ " ");
}
System.out.println();
System.out.println();
//내림차순으로 정렬
//1. for문을 사용해서 오름차순으로 정렬 된 배열의 값을 반대로 새로운 배열에 대입한다.
//2. Wrapper 클래스를 사용하는 방법
Integer[] integerArray = {new Integer(2),new Integer(5),7,1,3};
//기본 자료형에 해당하는 것들은 모두 지원함. 이것들을 Wrapper 클래스라고 한다.
//int 자료형을 Integer처럼 참조 자료형으로 바꾸는 것을 박스로 감싼다고 해서 Boxing이라고 한다.
//Integer자료형을 int 자료형으로 바꾸는 것을 Unboxing이라고 한다.
Arrays.sort(integerArray,Collections.reverseOrder());
System.out.println(Arrays.toString(integerArray));
System.out.println();
String[] strArr = {"apple", "orange" , "banana", "메론", "레몬"};
System.out.println(Arrays.toString(strArr));
System.out.println();
//오름차순으로 정렬
Arrays.sort(strArr);
System.out.println(Arrays.toString(strArr));
System.out.println();
//내림차순으로 정렬
Arrays.sort(strArr, Collections.reverseOrder());//타입이 참조형인 것만 Collections 사용 가능
System.out.println(Arrays.toString(strArr));
}
}
'교육 | 외부활동 > 이론_JAVA' 카테고리의 다른 글
KH자바수업_8_상속 (0) | 2022.11.14 |
---|---|
KH자바수업_7_다차원 배열, ArrayList (0) | 2022.11.11 |
KH자바수업_5_클래스와 객체 2 (0) | 2022.11.09 |
KH자바수업_4_생성자 (0) | 2022.11.09 |
KH자바수업_3_클래스와 객체 (0) | 2022.11.08 |