사용자 도구

사이트 도구


study:java:javachobo:appendix

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
다음 판 양쪽 다음 판
study:java:javachobo:appendix [2010/03/19 20:52]
gauryan
study:java:javachobo:appendix [2010/03/19 21:30]
gauryan
줄 1: 줄 1:
 ====== JDK 1.5에 추가된 기능 ====== ====== JDK 1.5에 추가된 기능 ======
 +
 +===== 오토박싱(autoboxing) =====
 +컬렉션에는 객체로 저장해야하기 때문에 기본형 값을 저장하기 위해서는 Integer나 Long과 같은 Wrapper클래스를 사용해야했다. 그러나 이제부터는 기본형 값을 직접 컬렉션에 저장할 수 있다. 컴파일러에 의해서 자동적으로 Wrapper클래스로 변환되어 저장되는 데 이것을 오토박싱(autoboxing)이라고 한다. 뿐만아니라 저장된 값을 꺼낼 때도 변환과정을 거치지 않고도 기본형 형태의 값을 바로 얻을 수 있는 데 이것을 언박싱(unboxing)이라고 한다.
 +<code java>
 +ArrayList list = new ArrayList();
 +list.add(new Integer(10));
 +list.add(new Integer(20));
 +list.add(new Integer(30));
 +
 +Integer i = (Integer)list.get(0);
 +int value = i.intValue();
 +</code>
 +이전에는 위와 같은 코드를 사용했지만 이제는 아래와 같이 코드를 간략히 할 수 있다.
 +<code java>
 +ArrayList<Integer> list = new ArrayList<Integer>();
 +list.add(10); // 오토박싱(autoboxing)
 +list.add(20); // 오토박싱(autoboxing)
 +list.add(30); // 오토박싱(autoboxing)
 +
 +int value = list.get(0); // 언박싱(unboxing)
 +</code>
 +
 +===== 향상된 for 문 =====
 +배열과 컬렉션에 저장된 요소에 접근할 때 기존보다 편리한 방법으로 처리할 수 있도록 for문의 새로운 문법이 추가되었다.
 +<code java>
 +1. 배열
 +    for( 배열의 타입 변수명 : 배열 ) {
 +        // 반복할 문장
 +    }
 +    
 +2. 컬렉션
 +    for( 컬렉션에 저장된 요소의 타입 변수명 : 컬렉션 ) {
 +        // 반복할 문장
 +    }
 +</code>
 +
 +먼저, 정수형 배열이 다음과 같이 선언되어 있다고 가정하자.
 +<code java>
 +int[] arr = {10, 20, 30, 40, 50};
 +</code>
 +
 +아래의 두 for 문은 서로 동일하다.
 +<code java>
 +for(int i=0 ; i < arr.length ; i++) {
 +    System.out.println(arr[i]);
 +}
 +</code>
 +<code java>
 +for(int i : arr) {
 +    // arr[i]가 아닌 i라는 것에 유의
 +    System.out.println(i);
 +}
 +</code>
 +
 +이번엔 ArrayList를 생성하고 다음과 같이 세 개의 Integer객체를 저장하고 각 요소에 접근하기 위해 Iterator를 얻었다.
 +<code java>
 +ArrayList<Integer> list = new ArrayList<Ingeger>();
 +list.add(new Ingerger(10));
 +list.add(new Ingerger(20));
 +list.add(new Ingerger(30));
 +
 +Iterator it = list.iterator();
 +</code>
 +
 +<code java>
 +for(;it.hasNext();) {
 +    System.out.println(it.next());
 +}
 +</code>
 +<code java>
 +for(Integer i : list) {
 +    System.out.println(i);
 +}
 +</code>
 +향상된 for 문은 배열보다는 컬렉션에 저장된 요소에 접근할 때 더욱 코드가 간결해진다는 것을 알 수 있다. 한 가지 주의해야할 점은 향상된 for 문내에서 삭제와 같이 컬렉션을 변경하는 동작을 해서는 안 된다는 것이다.
  
 ===== 제네릭스(Generics) ===== ===== 제네릭스(Generics) =====
줄 95: 줄 170:
 </code> </code>
 <code java> <code java>
