Array (배열)
같은 자료형을 저장하는 데이터의 집합으로 즉 변수들을 모아놓은 집합입니다.
예시
int[] nums = new int[10];
nums[0] = 10;
nums[1] = 20;
nums[2] = 30;
System.out.println(nums[0]);
System.out.println(nums[1]);
System.out.println(nums[2]);
System.out.println(nums[3]);
// ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 10
// 길이 10인데 10을 넣어 오류
// System.out.println(nums[10]);
// 배열탐색 > for문 사용
for (int i = 0; i < nums.length; i++) {
System.out.printf("nums[%d] = %d\n", i, nums[i]);
}
}
처음에 객체 선언 int[] nums = new int[10]; 이라는 것을 하였는데
int형의 자료형을 사용하는 배열 길이 10 짜리의 배열을 만들겠다 선언을 한 것이다
( int[] nums3 = { 95, 88, 67, 89, 64 }; 그냥 이렇게 바로 해도 된다. )
우선 자바에서 배열 번호는 0부터 들어가며
위 처럼 10을 선언하면 0 1 2 3 4 5 6 7 8 9 까지의 방이 생성된다고 생각하면 된다
즉 10번에 어떤 숫자를 넣겠다고 작성하게 되면 에러가 발생한다.
그리고 배열의 빈 자리는 0으로 출력된다 (String으로 선언하면 null이 나온다)
또한 for문에서 볼 수 있듯이 0부터 nums 배열의 길이 (length) 보다 작을 때라 선언했기 때문에 정상적으로 동작이 가능하다 (만약 = 을 넣을 시 에러가 발생한다. (0부터 9까지 이므로 ) )
배열 복사
배열의 복사에는 2가지가 있다
- 얕은 복사 (Shallow copy)
- 주소값만 복사하여 side effect가 발생함
- 깊은 복사 (Deep copy)
- 실제 배열을 복사하여 side effect 발생 안 함
int[] nums = new int[3];
nums[0] = 10;
nums[1] = 20;
nums[2] = 30;
int[] copy = new int[3];
copy = nums;
for (int i = 0; i < nums.length; i++) {
copy[i] = nums[i];
}
nums[0] = 100;
System.out.println(copy[0]);
}
깊은 복사 예시
int[] nums = new int[3];
nums[0] = 10;
nums[1] = 20;
nums[2] = 30;
int[] copy = new int[3];
for (int i = 0; i < nums.length; i++) {
// 방과 방끼리의 복사 . 요소끼리의 복사
// int = int
copy[i] = nums[i]; // [i]를 통해 실제 넣는 위치를 작성하여 깊은 복사가 동작함
}
nums[0] = 100;
System.out.println(copy[0]);
서로 다른 값이 출력이 된다 .
배열 출력
배열을 그냥 print로 배열 이름을 작성하면 @가 포함된 이상한 숫자들이 출력되는데 이는 Heap의 주소값이다 (배열은 참조형이므로..)
그러므로 Arrays 클래스를 이용하여 출력해야한다.
예시
int[] nums = new int[3];
nums[0] = 10;
nums[1] = 20;
nums[2] = 30;
System.out.println(nums); // 쓸모없음
printArray(nums);
System.out.println();
System.out.println(Arrays.toString(nums)); // for문을 안쓰고 똑같은 형태로 가능 . dump (덤프)
}
public static void printArray(int[] nums) {
for (int i = 0; i < nums.length; i++) {
System.out.printf("%3d", nums[i]);
}
}
첫 번째 출력내용은 앞에서 말한 그냥 print에 집어넣게 되는 경우엔 이렇게 주소값이 출력이 되며
두 번째는 for문을 통해 자리마다 하나씩 출력한 결과
세 번째는 toString이라는 Arrays 클래스를 이용해 출력한 결과이다
for를 통해 한자리씩 반복문으로 뽑아도 되며
toString으로 뽑아도 되는데 그냥 toString은 한 줄이면 되므로 특이한 상황이 아니면 이걸 쓰자;
정렬
배열의 출력 결과를 정렬하여 출력하고 싶으면 직접 정렬 알고리즘들 퀵 , 버블, 선택 등등의 알고리즘을 사용해도 되지만 sort 라는 Arrays 클래스를 이용해도 된다 ( 상황에 따라 최적의 알고리즘이 다르므로 정확히 정하기는 어렵다..)
예시
String[] names = { "홍길동", "아무개", "테스트", "유재석", "강아지", "고양이", "도깨비", "박명수", "조세호", "병아리" };
for (int i = 0; i < names.length - 1; i++) {
for (int j = 0; j < names.length - 1 - i; j++) {
if (names[j].compareTo(names[j + 1]) > 0) {
String temp2 = names[j];
names[j] = names[j + 1];
names[j + 1] = temp2;
}
}
}
System.out.println(Arrays.toString(names));
compareTo라는 비교 함수를 통해 직접 정렬을 해도 되지만
마지막 부분에 그냥
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));
이렇게 두 줄 적으면 정렬이 된다. ( 아직 올리지 않았지만 Lambda , 오버라이딩, Comparator 등등을 이용하여 자세한 정렬을 할 수 있음 )
참고로 Arrays.sort는 정렬의 대상에 따라 다른 정렬 알고리즘을 사용합니다 ( 추후 정리 예정)
배열 조작
배열 안에 숫자를 삽입 또는 삭제를 할 때 중간 값을 삭제하거나 중간에 값을 넣고 싶을 땐 배열을 조작하여야 한다. (그냥 귀찮으면 ArrayList 써도 상관은 없습니다... )
삽입 예시
int[] nums = { 1, 2, 3, 4, 5 };
int index = 1;
int value = 9;
System.out.println("nums[0] = "+nums[0]);
System.out.println("nums[3] = "+nums[3]);
System.out.println(Arrays.toString(nums));
for (int i = nums.length - 2; i >= index; i--) {
// System.out.println(i);
nums[i + 1] = nums[i];
System.out.println(Arrays.toString(nums));
}
nums[index] = value;
System.out.println(Arrays.toString(nums));
System.out.println("nums[0] = "+nums[0]);
System.out.println("nums[3] = "+nums[3]);
배열 안에 1,2,3,4,5 를 넣은 뒤 배열 1번 자리에 9라는 숫자를 넣고 싶어 자리 위치 index는 1 , 들어 갈 값 value 는 9를 넣은 뒤
nums[ i+1 ] = nums[i] 를 통해 오른쪽으로 한 칸 씩 밀어 둔 뒤
해당 위치에 9를 넣고
배열 자리는 5개밖에 없으므로 제일 끝에 있던 5를 배열에서 최종적으로 버리면서
1 9 2 3 4 를 출력하게 된다.
삭제는 그냥 반대로 움직이면 된다
int[] nums = { 1, 2, 3, 4, 5 };
int index = 1;
System.out.println(Arrays.toString(nums));
for(int i=index; i<=nums.length-2; i++) { //왼쪽으로 이동
nums[i] = nums[i+1];
}
nums[nums.length-1] = 0; //배열 마지막을 0으로
System.out.println(Arrays.toString(nums));
i 에 i+1 값으로 반대로 움직이면 된다
'java' 카테고리의 다른 글
자바의 기본 성질 (1) | 2024.02.14 |
---|---|
자바의 String 클래스 (2) | 2024.01.29 |
자바의 While문 (0) | 2024.01.28 |
자바의 탈출 그리고 for 무한루프 (0) | 2024.01.23 |
자바의 for문 (0) | 2024.01.22 |