Java 배열

D3F D3V J30N·2024년 8월 1일

Java

목록 보기
4/11
post-thumbnail

Java 배열

1. 배열 선언과 초기화

int[] numbers;
numbers = new int[5];
int[] scores = {95, 80, 87, 92, 88};
String[] fruits = {"사과", "바나나", "오렌지"};

이건 배열을 만드는 여러 방법이다. numbers는 먼저 선언하고 나중에 크기 5로 초기화했다. scores는 선언과 동시에 값을 넣었고, fruits는 문자열 배열이다. 이렇게 하면 한 번에 여러 값을 관리할 수 있어 편리하다.

2. 배열 요소 접근

System.out.println(scores[0]); // 95 출력
System.out.println(fruits[1]); // "바나나" 출력
scores[2] = 90;
fruits[0] = "딸기";

배열의 특정 위치 값을 가져오거나 변경할 때는 인덱스를 사용한다. 인덱스는 0부터 시작한다는 걸 꼭 기억해야 해. scores[0]은 첫 번째 값, fruits[1]은 두 번째 값이다. 값을 바꿀 때도 같은 방식으로 한다.

3. 배열 길이

System.out.println(scores.length); // 5 출력
System.out.println(fruits.length); // 3 출력

length 속성으로 배열의 길이를 알 수 있다. 이건 배열 순회할 때 자주 사용하니까 잘 기억해두자.

4. 배열 순회

for (int i = 0; i < scores.length; i++) {
    System.out.println("점수 " + (i+1) + ": " + scores[i]);
}

for (String fruit : fruits) {
    System.out.println(fruit);
}

배열의 모든 요소를 돌면서 처리할 때는 두 가지 방법을 주로 쓴다. 첫 번째는 일반 for문으로, 인덱스를 직접 다룰 수 있어서 세세한 제어가 필요할 때 좋다. 두 번째는 for-each문인데, 더 간단하고 실수할 여지가 적어서 단순히 모든 요소를 순회할 때 좋다.

5. 다차원 배열

int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};
System.out.println(matrix[1][2]); // 6 출력

for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix[i].length; j++) {
        System.out.print(matrix[i][j] + " ");
    }
    System.out.println();
}

다차원 배열은 배열 안에 배열이 있는 구조다. 여기서는 2차원 배열을 만들었다. 접근할 때는 인덱스를 두 번 써야 해. matrix[1][2]는 두 번째 행의 세 번째 열을 의미한다. 순회할 때는 중첩 반복문을 사용한다.

6. 배열 복사

int[] originalArray = {1, 2, 3, 4, 5};
int[] copiedArray = new int[originalArray.length];
System.arraycopy(originalArray, 0, copiedArray, 0, originalArray.length);
int[] anotherCopy = Arrays.copyOf(originalArray, originalArray.length);

배열을 복사하는 방법은 여러 가지가 있다. System.arraycopy()는 좀 더 세밀한 제어가 필요할 때 사용하고, Arrays.copyOf()는 간단하게 전체를 복사할 때 쓴다. 둘 다 알아두면 유용하다.

이렇게 배열의 기본적인 사용법을 정리해봤다.

인사이트

1. 성능과 메모리 효율성

배열은 빠르고 효율적이다. 연속된 메모리라 접근이 쉽다. 그러나 크기가 고정되어 있어 불편할 때가 있다. 동적으로 크기 조절이 필요하면 ArrayList 같은 것을 써야 한다.

2. 타입 안정성

Java 배열은 타입이 정해져 있어 실수를 줄일 수 있다. 컴파일할 때 오류를 잡아주니까 편하다. 그러나 다른 타입 섞어 쓰기는 어렵다. 이건 좀 아쉽다.

3. 다차원 배열

복잡한 데이터 구조 만들 때 다차원 배열이 좋다. 게임 만들 때 보드 상태 표현하기 딱이다. 그러나 가독성이 떨어질 수 있다. 너무 복잡해지면 클래스로 만드는 게 나을 수도 있다.

4. 반복문과의 궁합

배열하면 반복문이다. for-each문 쓰면 코드가 깔끔해진다. 그러나 인덱스가 필요할 때는 그냥 for문이 더 낫다. 상황 봐가면서 써야 한다.

5. 제네릭과의 관계

제네릭이랑 배열은 좀 안 맞는다. new T[10] 이런 거 안 된다. 이럴 땐 그냥 컬렉션 쓰는 게 편하다.

6. 함수형 프로그래밍

Java 8부터는 배열도 스트림으로 변환해서 함수형으로 다룰 수 있다. 이렇게 하면 코드가 더 간결해진다. 그러나 기존 방식보다 성능이 조금 떨어질 수 있다.

7. 경계 체크

배열은 범위 벗어나면 예외를 던진다. 이건 안전하지만 성능에 영향을 줄 수 있다. 그래서 반복문에서 경계 조건을 잘 설정하는 게 중요하다.

8. 불변성과 가변성

배열은 기본적으로 가변적이다. 이건 유연하지만 예상치 못한 문제를 일으킬 수 있다. 불변성이 필요하면 복사본을 만들거나 불변 래퍼 클래스를 쓰는 걸 고려해야 한다.

이렇게 정리하면 배열의 특성을 잘 이해하고 효과적으로 사용할 수 있다. 상황에 맞게 잘 활용하면 코드 품질이 올라간다.

profile
Problem Solver

0개의 댓글