[윤성우의 열혈 Java 프로그래밍] Chapter 13 - 배열(Array)

Update:     Updated:

카테고리:

태그:

13-1. 1차원 배열의 이해와 활용

배열: 자료형이 같은 둘 이상의 값을 저장할 수 있는 메모리 공간

- 1차원 배열의 생성방법

자바는 배열도 ‘인스턴스’로 처리한다.
image

public class ArrayIsInstance {
    public static void main(String[] args) {
        // 길이가 5인 int형 1차원 배열의 생성
        int[] ar1 = new int[5];

        // 배열의 참조변수와 인스턴스 생성 분리
        double[] ar2;
        ar2 = new double[10];

        // 배열 '인스턴스 변수(length)' 접근
        System.out.println("배열 ar1의 길이: " + ar1.length);
        System.out.println("배열 ar2의 길이: " + ar2.length);
    }
}


다음 예시처럼 인스턴스를 저장할 수 있는 배열을 선언하는 방법도 있다.

class Box {
    private String conts;

    Box(String conts) {
        this.conts = conts;
    }

    public String toString() {
        return conts;
    }
}

public class ArrayIsInstance2 {
    public static void main(String[] args) {
        Box[] boxes = new Box[5];   // 길이가 5인 Box형 1차원 배열의 생성
        System.out.println("length : " + boxes.length);
    }
}

주의해야할 점은
이는 Box 인스턴스 5개를 저장할 수 있는 ‘참조변수의 배열’ 이라는 점이다.
즉, Box 인스턴스의 생성과는 관계가 없고, 위 문장을 통해 5개의 Box 인스턴스를 저장할 수 있는 배열이 생성될 뿐이다.

- 배열을 대상으로 한 값의 저장과 참조

위의 Box 예시로 배열 대상의 값 저장 및 참조 방법을 알아보자.
image

class Box {
    private String conts;

    Box(String conts) {
        this.conts = conts;
    }

    public String toString() {
        return conts;
    }
}

public class BoxArray {
    public static void main(String[] args) {
        Box[] boxes = new Box[3];

        // 배열에 인스턴스 저장
        boxes[0] = new Box("One");
        boxes[1] = new Box("Two");
        boxes[2] = new Box("Three");

        // 저장된 인스턴스의 참조
        for (int i = 0; i < 3; i++) {
            System.out.println(boxes[i]);
        }
    }
}

- 배열을 생성과 동시에 초기화하기

int[] arr = new int[] {1, 2, 3};    // 첫 번째 방법
int[] arr = {1, 2, 3};  // 두 번째 방법

- 참조변수 선언의 두 가지 방법

int[] ar = new int[3];
int ar[] = new int[3];

- 배열의 참조 값과 메소드

배열도 인스턴스이므로 메소드 호출 시 참조 값의 전달 및 반환이 가능하다.

static int sumOfAry(int[] ar) { // 배열의 참조 값 전달
    int sum = 0;

    for(int i = 0; i < ar.length; i++)
        sum += ar[i];
    
    return sum;
}

static int[] makeNewIntAry(int len) {
    int[] ar = new int[len];
    return ar;  // 배열의 참조 값 반환
}

- 배열의 초기화와 배열의 복사

배열이 생성되면 모든 요소는 0 또는 null로 초기화된다.
따라서 특정 값으로 초기화하고 싶다면 java.util.Arrays에 정의되어있는 다음 메소드를 사용한다.
image


또, 배열을 복사해야 하는 상황도 종종 생기는데, 이 때는 java.lang.System에 있는 다음 메소드를 사용한다.
image


코드를 통해 확인해보자!

import java.util.Arrays;

