문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 다음 판 양쪽 다음 판 | ||
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 java> | ||
+ | ArrayList< | ||
+ | list.add(10); | ||
+ | list.add(20); | ||
+ | list.add(30); | ||
+ | |||
+ | int value = list.get(0); | ||
+ | </ | ||
+ | |||
+ | ===== 향상된 for 문 ===== | ||
+ | 배열과 컬렉션에 저장된 요소에 접근할 때 기존보다 편리한 방법으로 처리할 수 있도록 for문의 새로운 문법이 추가되었다. | ||
+ | <code java> | ||
+ | 1. 배열 | ||
+ | for( 배열의 타입 변수명 : 배열 ) { | ||
+ | // 반복할 문장 | ||
+ | } | ||
+ | | ||
+ | 2. 컬렉션 | ||
+ | for( 컬렉션에 저장된 요소의 타입 변수명 : 컬렉션 ) { | ||
+ | // 반복할 문장 | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | 먼저, 정수형 배열이 다음과 같이 선언되어 있다고 가정하자. | ||
+ | <code java> | ||
+ | int[] arr = {10, 20, 30, 40, 50}; | ||
+ | </ | ||
+ | |||
+ | 아래의 두 for 문은 서로 동일하다. | ||
+ | <code java> | ||
+ | for(int i=0 ; i < arr.length ; i++) { | ||
+ | System.out.println(arr[i]); | ||
+ | } | ||
+ | </ | ||
+ | <code java> | ||
+ | for(int i : arr) { | ||
+ | // arr[i]가 아닌 i라는 것에 유의 | ||
+ | System.out.println(i); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | 이번엔 ArrayList를 생성하고 다음과 같이 세 개의 Integer객체를 저장하고 각 요소에 접근하기 위해 Iterator를 얻었다. | ||
+ | <code java> | ||
+ | ArrayList< | ||
+ | list.add(new Ingerger(10)); | ||
+ | list.add(new Ingerger(20)); | ||
+ | list.add(new Ingerger(30)); | ||
+ | |||
+ | Iterator it = list.iterator(); | ||
+ | </ | ||
+ | |||
+ | <code java> | ||
+ | for(; | ||
+ | System.out.println(it.next()); | ||
+ | } | ||
+ | </ | ||
+ | <code java> | ||
+ | for(Integer i : list) { | ||
+ | System.out.println(i); | ||
+ | } | ||
+ | </ | ||
+ | 향상된 for 문은 배열보다는 컬렉션에 저장된 요소에 접근할 때 더욱 코드가 간결해진다는 것을 알 수 있다. 한 가지 주의해야할 점은 향상된 for 문내에서 삭제와 같이 컬렉션을 변경하는 동작을 해서는 안 된다는 것이다. | ||
===== 제네릭스(Generics) ===== | ===== 제네릭스(Generics) ===== | ||
줄 95: | 줄 170: | ||
</ | </ | ||
<code java> | <code java> | ||
- | public static <T extends Unit> printAll(ArrayList< | + | public static <T extends Unit> |
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< | ||
+ | ArrayList< | ||
+ | | ||
+ | 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< | ||
+ | for( Unit u : list ) { | ||
+ | System.out.println(u); | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | // public static void printAll2(ArrayList<? | ||
+ | public static <T extends Unit> void printAll2(ArrayList< | ||
+ | for( Unit u : list ) { | ||
+ | System.out.println(u); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== 타입에 안전한 열거형 (Typesafe enums) ===== | ||
+ | 이전까지 자바는 C언어와 달리 열거형이라는 것이 존재하지 않았으나 새로 추가되었다. 자바의 열거형은 C언어의 열거형보다 더 향상된 개념의 열거형으로 열거형이 갖는 값 뿐만아니라 타입까지 관리하기 때문에 보다 논리적인 오류를 줄일 수 있다. | ||
+ | <code java> | ||
+ | class Card { | ||
+ | static final int CLOVER | ||
+ | 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 java> | ||
+ | class Card { | ||
+ | enum Kind { CLOVER, HEART, DIAMOND, SPADE } | ||
+ | enum Value { TWO, THREE, FOUR } | ||
+ | | ||
+ | final Kind kind; // 타입이 int가 아닌 Kind임에 유의하자. | ||
+ | final Value value; | ||
+ | } | ||
+ | </ | ||
+ | 이전 방식으로는 타입이 달라도 값이 같으면 조건식결과가 true였으나, | ||
+ | <code java> | ||
+ | if(Card.CLOVER == Card.TWO) | ||
+ | if(Card.Kind.CLOVER == Card.Value.TWO) // false | ||
+ | </ | ||
+ | |||
+ | 예제 : 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, | ||
+ | | ||
+ | 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, | ||
+ | } | ||
+ | | ||
+ | public String toString() { | ||
+ | return " | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class Deck { | ||
+ | ArrayList< | ||
+ | | ||
+ | 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); | ||
+ | } | ||
+ | } | ||
</ | </ |