[TIL][Java][2023-11-17] 배열

2023. 11. 17. 22:23TIL/Java

여러 개의 변수를 하나의 에 모아서 저장하고 싶을 때 배열이라는 변수에 저장한다.

에 물건을 담듯이 여러 개의 값을 한 번에 넣거나 하나씩 넣고 꺼낼 수 있다.

변수들을 담을 수 있는 통들 중 가장 기본이 되는 통이 배열이라고 할 수 있다.

들은 자료구조 라는 이름으로 불린다.

 

 

 

배열

 

배열의 선언 ( [ ] )

기본형 변수는 한 개의 값만 변수에 저장할 수 있다면 배열은 여러 개의 변수를 저장할 수 있다.

단, 하나의 배열에는 같은 타입의 변수만 담을 수 있다.

 

  • 한번에 많은 양의 데이터를 다루거나 계산할 때 사용한다.
  • 영어로 Array라고 부른다.
  • 선언 방법은 두가지가 있다.
    1. 타입[ ] 변수명;
    2. 타입 변수명[ ];

 

// 배열 선언
// 일반적으로 1번방식을 사용한다.


// 1번 선언방식

int[] intArray;    // 정수 배열
long[] longArray;
double[] doubleArray;  // 실수 배열 
char[] charArray;  // 문자 배열
String[] stringArray; // 문자열 배열



// 2번 선언방식

int intArray[];    // 정수 배열
long longArray[];
double doubleArray[];  // 실수 배열 
char charArray[];  // 문자 배열
String stringArray[]; // 문자열 배열

 

 

 

 

 

배열의 생성 (new [ ])

 

배열(Array)은 참조형 변수들처럼 new를 통해서 생성하며 대괄호 안에 크기를 지정해 준다.

 

  • 생성된 배열은 각 요소마다 순번이 존재한다.
  • 순번은 0부터 시작한다.
  • 배열은 생성될 때 각 타입별 초기값으로 초기화 되어 채워진다.
    • int는 0, boolean은 false, String은 null 등..
  • 배열은 참조형 변수이기 때문에 실제 값을 담지않고 실제값의 주소를 저장하고 있다.

 

// 배열 생성
//배열 생성후 초기화하면 배열의 주소가 할당된다.

int[] intArr = new int[3]; // 초기값 {0, 0, 0}
boolean[] boolArr = new boolean[3]; // 초기값 {false, false, false}
String[] strArr = new String[3]; // 초기값 {"", "", ""}
		

//배열 선언만 해놓고 나중에 초기화를 시킬수도 있다.

int[] intArr2;
intArr2 = new int[3]; // 초기값 {0, 0, 0}

 

 

 

 

 

배열 순회

 

배열안에 담겨있는 변수들을 하나씩 꺼내서 사용하는 것을 순회라고 한다.

 

  • 배열의 값을 하나 뽑아서 조회하는 방법
    • 배열에는 순번이 있고 해당 순번을 통해 하나의 값을 조회할 수 있다.
    • 해당 배열 뒤에 순번을 대괄호로 감싸서 명시해주면 된다.
// 배열 단건조회

int[] intArr = new int[3]; // 모두 0으로 초기화된 사이즈3의 배열 생성

// 배열에서 2번째 값을 출력해보기. (0부터 순번이 시작하므로 2번째 순번은 1)
System.out.println(intArr[1]);  

// 출력
0

 

  • 배열을 순회하는 방법은 반복문을 사용하는것이 가장 일반적이다.
  • 단건 조회때처럼 대괄호 안에 반복문 순번값 i를 넣어주면 된다.
//길이가 3인 정수배열 선언
int[] intArr = new int[3];

// 배열이 초기화된 값을 출력해보기
for(int i=0; i<intArr.length; i++) {
	System.out.println(intArr[i]);
}

// 출력
0
0
0

// .length() 메서드
// 배열이 지원하는 메서드로써 해다 배열의 길이를 응답해준다.
// 배열의 길이는 처음에 선언한 크기를 가지고 있다.

 

 

 

 

 

배열의 초기화

 

  • 배열을 초기화 할때는 세 가지 방법이 있다.
    1. 중괄호를 사용해서 초기화
    2. for문을 통한 초기화(향상된 for문)
    3. Arrays.fill 메서드를 사용한 초기화

 

// 배열 초기화 

import java.util.Arrays; // Arrays 클래스 import

public class Main {

	public static void main(String[] args) {
		//1. 중괄호를 사용한 초기화
		int[] intArr = {1, 2, 3, 4, 5};
		String[] strArr = {"a", "b", "c", "d"};

		//2-1. for문을 통한 초기화
		for (int i=0; i<intArr.length; i++) {
			intArray[i] = i;
		}

		//2-2. 향상된 for문을 통한 초기화
		for (int i : intArray) {
			System.out.print(i); // 01234
		}

		//3. Arrays.fill을 통한 초기화
		Arrays.fill(intArr, 1); // 배열의 모든 값을 1로 초기화

		for (int i : intArray) {
			System.out.print(i);  // 11111
		}
	}
}

// 출력
01234
11111

 

 

 

 

 

배열의 복사

 

  • 얕은 복사
    • 배열은 참조형 변수이기 때문에 실제값이 아닌 실제값의 주소값을 가지기 때문에 대입 연산자를 사용해서 복사를 하게 되면 주소값만 복사가 된다.
    • 이렇게 주소값만 복사되고 실제값은 하나로 유지되는 것을 얕은 복사라고 한다.
// 얕은 복사

int[] a = { 1, 2, 3, 4 };
int[] b = a; // 얕은 복사

b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정했습니다. (1 -> 3)

System.out.println(a[0]); // 출력 3  <- a 배열의 0번째 순번값도 3으로 조회된다.

 

 

  • 깊은 복사
    • 얕은 복사가 아니라 새로운 배열을 똑같이 만들고 싶을 때 깊은 복사를 한다.
    • 깊은 복사는 결국 실제 값을 가지고 있는 배열의 기본형 값을 꺼내 복사해 주면 된다.
    • for문을 통해 하나씩 꺼내서 복사해주는 방법과 여러 메서드를 사용하는 방법이 있다.
// for문을 사용한 깊은 복사

int[] a = { 1, 2, 3, 4 };
int[] b = new int[a.length]; 

for (int i=0; i<a.length; i++) {
    b[i] = a[i]; // 깊은 복사
}

b[0] = 3; // b 배열의 0번째 값을 3으로 수정(1 -> 3)

System.out.println(a[0]); // 출력 1 <- 깊은 복사를 했기때문에 a 배열은 그대로 유지

 

// 깊은 복사 메서드

// 1. clone() 메서드
int[] a = { 1, 2, 3, 4 };
int[] b = a.clone();

// 하지만, clone() 메서드는 2차원이상 배열에서는 얕은 복사로 동작한다.


// 2. Arrays.copyOf() 메서드
import java.util.Arrays;

public class Main {
	public static void main(String[] args) {
		
		int[] a = { 1, 2, 3, 4 };
		int[] b = Arrays.copyOf(a, a.length); // 배열과 함께 length값도 같이 넣어준다.
	}
}