배열
같은 타입의 데이터를 한꺼번에 다룰 수 있는 방법을 배열로 제공
배열은 크게
1차원 배열 (기본 타입 배열, 참조 타입 배열)
다차원 배열 (기본 타입 배열, 참조 타입 배열)
로 나뉜다.
1차원 배열 생성
int[] score = new int[5];
→ 배열 선언과 동시에 new 연산자로 배열 생성
[]는 데이터 타입 뒤, 변수명 뒤에 붙을 수 있다.
즉, int score[] = new int[5] 도 가능
- 배열을 선언한다고 배열이 연속적으로 생성되지 않는다.
- 배열의 첫 번째 요소의 인덱스는 1이 아니라 0
- new 연산자 없이 선언과 동시에 값을 초기화할 수 있다.
int[] score = {50,60,70,80,90};
이렇게 초기화하지 않으면 데이터 타입에 따라 자동으로 값이 할당됨 (최초의 초기값)
- byte, short, int, long, char : 0(0L)
- float, double : 0.0(0.0F)
- boolean : false
- 참조타입 : null
1차원 배열 접근
score[0] = 77;
System.out.println(score[0]);
- 배열 요소에는 선언한 데이터 타입과 동일한 데이터만 저장 가능 (score[0] = 77.8 X)
- 생성된 요소의 크기의 범위 내에서만 접근 가능
int[] score = {50,60,70,80,90};
System.out.println(score[5]); X (6번째 요소는 존재하지 않는다.)
배열의 길이 length
배열명.length
int[] score = (50,60,70,80,90};
System.out.println(score.length);
5개의 요소를 가지고 있으니 5가 출력된다.
(배열의 길이는 상수이므로 변경 시 에러)
배열의 요소의 총합을 구하는데 다음은 비효율적인 코드의 예다.
total = height[0] + height[1] + height[2] + height[3] + height[4]
이를 다음과 같이 바꾼다.
(일반적으로 1차원 배열은 for문을 사용해서 다룬다.)
for(int i = 0; i < height.lenght; i++) {
total += height[i];
}
배열을 역순으로 출력하는데 두가지 방법
1) 다른 배열을 이용해서 복붙 (temp[] 이용)

2) 같은 배열 내에 인덱스의 값을 ‘교환’해서 저장 (temp 이용)

ㄴ for문 이용하여 교환 : 5번만 반복하면 된다. 1→ 10, 2→ 9, 3→ 8, 4→ 7, 6→ 5
temp = num[i]; 1~5값 저장(일시 저장)
num[i] = num[len - 1 - i]; 6~10을 1~5부분에 저장
num[len -1 -i] = temp; 6~10에 일시 저장한 1~5를 저장
오름차순 정렬 예제

Math.random()을 이용하여 오름차순 정렬
Math 클래스의 random 메서드는 0에서 1 사이의 double 타입 실수를 리턴
0.0 <= Math.random() < 1.0
-> 1에서 100의 숫자를 랜덤으로 얻고 싶으면 먼저 모든 항에 100을 곱한다.
0.0 * 100 <= Math.random() * 100 < 1.0 * 100
-> 소수점 이하를 제거하기 위해 int타입으로 변환
(int)0.0 <= (int)Math.random() * 100 < (int)(1.0 * 100)
-> 1을 더해주면 최종적으로 1에서 100 사이의 값 리턴
0 + 1 <= (int)Math.random() * 100 + 1 < (int)(1.0 * 100) + 1
+) 시작 정수와 끝 정수를 다르게 하고 싶다면
int randInt = (int)(Math.random() * (end - begin + 1)) + begin;
→ 20에서 200의 임의의 정수
int randInt = (int)(Math.random() * (200 - 20 + 1)) + 20;
Math.random()을 이용하여 오름차순 정렬

결과

다차원 배열
2차원 배열 선언
- int[][] score;
- int score[][]; score = int[2][3] //2는 1차원 배열 요소 크기, 3은 2차원 배열 요소 크기
두 행렬의 합 구하기

결과

2차원 배열 초기화 예제
arr
2 2 2 2
2 2 2 1
2 2 1 1
2 1 1 1
위와 같이 출력하려면?
1) 2의 개수가 행이 증가할수록 감소
2) 2를 가지는 인덱스 특징(합이 4를 넘지 않는다.)

배열 복사 예제
예상 결과
2 2 2 2
1 2 2 2
1 1 2 2
1 1 1 2
i(열)가 0일 때 j(행)에 1이 없고
[1,0] / [2,0],[2,1] / [3,0],[3,1],[3,2] 에 1이 있다.
즉, i > j이면 1.

