오토 박싱 - xrath.com 에서 번역됨

# 오토 박싱

Language 의 목차

Java 프로그래머라면 누구라도 알고 있는 것입니다만,`int` (또는 그 외의 프리미티브(primitive)치)를 컬렉션에 둘 수 없습니다. 컬렉션은 객체 참조만을 보관 유지할 수 있기 (위해)때문에, 프리미티브(primitive)치는 적절한 래퍼 클래스 (`int` 의 경우는`Integer` )에 「채운다 (box)」필요가 있습니다. 객체를 컬렉션으로부터 꺼낼 때는, 포함한 `Integer` 를 가져옵니다. `int` 가 필요한 경우는,`intValue` 메소드를 사용해,`Integer` 로부터 「꺼낸다 (unbox)」필요가 있습니다. 이것들은 모두 번주위 조작이며, 코드가 복잡화 합니다. 오토 박싱 / 언 박싱 기능에 의해, 이 처리가 자동화되어 여분의 작업이나 코드의 복잡함이 없어집니다.

다음의 예에서는, 총칭 및 for-each 루프를 사용한 오토 박싱 / 언 박싱 기능을 나타냅니다. 이 10 행 안 되는 코드로, 커멘드행에 나타나는 말의 출현 빈도를 계산해, 알파벳순서에 출력합니다.

>     import java.util. *;

>     // Prints a frequency table of the words on the command line
>     public class Frequency {
>        public static void main(String[] args) {
>           Map<String, Integer> m = new TreeMap<String, Integer>();
>           for (String word : args) {
>               Integer freq = m.get(word);
>               m.put(word, (freq == null ?  1 : freq + 1));
>           }
>           System.out.println(m);
>        }
>     }

>     java Frequency if it is to be it is up to me to do the watusi
>     {be=1, do=1, if=1, is=2, it=2, me=1, the=1, to=3, up=1, watusi=1}

우선,`String` 로부터 `Integer` 에의 맵을 선언해, 커멘드행에 출현하는 말의 출현 회수를 관련짓습니다. 다음에, 커멘드행의 각 말에 대해 반복 처리를 실시합니다. 각각의 말에 대해, 맵내에서 말을 검색합니다. 개정한 말의 엔트리를 맵에 입력합니다. 이 조작을 실시하고 있는 행 (녹색으로 강조 표시)에는, 오토 박싱 / 언 박싱 기능의 양쪽 모두가 포함되어 있습니다. 새로운 값을 계산해 말에 할당하려면 , 우선 현재의 값 (`freq`)을 확인합니다. 이 값이 null 의 경우는, 이번이 최초의 출현이 되기 (위해)때문에, 맵에 1 을 입력합니다. 그렇지 않은 경우는, 지금까지의 출현 회수에 1 을 더해, 그 값을 맵에 입력합니다. 물론 `int` 를 맵에 입력하거나`Integer` 에 1 을 더할 수 없습니다. 실제는,`freq` 에 1 을 더하기 위해서(때문에) 자동적으로 언 박싱을 해`int` 형의 식이 됩니다. 조건 진묘쵸우에 기록되어 있는 일의 대체식의 양쪽 모두가 형태 `int` 이기 (위해)때문에, 이 조건식 자체도 `int` 가 됩니다. 이 `int` 치를 맵에 입력하기 위해서, 자동적으로 `Integer` 에 복싱 합니다.

이 조작 전체의 결과로서, 몇개의 주의점을 제외해,`int` 와 `Integer` 의 구별을 거의 무시할 수가 있습니다. `Integer` 식에서는,`null` 치를 사용할 수 있습니다. null 를 오토 안 박스 하려고 하면(자),`NullPointerException` 가 throw 됩니다. `` 연산자는 참조의 동일성 비교를 `Integer` 식에서 실행해, 값의 등가 성비교를 `int` 식에서 실행합니다. 마지막으로, 가두고 및 취득은 자동적으로 행해집니다만, 퍼포먼스상의 부하는 걸립니다.

다음에, 오토 박싱 / 언 박싱 기능에 대해, 다른 샘플 프로그램을 나타냅니다. `int` 배열을 취하는 static 팩토리이며, 배열에 근거하는 `Integer` 의 `List` 를 돌려줍니다. 이 10 행 안 되는 코드로, 이 메소드는,`int` 배열의 상위에 있는 `List` 인터페이스의 자세한 예를 나타냅니다. 리스트에 대한 모든 변경은, 배열에 기입해집니다. 역도 같습니다. 오토 박싱 / 언 박싱 기능의 행은, 녹색으로 강조 표시되고 있습니다.

>     // List adapter for primitive int array
>     public static List<Integer> asList(final int[] a) {
>         return new AbstractList<Integer>() {
>             public Integer get(int i) { return a[i]; }
>             // Throws NullPointerException if val == null
>             public Integer set(int i, Integer val) {
>                 Integer oldVal = a[i];
>                 a[i] = val;
>                 return oldVal;
>             }
>             public int size() { return a.length; }
>         };
>     }

얻을 수 있는 리스트의 퍼포먼스는 좋지 않습니다. 이것은, 가두고와 취득이 `get` 또는 `set` 조작 마다 행해지기 (위해)때문에입니다. 이 코드는, 이따금 사용한다면 충분히 고속으로 가, 퍼포먼스가 중요해지는 내부 루프로 사용하는 것은 피해 주세요.

오토 박싱 / 언 박싱 기능은, 참조형과 프리미티브(primitive)과의 사이에 「impedance 부정합」이 있는 경우에만 사용해 주세요. 예를 들어 수치를 컬렉션에 입력해야 하는 경우입니다. 오토 박싱 / 언 박싱 기능을 과학 계산이나 퍼포먼스가 중요한 수치 코드에 사용하는 것은, 적절하지는 않습니다. `Integer` 는 `int` 대신에 되지 않습니다. 오토 박싱 / 언 박싱 기능에 의해, 원시형과 참조형의 구별이 애매하게 됩니다만, 해소되는 것은 아닙니다.

Copyright © 2004 Sun Microsystems, Inc. All Rights Reserved. | Java Software