본문 바로가기

프로그래밍/자바(java)

[자바/java] Array 클래스, Boxing/UnBoxing

Array클래스는 배열 조각 기능을 가지고 있다.

배열 조작이란 배열의 복사, 항목 정렬, 항목 검색과 같은 기능을 말한다.

단순한 배열 복사는 System.arraycopy() 메소드를 사용할 수 있으나,  Arrays는 추가적으로 항목, 정렬, 항목 검색, 항목 비교와 같은 기능을 제공한다.

 

Arrays 클래스는 모든 메소드는 정적(static)이므로 Arrays클래스를 바로 쓸 수 있다.

 

 

배열 복사

 

 

배열 복사를 위해 사용할 수 있는 메소드는 copyOf(원본배열, 복사할 길이), copyOfRange(원본배열, 시작인덱스, 끝인덱스) 이다.

복사할 길이는 원본 길이보다 커도 되며, 타겟 배열의 길이가 된다.

 

copyOfRange(원본 배열, 시작인덱스, 끝인덱스)는 원본 배열의 시작 인덱스에서 끝 인덱스까지 복사한 배열을 리턴한다.

 

단순 배열의 복사할 목적이라면 System.arraycopy() 메소드를 사용할 수 있다.

System.arraycopy( 원본 배열, 원본 시작인덱스, 타겟배열, 타겟시작인덱스, 복사개수) 로 사용한다.

 

import java.util.Arrays;

public class ArrayMain {

    public static void main(String[] args) {

        char[] arr1 = { 'J', 'A', 'V', 'A'};

        char[] arr2 = Arrays.copyOf(arr1, arr1.length);
        System.out.println(Arrays.toString(arr2));

        char[] arr3 = Arrays.copyOfRange(arr1, 1, 3);
        System.out.println(Arrays.toString(arr3));

        char[] arr4 = new char[arr1.length];
        System.arraycopy(arr1, 0, arr4, 0, arr1.length);

        for(char a : arr4) {
            System.out.print(a);
        }

    }

}

 

 

배열 항목 비교

 

 

Arrays의 equals() 와 deepEquals()는 배열 항목을 비교한다.

equlas() 는 1차 항목의 값만 비교하고, deepEquals()는 1차 항목이 서로 다른 배열을 참조할 경우 중첩된 배열의 항목까지 비교한다.

 

import java.util.Arrays;

public class EqualsMain {

    public static void main(String[] args) {

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

        System.out.println("[얕은 복제후 비교]");
        int[][] clone1 = Arrays.copyOf(original, original.length);
        System.out.println("배열 번지 비교: " + original.equals(clone1));
        System.out.println("1차 배열 항목값 비교: " + Arrays.equals(original, clone1));
        System.out.println("중첩 배열 항목값 비교: " + Arrays.deepEquals(original, clone1));

        System.out.println("[깊은 복제후 비교]");
        int[][] clone2 = Arrays.copyOf(original, original.length);
        clone2[0] = Arrays.copyOf(original[0], original[0].length);
        clone2[1] = Arrays.copyOf(original[1], original[1].length);
        
        System.out.println("배열 번지 비교: " + original.equals(clone2));
        System.out.println("1차 배열 항목값 비교: " + Arrays.equals(original, clone2));
        System.out.println("중첩 배열 항목값 비교: " + Arrays.deepEquals(original, clone2));
        
    }

}

 

 

 

배열 항목 정렬

 

기본 타입 또는 String 배열은 Arrays.sort()메소드의 매개값으로 지정해주면 자동으로 오름차순정렬이 된다.

 

사용자 정의 클래스 타입일 경우에는 클래스가 Comparable인터페이스를 구현하고 있어야 정렬이 된다.

 

compareTo() 메소드의 리턴값은 오름차순일 때 자신이 매개값보다 낮을 경우 음수, 같을 경우 0, 높을 경우 양수를 리턴한다.

반대로 내림차순일때 자신이 매개값보다 낮을 경우 양수, 같을 경우 0, 높을 경우 음수를 리턴한다.

 

 

import java.util.Arrays;

public class SortMain {

