본문 바로가기
JAVA/이재환의 자바 프로그래밍 입문

[Java] Ch.15 배열

by ♡˖GYURI˖♡ 2023. 10. 20.

1차원 배열

배열 선언

배열 변수는 기본 자료형을 사용하더라도 다음과 같이 객체를 만드는 방법으로 선언

자료형[] 변수명 = new 자료형[개수];	// 자바에서 조금 더 선호하는 방법
자료형 변수명[] = new 자료형[개수];

배열 요소를 구분하는 배열 인덱스는 0부터 시작

 

int[] num = new int[10];

int[] num;
num = new int[10];

 

class BoxA1 {

}

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

        // 길이가 7인 double형 1차원 배열의 생성
        double[] ar2 = new double[7];

        // 배열의 참조변수와 객체 생성 분리
        float[] ar3;
        ar3 = new float[9];

        // 객체 대상 1차원 배열 
        BoxA1[] ar4 = new BoxA1[5];

        // 배열의 객체 변수 접근 / 메서드 사용
        System.out.println("배열 ar1 길이: " + ar1.length);
        System.out.println("배열 ar2 길이: " + ar2.length);
        System.out.println("배열 ar3 길이: " + ar3.length);        
        System.out.println("배열 ar4 길이: " + ar4.length);
    }
}

 

배열 사용 : 기본 자료형

public class Ex02_intArray
{
    public static void main(String[] args)
    {
        // 길이가 3인 int형 1차원 배열의 생성
        int[] ar = new int[3];
        
        ar[0] = 100;    // 값의 저장 : 첫 번째 요소
        ar[1] = 90;		// 값의 저장 : 두 번째 요소
        ar[2] = 80;		// 값의 저장 : 세 번째 요소
        
        int sum = ar[0] + ar[1] + ar[2];	// 값의 참조
        System.out.println("총점 : " + sum);
    }
}

 

배열 사용 : String형

public class Ex03_StringArray
{
    public static void main(String[] args)
    {
        String[] name = new String[7];

        name[0] = new String("홍길동");
        name[1] = new String("전우치");
        name[2] = new String("손오공");
        name[3] = new String("강감찬");
        name[4] = new String("이순신");
        name[5] = new String("을지문덕");
        name[6] = new String("양만춘");
  
        int cnum = 0;

        for(int i = 0; i < name.length; i++) {
            System.out.println(name[i]);
            cnum += name[i].length();
        }
    
        System.out.println("총 문자의 수: " + cnum);
    }
}

배열 사용 : 클래스형

class BoxA4 {
    public String name;

    BoxA4(String name) {
        this.name = name;
    }
}

public class Ex04_BoxArray
{
    public static void main(String[] args)
    {
        BoxA4[] ar = new BoxA4[3];

        // 배열에 객체 저장 (초기화)
        ar[0] = new BoxA4("홍길동");
        ar[1] = new BoxA4("전우치");
        ar[2] = new BoxA4("손오공");
        
        // 저장된 객체의 참조
        System.out.println(ar[0].name);
        System.out.println(ar[1].name);
        System.out.println(ar[2].name);
    }
}

 

배열 사용 : 매개변수, 반환형

public class Ex05_ArrayInMethod
{
    public static void main(String[] args)
    {
        int[] arr = makeIntArray(5);
        
        int sum = sumOfArray(arr);

        System.out.println(sum);
    }

    public static int[] makeIntArray(int len)
    {
        int[] arr = new int[len];
        for(int i=0; i< len; i++)
        {
            arr[i] = i;
        }
        return arr;
    }
    
    public static int sumOfArray(int[] arr)
    {
        int sum = 0;
        for(int i=0; i< arr.length; i++)
        {
            sum = sum + arr[i];
        }
        return sum;
    }
}

 

배열 생성과 동시에 초기화

// 배열 생성
int[] arr = new int[3];

// 배열 생성 및 초기화 1
int[] arr = new int[] {1, 2, 3};