-public static <T extends Unit> printAll(ArrayList<T> list, ArrayList<T> list2) {+public static <T extends Unit> void printAll(ArrayList<T> list, ArrayList<T> list2) {
     for(Unit u : list) {     for(Unit u : list) {
         System.out.println(u);         System.out.println(u);
줄 108: 줄 183:
  
 class Unit() {} class Unit() {}
 +class Tank extends Unit {}
 +class Dropship extends Unit {}
 +
 +class GenericsEx1 {
 +    public static void main(String[] args) {
 +        ArrayList<Unit> unitList = new ArrayList<Unit>();
 +        ArrayList<Tank> tankList = new ArrayList<Tank>();
 +        
 +        unitList.add(new Tank());
 +        unitList.add(new Dropship());
 +        
 +        tankList.add(new Tank());
 +        tankList.add(new Tank());
 +        
 +        printAll(unitList);
 +//      printAll(tankList);  // 컴파일 에러가 발생한다.
 +
 +        printAll2(unitList);
 +        printAll2(tankList);
 +    }
 +    
 +    public static void printAll(ArrayList<Unit> list) {
 +        for( Unit u : list ) {
 +            System.out.println(u);
 +        }
 +    }
 +    
 +//  public static void printAll2(ArrayList<? extends Unit> list) {
 +    public static <T extends Unit> void printAll2(ArrayList<T> list) {
 +        for( Unit u : list ) {
 +            System.out.println(u);
 +        }
 +    }
 +}
 +</code>
 +
 +===== 타입에 안전한 열거형 (Typesafe enums) =====
 +이전까지 자바는 C언어와 달리 열거형이라는 것이 존재하지 않았으나 새로 추가되었다. 자바의 열거형은 C언어의 열거형보다 더 향상된 개념의 열거형으로 열거형이 갖는 값 뿐만아니라 타입까지 관리하기 때문에 보다 논리적인 오류를 줄일 수 있다.
 +<code java>
 +class Card {
 +    static final int CLOVER  = 0;
 +    static final int HEART   = 1;
 +    static final int DIAMOND = 2;
 +    static final int SPADE   = 3;
 +    
 +    static final int TWO     = 0;
 +    static final int THREE   = 1;
 +    static final int FOUR    = 2;
 +    
 +    final int kind;
 +    final int num;
 +}
 +</code>
 +
 +<code java>
 +class Card {
 +    enum Kind { CLOVER, HEART, DIAMOND, SPADE }
 +    enum Value { TWO, THREE, FOUR }
 +    
 +    final Kind kind;    // 타입이 int가 아닌 Kind임에 유의하자.
 +    final Value value;
 +}
 +</code>
 +이전 방식으로는 타입이 달라도 값이 같으면 조건식결과가 true였으나, 새로 도입된 타입에 안전한 열거형에서는 실제 값이 같아도 타입이 다르면 조건식의 결과가 false가 된다. 이처럼 값뿐만 아니라 타입까지 체크하기 때문에 안전한(typesafe) 열거형이라고 하는 것이다.
 +<code java>
 +if(Card.CLOVER == Card.TWO)            // true지만 false이어야 의미상 맞음.
 +if(Card.Kind.CLOVER == Card.Value.TWO) // false
 +</code>
 +
 +예제 : EnumEx.java
 +<code java>
 +import java.util.*;
 +
 +class EnumEx {
 +    public static void main(String[] args) {
 +        Deck deck = new Deck();
 +        
 +        System.out.println(deck.pick(0));
 +        System.out.println(deck.pick(1));
 +        System.out.println(deck.pick(2));
 +    }
 +}
 +
 +class Card {
 +    enum Kind { CLOVER, HEART, DIAMOND, SPADE }
 +    enum Value { TWO, THREE, FOUR, FIVE, SIX,
 +                 SEVEN, EIGHT, NINE, TEN,
 +                 JACK, QUEEN, KING, ACE }
 +                 
 +    final Kind kind;
 +    final Value value;
 +    
 +    Card(Kind kind, Value value) {
 +        this.kind = kind;
 +        this.value = value;
 +    }
 +    
 +    Card() {
 +        this(Kind.SPADE, Value.ACE);
 +    }
 +    
 +    public String toString() {
 +        return "["+kind+","+value="]";
 +    }
 +}
 +
 +class Deck {
 +    ArrayList<Card> cards = new ArrayList<Card>();
 +    
 +    Deck() {
 +        for(Card.Kind kind : Card.Kind.values()) {
 +            for(Card.Value value : Card.Value.values()) {
 +                cards.add(new Card(kind, value));
 +            }
 +        }
 +    }
 +    
 +    Card pick(int index) {
 +        return cards.get(index);
 +    }
 +}
 </code> </code>
study/java/javachobo/appendix.txt · 마지막으로 수정됨: 2010/03/21 14:48 저자 gauryan