2차원 배열 두 대각선 합 구하기
arr[0][0] + arr[1][1] + arr[2][2] + … 우하향 대각선은 두 인덱스 값이 같다
arr[0][4] + arr[1][3] + arr[2][2] + … 우상향 대각선은 두 인덱스 합이 4 (=arr.length - 1)

*2차원 배열에 관련된 문제는 먼저 두 인덱스의 관계로부터 규칙성을 찾아야 한다.
배열 복사
System.arraycopy() 메서드
System.arraycopy(원본배열, 원본시작인덱스, 복사배열, 복사시작인덱스, 복사할개수);
int[] arr1 = {1, 2, 3, 4, 5};
int[] arr2 = new int[5];
System.arraycopy(arr1, 1, arr2, 0, 3);
- arr1을 원본 배열로
- 인덱스 1부터 복사한다 (2,3,4,5)
- arr2에
- 인덱스 0부터
- 3개만 (2,3,4)
결과
arr2 = {2, 3, 4, 0, 0}
이대로는 1차원 배열만 복사 가능
2차원으로는 for문을 이용해준다.
for (int i = 0; i < original.length; i++) {
System.arraycopy(original[i], 0, copy[i], 0, original[i].length);
}
+) 얕은 복사와 깊은 복사
int[][] arr1 = {
{1, 2},
{3, 4}
};
int[][] arr2 = arr1; // 얕은 복사(참조)
arr2[0][0] = 99;
System.out.println(arr1[0][0]); // 99 출력됨!
얕은 복사는 하나를 바꾸면 원본도 바뀜
int[][] arr1 = {
{1, 2},
{3, 4}
};
int[][] arr2 = new int[arr1.length][];
for (int i = 0; i < arr1.length; i++) {
arr2[i] = new int[arr1[i].length]; //반복문 내에서 new 열 할당
System.arraycopy(arr1[i], 0, arr2[i], 0, arr1[i].length);
}
arr2[0][0] = 99;
System.out.println(arr1[0][0]);
깊은 복사(Deep copy)는 값 자체를 완전히 새로운 공간에 복사
행마다 열의 개수가 다를 수도 있으니 깊은 복사 시에 반복문 안에서 행마다 열을 따로 할당
java.util.Arrays 클래스
- equals() : 두 개의 1차원 배열 요소들의 값이 같은지 비교, 같으면 true
- deepequals() : 두 2차원 이상 배열 요소들의 값이 같은지 비교, 같으면 true
- toString() : 1차원 배열 요소들의 값들을 모두 출력
- deepToString() : 2차원 이상 배열 요소들의 값들을 모두 출력
- copyOf() : 배열 요소들의 값들을 복사
- copyOfRange() : 지정한 범위의 배열 요소들의 값들을 복사
단! 범위는 시작 인덱스부터 (마지막 인덱스 - 1)이다!
copyOfRange(arr,0,5) → arr[0] ~ arr[4]를 출력 - sort() : 배열 요소들의 값들을 오름차순으로 정렬
예시)
package sec06.ex01;
import java.util.Arrays;
public class ArraysMethodTest {
public static void main(String[] args) {
int[] arr1 = {10,20,30,40,50};
int[] arr2 = {10,20,30,40,50};
int[] num1 = {10,20,30,40,55};
boolean same = true;
same = Arrays.equals(arr1, arr2);//equals()
if(same == true) {
System.out.println("두 배열은 같습니다.");
} else {
System.out.println("두 배열은 다릅니다.");
}
same = Arrays.equals(arr1, num1);
if(same == true) {
System.out.println("두 배열은 같습니다.");
} else {
System.out.println("두 배열은 다릅니다.");
}
System.out.println();
System.out.println(Arrays.toString(arr1)); //toString()
//copyOf()
int[] arr3 = Arrays.copyOf(arr1, arr1.length); //10,20,30,40,50
int[] arr4 = Arrays.copyOf(arr1, arr1.length -1); //10,20,30,40
//copyOfRange() : **범위는 (시작 인덱스)에서 (마지막 인덱스-1) 까지
int[] arr5 = Arrays.copyOfRange(arr1, 0, 3); //10,20,30
int[] arr6 = Arrays.copyOfRange(arr1, 3, arr1.length); //40,50
int[] arr7 = Arrays.copyOfRange(arr1, 2, 4);
// 50은 출력되지 않는다.
}
}
결과
두 배열은 같습니다.
두 배열은 다릅니다.
[10, 20, 30, 40, 50]
'멀티캠퍼스-JAVA 풀스택 > JAVA' 카테고리의 다른 글
| Java 기초(6)- 객체지향(2) (0) | 2025.11.18 |
|---|---|
| Java 기초(5) - 객체 지향 (0) | 2025.11.12 |
| Java 기초(3) (0) | 2025.10.28 |
| JAVA 기초(2) (1) | 2025.10.23 |
| Java 기초 (1) (0) | 2025.08.19 |