배열이란?
동일한 자료형(Data Type)의 데이터를 연속된 공간에 저장하기 위한 자료구조입니다. 배열은 하나의 블록안에 여러 데이터들을 모아 집합시켜 저장함으로써 데이터를 구조적으로 다루는데 도와줍니다. 배열을 구성하는 각각의 값을 배열 요소(element)라고 하며, 배열에서의 위치를 가리키는 숫자를 인덱스(index)라고 칭합니다.
배열 선언과 초기화
자바(Java)의 배열은 코드를 보면 볼 수 있듯이 배열을 선언할때 미리 공간의 갯수(길이)를 지정해야 합니다. 이는 곧 공간의 제약이 생겨 데이터를 저장하는데 애로사항이 있을 수 있다는 뜻이기도 합니다.
자바스크립트나 파이썬의 배열 같은 경우 유기적으로 늘어나는 특성 때문에 배열에 데이터를 저장하는데 있어 공간을 따진적이 없었기 때문에 적응이 힘들 수도 있습니다. 하지만 사실 자바스크립트의 배열도 공간의 제약이 있으며 단지 프로그래밍 하기 편하게 내부적으로 배열을 늘였다 줄였다 자동으로 해주기 때문에 못느끼는 것일 뿐입니다.
자바는 수동으로 해줘야 한다는 차이점만 있습니다. 이처럼 배열의 길이는 고정되어 있게 프로그래밍 상에서 설계 되었기 때문에 만일 배열의 길이를 처음부터 지정하지 않으면 컴파일 오류가 발생하게 됩니다. 그리고 배열의 타입(int)도 지정해 주어 배열에 저장할 데이터의 자료형을 명시해 주어야 합니다. 이렇게 생성한 배열은 인덱스(index) 번호를 통해 배열을 접근 할 수 있습니다.
배열 선언 방법 2가지
1. 배열 데이터 바로 할당하기
public class TestArray3 {
public static void main(String[] args) {
//배열 선언 생성 할당 동시에
int ages[] = { 22, 26, 24, 28 };
System.out.println(Arrays.toString(ages));
for (int i = 0; i < ages.length; i++) {
if (ages[i] > 0)
System.out.println(ages[i]);
}
}
}
배열을 선언하면서 그 안에 값을 바로 할당하는 방법입니다.
2. 배열 선언 후 값 하나하나 할당하기
public class TestArray1 {
public static void main(String[] args) {
int ages[]; // 배열 선언
ages = new int[4];
ages[0] = 22;
ages[1] = 24;
ages[2] = 26;
ages[3] = 28;
System.out.println(ages.length);
System.out.println(Arrays.toString(ages));
System.out.println("for loop을 이용해 요소 출력");
for (int i = 0; i < ages.length; i++) {
System.out.println(ages[i]);
}
}
}
배열 출력
배열을 출력하는 방식도 2개 알고 있습니다. for문으로 배열 하나하나 출력하는 방식과 Java class Library 의
Arrays.toString(배열이름) 을 사용하는 방식입니다.
그냥 출력을 하게 되면 Heap memory에 저장된 주소값이 나오기 때문에 상기 방식을 사용하는 것입니다. (직접 해보세요.)
밑에 코드에 두 방식 다 작성해 놓았으니 확인해주세요.
public class TestArray1 {
public static void main(String[] args) {
int ages[]; // 배열 선언
ages = new int[4];
ages[0] = 22;
ages[1] = 24;
ages[2] = 26;
ages[3] = 28;
System.out.println("for loop을 이용해 요소 출력");
for (int i = 0; i < ages.length; i++) { //22 24 26 28
System.out.println(ages[i]);
}
System.out.println("Arrays.toString 이용");
System.out.println(Arrays.toString(ages)); //[22, 24, 26, 28]
}
}
배열 복사
이런 기능은 처음 알았습니다. 새로운 배열 변수를 생성할 때 사용하면 좋겠습니다. 기존에 생성된 배열을 건드리지않고 사용하기 좋겠습니다. 또한, 배열을 늘리고 싶은데 기존에 있는 배열의 데이터를 넣고 싶을 때 사용하면 되겠습니다.
복사도 2가지 방법이 있습니다. for문을 돌리면 되겠습니다.
class Test{
public static void main(String[] args) {
int[] arr1 = {10, 20, 30, 40, 50};
int[] arr2 = new int[arr1.length * 2]; // 우선 초기 배열보다 길이가 두배인 새로운 배열을 선언
// 루프문으로 순회하여 복사
for(int i = 0 ; i < arr1.length ; i++) { // arr1의 길이만큼 반복문 실행
arr2[i] = arr1[i]; // arr1배열의 원소값을 순회하며 arr2배열에 저장
}
arr1 = arr2; // 원래의 배열을 가리키고있던 참조변수 arr1이 새로 복사된 arr2 배열을 가리키도록 한다.
}
}
배열정리
배열을 오름차순으로 정리하거나 내림차순으로 정리할 때 사용하면 유용한 Java Class Lib 입니다.
public class TestArray4 {
public static void main(String[] args) {
String[] arr = { "a", "d", "e", "z", "t" };
// 오름차순 정렬
Arrays.sort(arr); // 자기 자신 배열을 정렬 시킴 (정렬된 배열을 반환하는 것이 아니다)
System.out.println(Arrays.toString(arr)); // [a, d, e, t, z]
// 내림차순 정렬
Arrays.sort(arr, Collections.reverseOrder()); // 배열을 내림차순으로 정렬할 때는 Collections 클래스의 reverseOrder() 함수를 사용
System.out.println(Arrays.toString(arr)); // [z, t, e, d, a]
Integer[] arr2 = { 1, 17, 100, 11, 20 };
// 오름차순 정렬
Arrays.sort(arr2); // 자기 자신 배열을 정렬 시킴 (정렬된 배열을 반환하는 것이 아니다)
System.out.println(Arrays.toString(arr2)); // [1, 11, 17, 20, 100]
// 내림차순 정렬
Arrays.sort(arr2, Collections.reverseOrder()); // 배열을 내림차순으로 정렬할 때는 Collections 클래스의 reverseOrder() 함수를 사용
System.out.println(Arrays.toString(arr2)); // [100, 20, 17, 11, 1]
}
}
저기 중간에 Integer 배열로 생성한 이유는 int[]에서는 Collections메소드를 사용하지 못합니다. Collections는 객체에서만 사용이 가능한 메소드입니다.
int[]는 객체가 아닌 Primary type이므로 사용이 불가능한 것입니다
따라서 Integer 타입으로 객체를 생성해야합니다. (꿀팁!)
배열비교
만일 두개의 배열의 구성이 같은지 같지 않은지 비교하기 위해서 일일히 for문으로 순회하여 원소를 비교하는 식으로도 구현을 할 수 있지만, 역시 Arrays.equals() 메소드를 이용하면 간단히 처리할 수 있습니다.
public class TestArray4 {
public static void main(String[] args) {
String[] 역사인물 = { "홍길동", "임꺽정", "박혁거세", "주몽", "고담덕" };
String[] 역사인물2 = { "홍길동", "임꺽정", "박혁거세", "주몽", "고담덕" };
String[] 역사인물3 = { "홍길동", "임꺽정", "박혁거세", "주몽" };
System.out.println("arr1 == arr2 : " + Arrays.equals(역사인물, 역사인물2)); // true
System.out.println("arr1 == arr3 : " + Arrays.equals(역사인물, 역사인물3)); // false
}
}
2D 배열
3년 동안의 월 강우량을 저장하는 데이터나, 중학교 학년 별 반 및 인원을 저장하는 데이터를 저장할 때 사용하는 2차원 배열입니다.
public class Test2DArray {
public static void main(String[] args) {
// 2차원 배열
//3년간 매월 강우량 저장하는 배열
int [][] rains=new int[3][12];
//첫해 1월
rains[0][0]=100;
//마지막 세번째해 12월
rains[2][11]=200;
System.out.println(rains[0]);//첫해 배열 객체 주소값
System.out.println("*********************");
// 오리 중학교 1학년 3반 2학년 2반 3학년 5반의 인원수 저장하는 이차원 배열
int [][] school = new int[3][];
school[0]=new int[3];
school[1]=new int[2];
school[2]=new int[5];
// 3학년 2반의 인원수를 15명으로 할당해본다
school[2][1]=15;
System.out.println(school[2][1]);
}
}
2차원 배열 출력
for문에 for문을 더해서 출력하면 됩니다. 아니면 Arrays.deeptoString 메소드로 실행하면 됩니다.
int[][] arr2 = {
{10,20,30},
{40,50,60},
{70,80,90},
{100,200,300}
};
for(int i = 0 ; i < number.length ; i++) { // 먼저 열 부분을 순회하고
for(int j = 0 ; j < number[i].length ; j++) { // 행 부분을 순회하며 각 원소를 출력
System.out.print(number[i][j]);
}
}
// 1차원 배열 한방 출력
int[] arr = {0,1,2,3,4};
System.out.println(Arrays.toString(arr)); // [0, 1, 2, 3, 4]
// 2차원 배열 한방 출력
int[][] arr2 = {
{10,20,30},
{40,50,60},
{70,80,90},
{100,200,300}
};
System.out.println(Arrays.deepToString(arr2)); // [[10, 20, 30], [40, 50, 60], [70, 80, 90], [100, 200, 300]]
소감
일단 여기까지만 배웠기에 여기까지만 정리하겠습니다. Inpa Dev 님의 글을 보면 객체 배열 관련해서도 내용이 많은데 자린이는 여기까지만 정리하고 다음에 다시 알아보도록 하겠습니다.
배열은 데이터 타입 중에서도 많이 사용하는 데이터 타입이기 때문에 제대로 정리하려고 더 노력했던 것 같습니다. 배열에 대해 더 딥한 이해를 위해 더 많은 자료를 찾아볼 예정입니다.
출처
https://www.opentutorials.org/course/2517/14029
'코딩 개발 > Java' 카테고리의 다른 글
Java - 다형성(Polymorphism) (0) | 2023.04.09 |
---|---|
Java - 상속(Inheritance) (0) | 2023.04.09 |
Java - UML 다이어그램 (0) | 2023.04.05 |
Java - Data Type (0) | 2023.04.05 |
Java - this (0) | 2023.04.03 |