본문 바로가기

Java/Chapter 13. 배열(Array)

[Java] 13.01 - 1차원 배열의 이해와 활용(2)

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

 다음의 참조변수 선언을 보자.

 이는 앞서 소개하고 설명한 방식의
참조변수 선언이다.

int[] arr;

 동일한 참조변수 arr을 다음과
같이 선언할 수도 있다.

int arr[];

 다음과 같이 배열을 생성하는
문장에서도

 이 둘은 동일한 의미로 사용된다.

int[] arr = new int[3];    // 조금 더 선호하는 방법
int arr[] = new int[3];

 

배열의 참조 값과 메소드

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

 예를 들어서 다음과 같이 배열의
참조 값을 인자로 전달할 수 있다.

public static void main(String[] args) {
    int[] arr = {1, 2, 3, 4, 5, 6, 7};
    int sum = sumOfAry(arr);    // 배열의 참조 값 전달
    ....
}

 그리고 위에서 홏물하는 메소드는
다음과 같이 정의해야 한다.

 즉 다음과 같이 배열의 참조변수를
매개변수로 선언해야 한다.

static int sumOfAry(int[] arr){
    int sum = 0;
    for (int i=0; i < arr.length; i++)
        sum += arr[i];
    return sum;
}

 이 과정에서 배열이 새로 생성되는
것은 아니다.

 그저 배열 인스턴스를 참조할 수
있는 참조 값만 인자로 전달 되고,

 이 값을 매개변수로 받을 뿐이다.


 그리고 다음과 같이 배열의 참조
값을 반환하는 메소드를 정의하는
것도 가능하다.

static int[] makeNewIntAry(int len){
    int[] arr = new int[len];
    return arr;
}

 결론적으로 배열도 인스턴스이다.

 따라서 인스턴스의 참조 값을 전달
및 반환하듯이

 배열의 참조 값도 전달 및 반환할
수 있으며, 그 방법에도 차이가 없다.

 

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

 배열이 생성되면 모든 요소는
0 또는 null로 초기화된다.

 예를 들어서 다음과 같이 생성된
배열은 0으로 초기화된다.

int[] arr = new int[10];    // 배열의 모든 요소 0으로 초기화

 그리고 다음과 같이 인스턴스
배열을 생성하면 모든 요소는
null로 초기화 된다.

String[] arr = new String[10];    // 배열의 모든 요소 null로 초기화

 그런데 int형 배열과 같은 기본
자료형 배열을 0이외의 값으로
초기화해야 할 때가 있다.

 이러한 경우에는 반복문을 이용해서
원하는 값을 배열에 저장할 수도 있지만,

 다음 메소드 호출을 통해서 원하는
값을 배열에 저장할 수도 있다.

public static void fill(int[] a, int val)
// 두 번째 인자로 전달된 값으로 배열 초기화
    
public static void fill(int[] a, int fromIndex, int toIndex, int val)
// 인덱스 fromIndex ~ (toIndex-1)의 범위까지 val의 값으로 배열 초기화

 위의 두 메소드는 java.util.Arrys
클래스에 정의되어 있으며,

 각 기본 자료형 별로 메소드가
오버로딩 되어 있다.

 그리고 배열을 복사해야 하는
상황도 종종 발생하는데,

 이 경우에도 반복문을 구성해서
복사를 진행할 수 있지만,

  java.lang.System 클래스의 다음
메소드를 통해서 복사를 할 수도 있다.

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
// 복사 원본의 위치: 배열 src의 인덱스 srcPos
// 복사 대상의 위치: 배열 dest의 인덱스 destPos
// 복사할 요소의 수: length

 그럼 지금 소개한 두 메소드의
호출의 예를 다음 예제를 통해서
보이겠다.

import java.util.Arrays;

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

        Arrays.fill(ar1, 7);    // 배열 ar1을 7로 초기화
        System.arraycopy(ar1, 0, ar2, 3, 4);    // 배열 ar1을 ar2로 부분 복사

        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] + " ");
    }
}

/*
출력 결과
7 7 7 7 7 7 7 7 7 7 
0 0 0 7 7 7 7 0 0 0 
*/

 

main 메소드의 매개변수 선언

 이제는 다음 main 메소드의
매개변수 선언이

 무엇을 의미하는지 이해할 수
있을 것이다.

public static void main(String[] args) { . . . . }

 매개변수로 String 배열의
참조변수가 선언되었다.

 따라서 다음과 같이 main
메소드를 호출해야 한다.

String[] arr = new String[] {"Blade", "Ring", "Shield"};
main(arr);

 물론 코드상에서 main 메소드를
위와 같이 직접 호출하지는 않는다.

 게다가 우리가 main 메소드에
전달할 String 배열을 만들지도
않는다.

 그렇다면 어떻게 String 배열이
만들어지고,

 또 main 메소드의 인자로 전달이
되는 것인가?

 String 배열을 구성하는 것도, main
메소드를 호출하는 것도,

 자바 가상머신에 의해 이뤄지는
일이다.

 다만 String 배열을 구성할 문자열은
프로그램 사용자가 전달해야 한다.

 예를 들어서 Simple.class에 위치한
main 메소드를 다음과 같이 호출한다고
가정해보자.

C:\JavaStudy>java Smiple

 그러면 String 배열이 다음과 같이
구성이 되어 main 메소드에 전달이
된다.

String[] arr = new String[] {};

 즉 빈 String 배열이 생성되어 main
메소드의 호출이 이뤄진다.

 반면 다음과 같이 실행을 하면,

C:\JavaStudy>java Smiple

 String 배열이 다음과 같이 구성이
되어 main 메소드에 전달이 된다.

String[] arr = new String[] {"Blade", "Ring", "Shield"};

 즉 실행 명령문에 이어서 공백을
구분 기준으로 문자열을 입력하면,

 이 내용을 대상으로 String 배열이
구성되고,

 이 배열의 참조 값이 전달되면서
main 메소드가 호출이 된다.

 그럼 이러한 내용의 확인을 위해
다음 예제를 실행해보자.

class Simple{
    public static void main(String[] args){
        for (int i=0; i < args.length; i++)
            System.out.println(args[i]);
    }
}

/*
출력 결과
Blade
Ring
Shield
*/

참고 및 출처

윤성우의 열혈 Java 프로그래밍
국내도서
저자 : 윤성우
출판 : 오렌지미디어 2017.07.05
상세보기