// 배열 생성 및 초기화 2
int[] arr = {1, 2, 3};

배열의 값을 초기화하지 않았을 때도 디폴트 초기화는 진행됨

기본 자료형 배열은 모든 요소가 0으로 초기화되고, 객체 배열(참조 변수 배열)은 모든 요소가 null로 초기화 됨

 

class BoxA6 { }

public class Ex06_ArrayInit
{
    public static void main(String[] args)
    {
        int[] arr1 = new int[3];              // 0으로 초기화
        int[] arr2 = new int[] {1, 2, 3};
        double[] arr3 = {1.0, 2.0, 3.0};
        double[] arr4 = new double[3];        // 0.0으로 초기화
        BoxA6[] arr5 = new BoxA6[3];
        
        for (int i=0; i<arr1.length; i++)
        {
            System.out.print(arr1[i] + " ");
            System.out.print(arr2[i] + " ");
            System.out.print(arr3[i] + " ");
            System.out.print(arr4[i] + " ");
            System.out.print(arr5[i] + " ");
            System.out.println();
        }
    }
}

 

 

main() 메서드의 매개변수

public static void main(String[] args)
{

}

main() 메서드는 개발자가 직접 호출하는 메서드가 아니고 JVM이 프로그램을 실행할 때 불리는 메서드

그래서 메서드를 호출해 인수를 넘겨주는 방식이 아니고 '명령 프롬프트'에서 프로그램을 실행할 때 인수를 넘겨주거나 이클립스에서는 다음에서 하는 방법으로 인수를 넘겨주어야 테스트를 할 수 있음

 

명령행에서 다음과 같이 실행하면 JVM이 내부적으로 배열을 만들어서 main() 메서드에 넘겨주게 됨

C:\JavaStudy> java Simple Apple Banana Orange
String[] arr = new String[] {"Apple", "Banana", "Orange"};
main(arr);

 

public class Ex07_mainParameter
{
    public static void main(String[] args)
    {
        // main 메서드의 매개변수 확인
        for(int i = 0; i < args.length; i++ )
            System.out.println(args[i]);
    }
}

 

 

for ~ each 문

'향상된 기능의 for문'

public class Ex08_EnhancedFor
{
    public static void main(String[] args)
    {
        int[] arr = {1, 2, 3, 4, 5};
        
        // 배열 요소 전체 출력     
        for(int e: arr) {
            System.out.print(e + " ");
        }
        System.out.println();   // 줄 바꿈을 목적으로
   
    
        int sum = 0;
        
        // 배열 요소의 전체 합 출력     
        for(int e: arr) {
            sum = sum + e;
        }
        System.out.println("sum: " + sum); 
    }
}

 

class House 
{
    private int houseNum;
    private String name;
    
    House(int houseNum, String name) 
    {
        this.houseNum = houseNum;
        this.name = name;
    }
    
    public int getHouseNum() 
    {
        return houseNum;
    }

    public String getName() 
    {
        return name;
    }    
}

public class Ex09_EnhancedForObject
{
    public static void main(String[] args)
    {
    	House[] arr = new House[5];
        
        arr[0] = new House(101, "홍길동");
        arr[1] = new House(102, "전우치");
        arr[2] = new House(103, "손오공");
        arr[3] = new House(104, "해리포터");
        arr[4] = new House(105, "멀린");

        for(House e: arr) 
        {
            if(e.getHouseNum() == 102)
                System.out.println(e.getName());
        }
    }
}

 

 

다차원 배열

다차원 배열은 2차원, 3차원 배열 등으로 만들 수 있음

 

2차원 배열

int[][] arr2 = new int[3][3];
public class Ex10_ForInFor
{
    public static void main(String[] args)
    {
        int[][] arr = new int[3][3];
        
        int num = 1;

        for(int i=0; i<3; i++) {
        	// 먼저 i로 층을 정하고 여기서 j로 각 층의 방을 다 돕니다.
            for(int j=0; j<3; j++) {
                arr[i][j] = num;
                num++;
            }
        }

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

 

2차원 배열의 실제 구조

// 자바에서는 다음과 같은 초기화도 가능
// C언어는 불가능

int[][] arr5 = {
    {0},
    {10, 11},
    {20, 21, 22}
}

 

public class Ex11_PartiallyFilled
{
    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();
        }
    }
}

 

 

