배열

같은 타입의 데이터를 한꺼번에 다룰 수 있는 방법을 배열로 제공
배열은 크게
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

+ Recent posts