[TIL][Java][2023-11-17] 배열
2023. 11. 17. 22:23ㆍTIL/Java
여러 개의 변수를 하나의 통에 모아서 저장하고 싶을 때 배열이라는 변수에 저장한다.
통에 물건을 담듯이 여러 개의 값을 한 번에 넣거나 하나씩 넣고 꺼낼 수 있다.
변수들을 담을 수 있는 통들 중 가장 기본이 되는 통이 배열이라고 할 수 있다.
이 통들은 자료구조 라는 이름으로 불린다.
배열
배열의 선언 ( [ ] )
기본형 변수는 한 개의 값만 변수에 저장할 수 있다면 배열은 여러 개의 변수를 저장할 수 있다.
단, 하나의 배열에는 같은 타입의 변수만 담을 수 있다.
- 한번에 많은 양의 데이터를 다루거나 계산할 때 사용한다.
- 영어로 Array라고 부른다.
- 선언 방법은 두가지가 있다.
- 타입[ ] 변수명;
- 타입 변수명[ ];
// 배열 선언
// 일반적으로 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() 메서드
// 배열이 지원하는 메서드로써 해다 배열의 길이를 응답해준다.
// 배열의 길이는 처음에 선언한 크기를 가지고 있다.
배열의 초기화
- 배열을 초기화 할때는 세 가지 방법이 있다.
- 중괄호를 사용해서 초기화
- for문을 통한 초기화(향상된 for문)
- 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값도 같이 넣어준다.
}
}
'TIL > Java' 카테고리의 다른 글
[TIL][Java][2323-11-28] 배열 - 다차원 배열 (2) | 2023.11.28 |
---|---|
[TIL][Java][2023-11-21] 배열 - String 배열 (0) | 2023.11.21 |
[TIL][Java][2023-11-16] 반복문 - 구구단 출력하기 (0) | 2023.11.16 |
[TIL][Java][2023-11-15] 반복문 - while문 / do-while문, break와 continue (0) | 2023.11.15 |
[TIL][Java][2023-11-14] 반복문 - for문, 향상된 for문 (0) | 2023.11.14 |