배열 관련 유틸리티 메서드

배열을 편하게 사용하게 해주는 여러 메서드

 

배열의 초기화 메서드

배열이 엄청 클 때는 값을 직접 일일이 지정해주는 초기화 방식은 무리

다음 클래스에 있는 메서드를 사용하여 원하는 값으로 배열 전부 또는 일부를 채울 수 있음

// java.util.Arrays 클래스에 정의되어 있는 메서드

public static void fill(int[] a, int val)
// 두 번째 매개변수로 전달된 값으로 배열 초기화

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

 

배열의 복사 Array 클래스

// java.util.Arrays 클래스에 정의되어 있는 메서드

public static int[] copyOf(int[] original, int newLength)
// original에 전달된 배열을 첫 번째 요소로부터 newLength 길이만큼 복사

public static int[] copyOfRange(int[] original, int from, int to)
// original에 전달된 배열을 인덱스 from부터 to 이전 요소까지 복사
// java.util.System 클래스에 정의되어 있는 메서드

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
// 배열 src의 srcPos에서 배열 dest의 destPos로 length 길이만큼 복사
import java.util.Arrays;

public class Ex12_ArrayCopy
{
    public static void main(String[] args)
    {
        int[] arr1 = new int[10];
        int[] arr2 = new int[8];
        
        // 배열 arr1을 3으로 초기화
        Arrays.fill(arr1, 3);
        
        // 배열 arr1을 arr2로 부분 복사
        System.arraycopy(arr1, 0, arr2, 3, 4);

        // arr1 출력
        for(int i=0; i<arr1.length; i++)
            System.out.print(arr1[i] + " ");
        System.out.println();
        
        // arr2 출력
        for(int i=0; i<arr2.length; i++)
            System.out.print(arr2[i] + " ");
        System.out.println();

        // 배열 ar1을 ar3로 부분 복사
        int[] arr3 = Arrays.copyOfRange(arr2, 2, 5);
        
        // arr3 출력
        for(int i=0; i<arr3.length; i++)
            System.out.print(arr3[i] + " ");
        System.out.println();
    }
}

 

배열 내용 비교

Arrays 클래스에는 배열을 비교해주는 equals() 메서드가 있음

두 배열에 저장된 데이터의 수, 순서 그리고 내용이 같을 때 true 반환

(배열 길이가 다르면 false 반환)

import java.util.Arrays;

public class Ex13_ArrayEquals
{
    public static void main(String[] args)
    {
        int[] arr1 = {1, 2, 3, 4, 5};
        int[] arr2 = Arrays.copyOf(arr1, arr1.length);
        
        boolean bCheck = Arrays.equals(arr1, arr2);
        System.out.println(bCheck);
    }
}

 

배열의 내용 정렬

Arryas 클래스에는 배열을 정렬해주는 sort() 메서드가 있음

public static void sort(int[] a)
// 매개변수 a로 전달된 배열을 오름차순으로 정렬
import java.util.Arrays;

public class Ex14_ArraySort
{
    public static void main(String[] args)
    {
        int[] arr1 = {1, 3, 2, 4};
        double[] arr2 = {4.4, 3.3, 2.2, 1.1};
        String[] arr3 = {"홍길동", "전우치", "손오공", "멀린"};
        
        Arrays.sort(arr1);
        Arrays.sort(arr2);
        Arrays.sort(arr3);

        for (int n : arr1)
            System.out.print(n + "\t");
        System.out.println();
        
        for (double d : arr2)
            System.out.print(d + "\t");
        System.out.println();

        for (String s : arr3)
            System.out.print(s + "\t");
        System.out.println();
    }
}