Java

이것이자바다 - 배열

공부처음하는사람 2024. 6. 15. 23:10

배열

- 배열은 같은 타입의 값만 관리한다.
- 배열의 길이는 늘리거나 줄일 수 없다.

- 타입 [ ] 변수 형태로 선언하는게 관례이다.
ex) Int[ ] intArray;

 

배열은 참조 변수이다. 배열도 객체이므로 힙 영역에 생성된다. 배열 변수는 힙 영역의 배열 참조 주소를 저장한다.


참조할 배열이 없다면 null로 초기화할 수 있다. (Null이기 때문에 null인 값을 참조하면 npe가 발생한다)

 

값 목록으로 배열 생성
타입[] 변수 = {1, 2, 3, 4, 5} 형식으로 간단하게 배열을 생성할 수 있다.


중괄호는 나열된 값들을 항목으로 가지는 배열을 힙에 생성하고 주소를 리턴한다.

 

배열 변수를 미리 선언한 후에는 값 목록을 변수에 대입할 수 없다.

 

타입[] 변수;
변수 = { 값0, 값1, 값2, 값3, …}; // 컴파일 에러

 

선언 이후에 대입을 해줘야 할 경우 new 타입[]을 사용한다.

 

String[] names = null;
names= new String[] { “김성현”, “바보”, “멍청이” };

 

메소드의 매개변수가 배열 타입일 경우에도 마찬가지로 new 타입[] 을 사용해야한다.

 

// 올바른 메소드 호출
printItem (new int[] {95, 85, 90);

 

New 연산자로 배열 생성


- 값의 목록은 (중괄호에 들어있는 데이터) 없지만 향 후에 값을 저장할 목적으로 배열을 미리 생성할 수 있다.

int[] intArray = new int[5];

 

New 연산자로 다차원 배열 생성

- 배열 변수 선언 시 타입 뒤 대괄호 [] 를 차원 수만큼 붙이고, new 타입 뒤에도 차원 수만큼 대괄호 []를 작성하면 된다.

int[][] scores = new int[2][3];

 

(두 반의 학생 점수들을 저장하는 2차원 배열의 길이는 모두 3이고, 정수타입이므로 0으로 초기화된다.)

 

 

만약 두 반의 학생 수가 다를경우 2차원 배열의 길이를 다르게 줄 수 있다.

1차원 배열의 길이를 2로 배열 객체를 우선 생성하고, 각각의 항목 값으로 길이가 다른 2차원 배열을 대입한다.

int[][] scores = new int[2][];
scores[0] = new int[3];
scores[1] = new int[2];

 

 

객체를 참조하는 배열

기본 타입 배열 (int, double, long, boolean 등등)은 각 항목에 값을 직접 저장하지만, 참조 타입 배열은 객체의 번지를 저장한다.

(힙 영역에 있는 참조값을 저장한다.)

String[] strArray = new String[3];
strArray[0] = "Java";
strArray[1] = "C++";
strArray[2] = "C#";

 

 

참조 타입 변수는 항상 객체의 참조값을 저장한다는것을 기억하자.

 

==, != 연산자를 사용하면 배열 항목이 참조하는 객체가 같은 객체인지 확인할 수 있다.

문자열을 비교할 땐 equals( ) 메소드를 사용한다.

String[] languages = new String[3];
languages[0] = "Java";
languages[1] = "Java";
languages[2] = " new String("Java");

System.out.println(languages[0] == languages[1]);  // true : 참조값 비교
System.out.println(languages[0] == languages[2]);  // false : 참조값 비교
System.out.println(languages[0].equals(languages[2]));  // true : 문자열 비교

 

 

배열 복사

배열을 한번 생성하면 길이를 변경할 수 없다. 더 많은 저장공간이 필요하다면 더 큰 길이의 배열을 새로 만들고

이전 배열을 복사해야 한다.

 

 

가장 기본적인 복사 방법은 for문을 돌려서 하나씩 읽고 배열에 저장하는 방법이 있다.

package ch05.sec09;

public class ArrayCopyByForEx {
    public static void main(String[] args) {
        //길이 3인 배열
        int[] oldIntArray = {1, 2, 3};

        int[] newIntArray = new int[5];

        for (int i = 0; i < oldIntArray.length; i++) {
            newIntArray[i] = oldIntArray[i];
        }
    }
}

 

3, 4 인덱스는 배열의 초기값 0이므로 출력값은 1,2,3,0,0 이 나온다.

 

조금 더 간단한 방법은 System의 arraycopy( ) 메소드를 사용하는 방법이다.

 

package ch05.sec09;

public class ArrayCopyEx {
    public static void main(String[] args) {

        String[] oldStrArray = {"java", "array", "copy"};

        String[] newStrArray = new String[5];

        // 배열 항목 복사
        System.arraycopy(oldStrArray, 0, newStrArray, 0, oldStrArray.length);
        // 원본 배열, 원본 배열 복사시작 인덱스, 새 배열, 새 배열 붙여넣기 시작 인덱스, 복사 항목 수

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

출력값

 

배열 항목 반복을 위한 향상된 for 문

자바는 배열 및 컬렉션을 좀 더 쉽게 처리할 목적으로 다음과 같은 for문을 제공한다.

카운터 변수와 증감식을 사용하지 않고 항목의 개수만큼 반복 후 자동으로 for문을 빠져나간다.

 

향상된 for문 실행순서

 

iter 을 입력하면 향상된 for 문이 자동입력된다.

package ch05.sec10;

public class AdvancedForEx {
    public static void main(String[] args) {

        int[] scores = {95, 71, 84, 93, 87};
        
        int sum = 0;
        for (int score : scores) {
            sum += score;
        }
        System.out.println(sum);
        
        double avg = (double) sum / scores.length;
        System.out.println(avg);
    }
}

 

 


 

배열 부분을 복습했다. 아직 코드로 배열을 입력하는게 익숙하지 않아 알고리즘 문제를 풀 때 헷갈리는 부분이 많다.

배열문제를 계속 풀면서 학습을 해야겠다