- 빈 배열의 예외 처리
- 배열이 비어 있는 경우(null)를 체크하는 조건문은 반드시 실행 코드보다 위에 작성해야 한다.
- 예를 들어:
if (arr == null || arr.length == 0) { System.out.println("배열이 비어 있습니다."); }
- 레퍼런스 타입과 원시 타입
- 원시 타입(Primitive Type): int, boolean, char 등은 실제 값을 저장.
- 레퍼런스 타입(Reference Type): String, 배열, 클래스 등은 값이 아닌 메모리 주소를 저장.
- 예: String str = "java";는 문자열 "java"의 주소를 저장.
- 초기화 시 기본값:
- String: null
- Boolean: false
- 배열: 선언하면 null, 생성하면 해당 타입의 기본값.
- 배열의 특징
- 배열에는 한 가지 타입의 값만 저장 가능.
- 배열의 크기는 고정. 요소 추가 시 새 배열을 생성해야 함.
- 배열.length는 크기를 나타내며, 메서드가 아니라 값이라 소괄호 ()를 붙이지 않음.
- 깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy)
- 깊은 복사: 배열의 값을 복사하여 새로운 메모리 공간에 저장.
- 얕은 복사: 배열의 주소값만 복사하여 동일한 메모리를 참조.
- 문자열과 배열
- 문자열은 수정 불가능(Immutable):
- 문자열 수정 시 새로운 문자열 객체를 생성.
- 예:
String str = "java"; str = str + "spring"; // 새로운 객체 생성
- 배열은 수정 가능:
- 배열의 요소는 직접 접근하여 수정 가능.
- 문자열은 수정 불가능(Immutable):
- 문자열 비교
- 문자열을 비교할 때는 반드시 equals() 메서드 사용.
코드 분석
1. 배열 맨 앞에 요소 추가
- System.arraycopy()로 해결:
public int[] addToFront(int[] arr, int el) { int[] arr2 = new int[arr.length + 1]; System.arraycopy(arr, 0, arr2, 1, arr.length); // 기존 배열을 새 배열로 복사 arr2[0] = el; // 첫 번째 요소에 새로운 값을 삽입 return arr2; } - for 문으로 해결:
public int[] addToFront(int[] arr, int el) { int[] arr2 = new int[arr.length + 1]; for (int i = 0; i < arr.length; i++) { arr2[i + 1] = arr[i]; // 기존 배열의 값을 한 칸씩 뒤로 밀어 복사 } arr2[0] = el; // 첫 번째 요소에 새로운 값을 삽입 return arr2; }
2. 두 배열 합치기
- 코드에서 막힌 부분:
for (int i = arr1.length; i < arr3.length; i++) {
arr3[i] = arr2[i]; // 여기서 인덱스 문제 발생
}
- 문제는 arr2의 인덱스와 arr3의 시작점이 어긋나는 것이다.
- arr2[i]에서 i는 arr3의 인덱스로 사용되고 있으므로, arr2의 인덱스를 다시 계산해야 한다.
- 수정된 코드:
public int[] mergeArrays(int[] arr1, int[] arr2) {
int[] arr3 = new int[arr1.length + arr2.length];
for (int i = 0; i < arr1.length; i++) {
arr3[i] = arr1[i]; // arr1 복사
}
for (int i = 0; i < arr2.length; i++) {
arr3[arr1.length + i] = arr2[i]; // arr2를 arr3의 뒤쪽에 복사
}
return arr3;
}
추가 개념: 피보나치 수열
피보나치 수열은 다음과 같은 규칙으로 생성된다:
- 첫 번째와 두 번째 값은 각각 0과 1.
- 이후의 값은 이전 두 값을 더한 값.
- 예제 코드:
public int[] fibonacci(int n) { int[] fib = new int[n]; fib[0] = 0; if (n > 1) { fib[1] = 1; } for (int i = 2; i < n; i++) { fib[i] = fib[i - 1] + fib[i - 2]; } return fib; } - 출력 예시:
- 입력: n = 6
- 출력: [0, 1, 1, 2, 3, 5]