    public static void main(String[] args) {

        int[] scores = { 99, 97, 98 };
        Arrays.sort(scores);

        for(int i : scores) {
            System.out.print(i + ",");
        }
        System.out.println();

        String names[] = { "홍길동", "박동수", "김동수" };
        Arrays.sort(names);

        for(String a : names) {
            System.out.print(a + ", ");
        }
        System.out.println();

        Name n1 = new Name("홍길동");
        Name n2 = new Name("박동수");
        Name n3 = new Name("김동수");
        Name[] Names = { n1, n2, n3 };

        Arrays.sort(Names);

        for(Name n : Names) {
            System.out.print(n.name + ", ");
        }


    }

}

class Name implements Comparable<Name> {

    String name;

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

    @Override
    public int compareTo(Name o) {
        return name.compareTo(o.name);
    }

}

 

 

 

배열 항목 검색

 

배열 항목에서 특정 값이 위치한 인덱스를 얻는 것을 배열 검색이라고 한다.

배열 항목을 검색하려면 Arrays.sort() 메소드로 항목들을 오름차순으로 정렬한후 찾아야 한다.

 

 

import java.util.Arrays;

public class SearchMain {

    public static void main(String[] args) {

        int[] scores = { 99, 97, 98 };
        Arrays.sort(scores);
        int index = Arrays.binarySearch(scores, 99);
        System.out.println("찾은 인덱스 : " + index);
        System.out.println();

        String names[] = { "홍길동", "박동수", "김동수" };
        Arrays.sort(names);
        index = Arrays.binarySearch(names, "홍길동");
        System.out.println("찾은 인덱스 : " + index);
        System.out.println();

        Name n1 = new Name("홍길동");
        Name n2 = new Name("박동수");
        Name n3 = new Name("김동수");
        Name[] Names = { n1, n2, n3 };

        Arrays.sort(Names);
        index = Arrays.binarySearch(Names, n1);
        System.out.println("찾은 인덱스: " + index);


    }


}

class Name implements Comparable<Name> {

    String name;

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

    @Override
    public int compareTo(Name o) {
        return name.compareTo(o.name);
    }

}


 

 

Wrapper(포장) 클래스

 

기본타입(byte, char, short, int, long, float, double, boolean) 의 값을 갖는 객체를 생성할 수 있다.

이런 객체를 포장(Wrapper) 객체라고 한다.

 

char 타입과 int 타입은 각각 Character와 Integer로 변경되고, 기본타입의 첫 문자를 대문자로 바꾼 이름을 가지고 있다.

 

 

기본타입 포장 클래스
byte Byte
char Character
short Short
int Integer
long Long
float Float
double Double
boolean Boolean

 

 

 

박싱(Boxing) 과 언박싱(Unboxing)

 

기본 타입의 값을 포장 객체로 만드는 과정을 박싱(Boxing)이라고 하고, 반대로 기본값을 얻어내는 과정을 언박싱(Unboxing)이라고 한다.

 

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

        Integer obj1 = new Integer(100);
        Integer obj2 = new Integer("200");
        Integer obj3 = Integer.valueOf("300");

        int value1 = obj1.intValue();
        int value2 = obj2.intValue();
        int value3 = obj3.intValue();

        System.out.println(value1);
        System.out.println(value2);
        System.out.println(value3);

    }
}

 

 

자동 박싱과 언박싱

 

 

기본 타입 값을 직접 박싱, 언박싱하지 않아도 자동적으로 박싱과 언박싱이 일어나는 경우가 있다.

자동 박싱은 포장 클래스 타입에 기본값이 대입될 경우에 발생한다.

 

Integer obj = 100;

 

자동 언박싱은 기본 타입에 포장 객체가 대입될 경우에 발생된다.

 

Integer obj = new Integer(200);

int value1 = obj;

 

 

 

public class AutoBoxingMain {
    public static void main(String[] args) {
        Integer obj = 100;
        System.out.println("value: " + obj.intValue());

        int value = obj;
        System.out.println("value: " + value);

        int result = obj + 100;
        System.out.println("result: " + result);
    }
}

 

 

 

포장 객체는 내부의 값을 비교하기 위해 == 와 != 연산자를 사용할 수 없다.