public class ArrayUtils {
    public static void main(String[] args) {
        int[] ar1 = new int[10];
        int[] ar2 = new int[10];

        Arrays.fill(ar1, 7);    // 배열 ar1을 7로 초기화

        // 배열 ar1을 ar2로 부분 복사
        System.arraycopy(ar1, 0, ar2, 2, 5);    // ar1의 0번 인덱스부터 5개의 요소를 ar2의 2번 인덱스로 부분 복사

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

image

13-2. enhanced for문

enhanced for문은 자바5에서 추가되었다.
for loop의 구조가 파이썬과 유사하게 돌아가니 참고하자.

- enhanced for문의 이해와 활용

배열을 사용하다보면 ‘배열에 저장된 모든 요소들’을 대상으로 연산, 참조 또는 탐색을 진행해야하는 경우를 자주 보게 된다.
이러한 상황의 문장 구성을 돕기 위해 등장한 것이 enhanced for문(for-each문)이다.

image image

int[] ar = {1,2,3,4,5};

// 일반 for문
for(int i = 0; i < ar.length; i++){
    System.out.println(ar[i]);
}

// enhanced for문
for(int e : ar){
    System.out.println(e);
}

- 인스턴스 배열을 대상으로 하는 enhanced for문

배열에 저장된 내용이 ‘기본 자료형의 값’이 아닌 ‘인스턴스의 참조 값’인 경우에도 달라지는 것은 없다.

class Bucket{
    private String contents;
    private int bucketNum;

    Bucket(int bucketNum, String contents) {
        this.bucketNum = bucketNum;
        this.contents = contents;
    }

    public int getBucketNum() {
        return bucketNum;
    }

    public String toString() {
        return contents;
    }
}

public class EnhancedForInst {
    public static void main(String[] args) {
        Bucket[] buckets = new Bucket[3];

        buckets[0] = new Bucket(101, "Coffee");
        buckets[1] = new Bucket(202, "Computer");
        buckets[2] = new Bucket(303, "Apple");

        // 배열에서 번호가 202인 Bucket을 찾아 그 내용물을 출력하는 반복문
        for(Bucket b : buckets){
            if(b.getBucketNum() == 202){
                System.out.println(b);
            }
        }
    }
}

13-3. 다차원 배열의 이해와 활용

- 2차원 배열의 생성과 접근

image

이해를 위해 2차원 배열을 선언해보고, 값을 순차적으로 저장해보자!

public class TwoDimenArray {
    public static void main(String[] args) {
        int[][] ar = new int[3][4];
        int num = 1;

        // 배열에 값을 저장 및 참조
        for (int i = 0; i < 3; i++) {   // 행의 수: 3
            for (int j = 0; j < 4; j++) {   // 열의 수: 4
                ar[i][j] = num;
                num++;
                System.out.print(ar[i][j] + "\t");
            }
            System.out.println();
        }
    }
}

image

- 2차원 배열의 구조

image

2차원 배열의 실제 구조를 보면 각 행을 담당하는 변수인 arr[0], arr[1], arr[2]들은
각각의 ‘1차원 배열을 참조하는 참조변수’임을 알 수 있다.

따라서, 위의 코드를 다음과 같이 수정할 수 있다.

public class TwoDimenArray {
    public static void main(String[] args) {
        int[][] ar = new int[3][4];
        int num = 1;

        // 배열에 값을 저장 및 참조
        for (int i = 0; i < ar.length; i++) {   // 행의 수: 3 -> ar.length
            for (int j = 0; j < ar[i].length; j++) {   // 열의 수: 4 -> ar[i].length
                ar[i][j] = num;
                num++;
                System.out.print(ar[i][j] + "\t");
            }
            System.out.println();
        }
    }
}

- 2차원 배열의 초기화

1차원 배열과 마찬가지로 다음 방법을 통해 간단히 초기화가 가능하다.

public class PartiallyFilledArray {
    public static void main(String[] args) {
        int[][] arr = {
                {11},
                {22, 33},
                {44, 55, 66}
        };

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

image

Java lang 카테고리 내 다른 글 보러가기

댓글 남기기