ìë°ì ì ì 12ì¥: ì§ë€ëŠì€, ìŽê±°í, ì ëí ìŽì
[ ì¶ì² ]
ìë°ì ì ì:
https://product.kyobobook.co.kr/detail/S000001550352
ìë°ì ì ì ì íëž:
https://www.youtube.com/playlist?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp
12-1 ì§ë€ëŠì€(Generics)ë?
- 컎íìŒ ì íì ì 첎í¬íŽ ì£Œë êž°ë¥(compile-time type check) - JDK1.5
// Tvê°ì²Žë§ ì ì¥í ì ìë ArrayList륌 ìì±
ArrayList<Tv> tvList = new ArrayList<Tv>();
tvList.add(new Tv()); // OK
tvList.add(new Audio()); // 컎íìŒ ìë¬. Tv ìžì ë€ë¥ž íì
ì ì ì¥ ë¶ê°
//Tv t = (Tv)tvList.get(0);
Tv t = tvList.get(0); // íë³í ë¶íì
1. ê°ì²Žì íì ìì ì±ì ì ê³µíë€.
2. íì 첎í¬ì íë³íì ìëµí ì ììŒë¯ë¡ ìœëê° ê°ê²°íŽì§ë€.
<ì°žê³ >
- ê°ì²Žì íì
ìì ì±ì ëìžë€ë ê²ì ìëíì§ ìì íì
ì ê°ì²Žë¥Œ ì ì¥íë ê²ì ë§ê³ , ì ì¥ë ê°ì²Žë¥Œ 꺌ëŽì¬ ë ìëì íì
곌 ë€ë¥ž íì
ìŒë¡ íë³íëìŽ ë°ìí ì ìë ì€ë¥ë¥Œ ì€ì¬ì€ë€ë ê²ìŽë€.
â ë°íìì ë°ìí ì ìë ìë¬ë¥Œ 컎íìŒ íìì ì¡ì ì ìë€. (ClassCastException íŽê²°)
- JDK1.5 ìŽí ì§ë€ëŠì€ê° ëì
ë ìŽíìë ì§ë€ëŠì€ë¥Œ êŒ ìšìŒ íë€.
â ìë¬ê° ëë ê²ì ìëì§ë§ ì ì¢ì ìœëë€.
12-2 íì ë³ì
- íŽëì€ë¥Œ ìì±í ë, Objectíì
ëì íì
ë³ì(E)륌 ì ìžíŽì ì¬ì©.
JDK1.5ë¶í° ìŒë°íŽëì€(Object) â ì§ë€ëŠ íŽëì€(íì ë³ì - E)ë¡ ë³ê²œ
public class ArrayList extends AbstractList { private transient Object[] elementData; public boolean add(Object o) { /* ëŽì©ìëµ */ } public Object get(int index) { /* ëŽì©ìëµ */ } ... }
â
public class ArrayList<E> extends AbstractList<E> { private transient E[] elementData; public boolean add(E o) { /* ëŽì©ìëµ */ } public E get(int index) { /* ëŽì©ìëµ */ } ... }
12-3 íì ë³ìì ëì íêž°
- ê°ì²Žë¥Œ ìì± ì, íì
ë³ì(E) ëì ì€ì íì
(Tv)ì ì§ì (ëì
)
// íì ë³ì E ëì ì ì€ì íì Tv륌 ëì // ì°žì¡°ë³ì ìì±ì ArrayList<Tv> tvList = new ArrayList<Tv>();
- íì
ìŽ ëì
ëê³ ë멎, ArrayListì ì ìžì í¬íšë íì
ë³ì Eê° ìëì ê°ìŽ ì§ì ë íì
ìŒë¡ ë°ëë€ê³ ìê°í멎 ëë€.
public class ArrayList<E> extends AbstractList<E> { private transient E[] elementData; public boolean add(E o) { /* ëŽì©ìëµ */ } public E get(int index) { /* ëŽì©ìëµ */ } ... }
â
public class ArrayList extends AbstractList { private transient Tv[] elementData; public boolean add(Tv o) { /* ëŽì©ìëµ */ } public Tv get(int index) { /* ëŽì©ìëµ */ } // Objectê° ìë Tv륌 ë°í ... }
- íì
ë³ì ëì ì€ì íì
ìŽ ì§ì ë멎, íë³í ìëµ ê°ë¥
â íë³íë§ ììŽì žë ìœë륌 íšì¬ ê°ê²°íê² í ì ìë€.
ArrayList tvList = new ArrayList(); tvList.add(new Tv()); Tv t = (Tv) tvList.get(0); // get ë°í type == Object
â
ArrayList<Tv> tvList = new ArrayList<Tv>(); tvList.add(new Tv()); Tv t = tvList.get(0); // íë³í ë¶íì
12-4 ì§ë€ëŠì€ ì©ìŽ
T íì ë³ì ëë íì ë§€ê°ë³ì. (Të íì 묞ì)
Box ìì íì (raw type)

12-5 ì§ë€ëŠ íì 곌 ë€íì±
- ì°žì¡° ë³ìì ìì±ìì ëì
ë íì
ì ìŒì¹íŽìŒ íë€.
ArrayList<Tv> list = new ArrayList<Tv>(); // Ok. ìŒì¹ ArrayList<Product> list = new ArrayList<Tv>(); // ìë¬. ë¶ìŒì¹ / ë€íì±ì²ëŒ Productì Tvê° ì¡°ì ìì êŽê³ì¬ë ì ëë€.
- ì§ë€ëŠ íŽëì€ê°ì ë€íì±ì ì±ëŠœ. (ì¬ì í ëì
ë íì
ì ìŒì¹íŽìŒ)
List<Tv> list = new ArrayList<Tv>(); // Ok. ë€íì±. ArrayListê° List륌 구í List<Tv> list = new LinkedList<Tv>(); // Ok. ë€íì±. ArrayListê° List륌 구í
- ë§€ê°ë³ìì ë€íì±ë ì±ëŠœ.
ArrayLisst<Product> list = new ArrayList<Product>(); list.add(new Product()); list.add(new Tv()); // Productì ììë OK. list.add(new Audio()); // Productì ììë OK.
ìì ê³ìžµë : Project â (Tv), (Audio)
boolean add(E e) { ... }
â
// Producetì ê·ž ìì ê°ì²Ž ê°ë¥(ë€íì±) // Product e = new Tv(); boolean add(Product e) { ... }
ìì 12-1
package Test; import java.util.ArrayList; import java.util.List; class Product {} class Tv extends Product {} class Audio extends Product {} class Ex12_1 { public static void main(String[] args) { ArrayList<Product> productList = new ArrayList<Product>(); ArrayList<Tv> tvList = new ArrayList<Tv>(); // ArrayList<Product> tvList2 = new ArrayList<Tv>(); // ìë¬ // List<Tv> tvList3 = new ArrayList<Tv>(); // OK. ë€íì± productList.add(new Tv()); // public boolean add(Product e) / Productì ê·ž ìì OK productList.add(new Audio()); // tvList.add(new Tv()); // public boolean add(Tv e) / Tv ê·ž ìì OK tvList.add(new Tv()); // tvList.add(new Audio()); // Tvì Audioë ìŽë í êŽê³ë ìêž° ë묞ì ë£ì ì ìì printAll(productList); // printAll(tvList); // 컎íìŒ ìë¬ê° ë°ìíë€. / ArrayList<Product> P = new ArrayList<Tv>(); ì°žì¡°ë³ìì íì 곌 ìì±ìì íì ë¶ìŒì¹ } public static void printAll(ArrayList<Product> list) { for (Product p : list) { System.out.println(p); } } }
12-7 Iterator<E>
- íŽëì€ë¥Œ ìì±í ë, Objectíì
ëì Tì ê°ì íì
ë³ì륌 ì¬ì©
public interface Iterator { boolean hasNext(); Object next(); void remove(); }
â
public interface Iterator<E> { boolean hasNext(); E next(); void remove(); }
Iterator it = list.iterator(); while (it.hasNext()) { Student s = (Student)it.next(); }
â
Iterator<Student> it = list.iterator(); while (it.hasNext()) { Student s = it.next(); // íë³í ë¶íì }
ìì 12-2
package Test; import java.util.ArrayList; import java.util.Iterator; class Main { public static void main(String[] args) { ArrayList<Student> list = new ArrayList<Student>(); list.add(new Student("ê°ê°ê°", 1, 1)); list.add(new Student("ë", 1, 2)); list.add(new Student("ë€324334", 2, 1)); Iterator<Student> it = list.iterator(); // Iterator it = list.iterator(); while (it.hasNext()) { // Student s = it.next(); // Student s = (Student) it.next(); // ì§ë€ëŠì€ë¥Œ ì¬ì©íì§ ììŒë©Ž íë³í íì. System.out.println(it.next().name); } } } class Student { String name = ""; int ban; int no; Student(String name, int ban, int no) { this.name = name; this.ban = ban; this.no = no; } }
12-8 HashMap<K,V>
- ì¬ë¬ ê°ì íì
ë³ìê° íìí 겜ì°, 윀ë§(,)륌 구ë¶ìë¡ ì ìž
HashMap<String, Student> map = new HashMap<String, Student>(); // ìì± map.put("ìë°", new Student("ìë°", 1, 1, 100, 100, 100)); // ë°ìŽí° ì ì¥
public class HashMap<K,V> extends AbstractMap<K,V> { // ìŒë¶ ìëµ ... public V get(Object key) { /* ëŽì© ìëµ */ } public V put(K key, V value) { /* ëŽì© ìëµ */ } public V remove(Object key) { /* ëŽì© ìëµ */ } ... }
â
public class HashMap<K,V> extends AbstractMap<K,V> { // ìŒë¶ ìëµ ... public Student get(Object key) { /* ëŽì© ìëµ */ } public Student put(String key, Student value) { /* ëŽì© ìëµ */ } public Student remove(Object key) { /* ëŽì© ìëµ */ } ... }
Student s1 = (Student) map.get("1-1");
â
Student s1 = map.get("1-1"); // íë³í ë¶íì
<ì¶ê°>
- JDK1.7ë¶í° ìì±ìì íì
ì§ì ìëµ ê°ë¥
HashMap<String, Student> map = new HashMap<String, Student>(); HashMap<String, Student> map = new HashMap<>(); // OK.
ìì 12-2
package chapter12; import java.util.*; class Ex12_2 { public static void main(String[] args) { HashMap<String, Student> map = new HashMap<>(); // jdk1.7ë¶í° ìì±ìì íì ì§ì ìëµê°ë¥ map.put("ìë°ì", new Student("ìë°ì", 1, 1, 100, 100, 100)); // public Student get(Object key) { Student s = map.get("ìë°ì"); System.out.println(map.get("ìë°ì").name); } // main } class Student { String name = ""; int ban; int no; int kor; int eng; int math; Student(String name, int ban, int no, int kor, int eng, int math) { this.name = name; this.ban = ban; this.no = no; this.kor = kor; this.eng = eng; this.math = math; } }
12-9 ì íë ì§ë€ëŠ íŽëì€
íì 묞ìë¡ ì¬ì©í íì ì ëª ìí멎 í ì¢ ë¥ì íì ë§ ì ì¥í ì ìëë¡ ì íí ì ìì§ë§, ê·žëë ì¬ì í 몚ë ì¢ ë¥ì íì ì ì§ì í ì ìë€ë ê²ìë ë³íšìŽ ìë€. ê·žë ë€ë©Ž, íì ë§€ê°ë³ì Tì ì§ì í ì ìë íì ì ì¢ ë¥ë¥Œ ì íí ì ìë ë°©ë²ì ììê¹?
- extendsë¡ ëì
í ì ìë íì
ì ì í
class FruitBox<T extends Fruit> { // Fruit곌 ê·ž ììë§ íì ìŒë¡ ì§ì ê°ë¥, Integer String ìŽë° ê±° ìëš // class FruitBox<T> { // 몚ë íì ê°ë¥ ArrayList<T> list = new ArrayList<T>(); ... } FruitBox<Apple> appleBox = new FruitBox<Apple>(); // OK FruitBox<Toy> toyBox = new FruitBox<Toy>(); // ìë¬. Toyë Fruitì ìììŽ ìë
ì¬ì í í ì¢ ë¥ì íì ë§ ëŽì ì ìì§ë§, Fruit íŽëì€ì ììë€ë§ ëŽì ì ìë€ë ì íìŽ ë ì¶ê°ëìë€.
- ìží°íìŽì€ìž 겜ì°ìë extends륌 ì¬ì©
interface Eatable {} class FruitBox<T extends Eatable> { ... } // implements ì ì
ìì 12-3
ììê³ìžµë
package Test; import java.util.ArrayList; class Fruit implements Eatable { public String toString() { return "Fruit"; } } class Apple extends Fruit {public String toString() { return "Apple"; }} class Grape extends Fruit {public String toString() { return "Grape"; }} class Toy {public String toString() { return "Toy"; }} interface Eatable {} public class Ex12_3 { public static void main(String[] args) { FruitBox<Fruit> fruitBox = new FruitBox(); FruitBox<Apple> appleBox = new FruitBox(); FruitBox<Grape> grapeBox = new FruitBox(); // FruitBox<Grape> grapeBox = new FruitBox<Apple>(); // ìë¬. íì ë¶ìŒì¹ // FruitBox<Toy> toyBox = new FruitBox(); // ìë¬. Toyë Fruitì ìì ìë fruitBox.add(new Fruit()); fruitBox.add(new Apple()); fruitBox.add(new Grape()); appleBox.add(new Apple()); // appleBox.add(new Grape()); // ìë¬. Grapeë appleì ìììŽ ìë grapeBox.add(new Grape()); System.out.println("fruitBox - " + fruitBox); System.out.println("appleBox - " + appleBox); System.out.println("grapeBox - " + grapeBox); } // main } // Fruitì ìììŽê³ Eatable ìží°íìŽì€ë¥Œ 구íí íŽëì€ë§ ê°ë¥ / ìží°íìŽì€ ê°ìŽìž ë '&' class FruitBox<T extends Fruit & Eatable> extends Box<T> {} // Boxë ëŽë¶ì ìŒë¡ ArrayList륌 ê°ì§ê³ ìì class Box<T> { ArrayList<T> list = new ArrayList<T>(); // itemì ì ì¥í list void add(T item) { list.add(item); } // ë°ì€ì itemì ì¶ê° T get(int i) { return list.get(i); } // ë°ì€ìì itemì êºŒëŒ ë int size() { return list.size(); } public String toString() { return list.toString();} }
12-11 ì§ë€ëŠì€ì ì ìœ
- íì
ë³ìì ëì
ì ìžì€íŽì€ ë³ë¡ ë€ë¥Žê² ê°ë¥
Box<Apple> appleBox = new Box<Apple>(); // OK. Appleê°ì²Žë§ ì ì¥ê°ë¥ Box<Grape> grapeBox = new Box<Grape>(); // OK. Grapeê°ì²Žë§ ì ì¥ê°ë¥
- staticë©€ë²ì íì
ë³ì ì¬ì© ë¶ê°
class Box<T> { static T item; // ìë¬ static int compare(T t1, T t2) { ... } // ìë¬ }
- ë°°ìŽ ìì±í ë íì
ë³ì ì¬ì©ë¶ê°. íì
ë³ìë¡ ë°°ìŽ ì ìžì ê°ë¥
class Box<T> { T[] itemArr; // OK. Tíì ì ë°°ìŽì ìí ì°žì¡°ë³ì ... T[] toArray() { T[] tmpArr = new T[itemArr.length]; // ìë¬. ì§ë€ëŠ ë°°ìŽ ìì±ë¶ê° } }
12-12 ììŒë 칎ë<?>
ì§ë€ëŠ íì ì ë€íì±ì ì ì©íë ë°©ë²
Q. ììŒë칎ëë ë§€ê°ë³ììë§ ì¬ì©?
<? super T> ììŒë 칎ëì íí ì í. Tì ê·ž ì¡°ìë€ë§ ê°ë¥
<?> ì í ìì. 몚ë íì ìŽ ê°ë¥. <? extends Object>ì ëìŒ
- íëì ì°žì¡° ë³ìë¡ ëì
ë íì
ìŽ ë€ë¥ž ê°ì²Žë¥Œ ì°žì¡° ê°ë¥
ArrayList<? extends Product> list = new ArrayList<Tv>(); // OK ArrayList<? extends Product> list = new ArrayList<Audio>(); // OK ArrayList<Product> list = new ArrayList<Tv>(); // ìë¬. ëì ë íì ë¶ìŒì¹
- ë©ìëì ë§€ê°ë³ìì ììŒë 칎ë륌 ì¬ì©
static Juice makeJuice(FruitBox<? extends Fruit> box) { // Fruit곌 ê·ž ìì ê°ë¥ String tmp = ""; for (Fruit f : box.getList()) tmp += f + " "; return new Juice(tmp); } // ë ë€ ê°ë¥ Juicer.makeJuice(new FruitBox<Fruit>()); Juicer.makeJuice(new FruitBox<Apple>());
ìì 12-4
package Test; import java.util.ArrayList; class Fruit { public String toString() { return "Fruit"; } } class Apple extends Fruit { public String toString() { return "Apple"; } } class Grape extends Fruit { public String toString() { return "Grape"; } } class Juice { String name; Juice(String name) { this.name = name + "Juice"; } public String toString() { return name; } } class Juicer { // Fruit곌 ê·ž ììë§ íì ë³ìë¡ ì€ì ê°ë¥ static Juice makeJuice(FruitBox<? extends Fruit> box) { String tmp = ""; for (Fruit f : box.getList()) { tmp += f + " "; } return new Juice(tmp); } } class Main { public static void main(String[] args) { // ì ì¥ íì ì FruitìŒë¡ ì í FruitBox<Fruit> fruitBox = new FruitBox<Fruit>(); FruitBox<Apple> appleBox = new FruitBox<Apple>(); fruitBox.add(new Fruit()); fruitBox.add(new Apple()); fruitBox.add(new Grape()); // ë§€ê°ë³ìì ë€íì± ì±ëŠœ ìì Ok. appleBox.add(new Apple()); appleBox.add(new Apple()); System.out.println(Juicer.makeJuice(new FruitBox<Apple>())); // static ë©ìë System.out.println(Juicer.makeJuice(fruitBox)); System.out.println(Juicer.makeJuice(appleBox)); } } // ì 빚ê°ì€..? ììì ë°ìŒë©Ž ìì íŽëì€ìì ì¡°ìì ë©€ë²ë€ì ìž ì ììŒëê¹ ì§ë€ëŠ íì ì ìììŒíŽì ìžë¯? // Fruit곌 ê·ž ììë§ íì ë³ìë¡ ì€ì ê°ë¥ class FruitBox<T extends Fruit> extends Box<T> {} // ëŽë¶ì ArrayList륌 ê°ì§ê³ ìì class Box<T> { ArrayList<T> list = new ArrayList(); // ë°ííì ìŽ T(ì ë€ëŠ) void add(T item) { list.add(item); } T get(int i) { return list.get(i); } // ArrayList륌 ë°í ArrayList<T> getList() { return list; } int size() { return list.size(); } @Override public String toString() { return list.toString(); } }
12-14 ì§ë€ëŠ ë©ìë
- ì§ë€ëŠ íì
ìŽ ì ìžë ë©ìë(íì
ë³ìë ë©ìë ëŽììë§ ì íš)
static <T> void sort(List<T> list, Comparator<? super T> c)
- íŽëì€ì íì
ë§€ê°ë³ì<T>ì ë©ìëì íì
ë§€ê°ë³ì <T>ë ë³ê°
class FruitBox<T> { // ì§ë€ëŠ íŽëì€ ... static <T> void sort(List<T> list, Comparator<? super T> c) { // ì§ë€ëŠ ë©ìë ... } }
â ivì lvì êŽê³ì ê°ë€ê³ ìŽíŽí멎 ëš / ë©ìë ëŽììë lvê° ì°ì ëë ê²ì²ëŒ ì§ë€ëŠ ë©ìë ëŽì ìë íì ë³ìê° ì°ì ëë€.
- ë©ìë륌 ížì¶í ëë§ë€ íì
ì ëì
íŽìŒ íë€.(ëë¶ë¶ ìëµ ê°ë¥)
FruitBox<Fruit> fruitBox = new FruitBox<Fruit>(); FruitBox<Apple> appleBox = new FruitBox<Apple>(); System.out.println(Juicer.<Fruit>makeJuice(fruitBox)); System.out.println(Juicer.<Apple>makeJuice(appleBox));
static <T extends Fruit> Juice makeJuice(FruitBox<T> box) { String tmp = ""; for (Fruit f : box.getList()) { tmp += f + " "; } return new Juice(tmp); }
ììŒë칎ë = íëì ì°žì¡°ë³ìë¡ ìë¡ ë€ë¥ž íì ìŽ ëì ë ì¬ë¬ ì§ë€ëŠ ê°ì²Žë¥Œ ë€ë£šêž° ìí ê²
ì§ë€ëŠ ë©ìë = ì§ë€ëŠ íŽëì€ì²ëŒ ë©ìë륌 ížì¶í ëë§ë€ ë€ë¥ž ì§ë€ëŠ íì ì ëì í ì ìê² í ê²
ë ê°ì ì©ëë ìì í ë€ëŠ / ììŒë칎ëê° ì¬ì©ë¶ê°ë¥í ë ì§ë€ëŠ ë©ìë륌 ë§ìŽ ìŽë€.
- ë©ìë륌 ížì¶í ë íì
ì ìëµíì§ ìì ëë íŽëì€ ìŽëŠ ìëµ ë¶ê°
â ìëµ ì íë ê²œì° ê±°ì ìì ì 겜 ì ìšë ëš
System.out.println(<Fruit>makeJuice(fruitBox)); // ìë¬. íŽëì€ ìŽëŠ ìëµë¶ê° System.out.println(this.<Fruit>makeJuice(fruitBox)); // OK System.out.println(Juicer.<Fruit>makeJuice(fruitBox)); // Ok
12-15 ì§ë€ëŠ íì ì íë³í
- ì§ë€ëŠ íì
곌 ìì íì
ê°ì íë³íì ë°ëì§íì§ ìë€.(ê²œê³ ë°ì)
Box<Object> objBox = null; Box box = (Box) objBox; // OK. ì§ë€ëŠ íì -> ìì íì . ê²œê³ ë°ì objBox = (Box<Object>) box; // OK. ììíì -> ì§ë€ëŠ íì . ê²œê³ ë°ì objBox = (Box<Object>) strBox; // ìë¬. Box<String> -> Box<Object> strBox = (Box<String>) objBox; // ìë¬. Box<Object> -> Box<String> // Box<String> b = new Box<Object>(); // ê° ì ëë ë§¥ëœê³Œ ê°ì
// ê°ì ë»ì Box b = new Box<String>(); b.add(new Integer(100)); //Box b = (Box) new Box<String>(); //bStr = (Box<String>) b; // Box -> Box<String> ê°ë¥ but 겜ê³
- ììŒë 칎ëê° ì¬ì©ë ì§ë€ëŠ íì
ìŒë¡ë íë³í ê°ë¥
// Box<Object> objBox = (Box<Object>) new Box<String>(); // ìë¬. íë³í ë¶ê°ë¥ Box<? extends Object> wBox = (Box<? extends Object>) new Box<String>(); // OK Box<? extends Object> wBox = new Box<String>(); // ì 묞ì¥ê³Œ ëìŒ // Objectì ê·ž ìì ê°ë¥
// ë§€ê°ë³ìë¡ FruitBox<Fruit>, FruitBox<Apple>, FruitBox<Grape> ë±ìŽ ê°ë¥ static Juice makeJuice(FruitBox<? extends Fruit> box) { FruitBox<? extends Fruit> box = new FruitBox<Fruit>(); // OK (FruitBox<? extends Fruit>) ìŒë¡ íë³íìŽ ê°ë¥íëš ë»ìŽë€. FruitBox<? extends Fruit> box = new FruitBox<Apple>(); // OK }
Ex12_3.java
// FruitBox<Apple> -> FruitBox<? extends Fruit> ê°ë¥ FruitBox<? extends Fruit> abox = new FruitBox<Apple>(); // FruitBox<? extends Fruit> -? FruitBox<Apple> ê°ë¥? ê°ë¥!!! FruitBox<Apple> appleBox = (FruitBox<Apple>) abox; // OK. ê²œê³ ë°ì
12-16 ì§ë€ëŠ íì ì ì ê±°
컎íìŒë¬ë ì§ë€ëŠ íì ì ì ê±°íê³ , íìí ê³³ì íë³íì ë£ëë€. â 컎íìŒë íìŒ(*.class)ìë ì§ë€ëŠ íì ì ëí ì ë³Žê° ìë€.
why? ì§ë€ëŠìŽ ëì ëêž° ìŽì (JDK1.5 ìŽì )ì ìì€ ìœëìì ížíì±ì ì ì§íêž° ìíŽììŽë€.(íìížíì±)
- ì§ë€ëŠ íì
ì 겜ê³(bound)륌 ì ê±°
class Box <T extends Fruit> void add(T t) { ... } }
â
class Box { void add(Fruit t) { ... } }
why? JDK1.5 ìŽì ë²ì ë 묞ì ììŽ ëìê° ì ìëë¡ íêž° ìíŽì(íìížíì±)
ê·žëì ì§ë€ëŠì 컎íìŒ íììë§ ì¡Žì¬íë€.
<T> â Object
(Ʞ볞)<T extneds Fruit> â Fruit
(íì ìŽ ì íë 겜ì°ìë ì íë íì ìŒë¡ )
- ì§ë€ëŠ íì
ì ê±° íì íì
ìŽ ë¶ìŒì¹í멎, íë³íì ì¶ê°
T get(int i) { return list.get(i); }
â
Fruit get(int i) { return (Fruit) list.get(i); // ë°í íì ìŽ ObjectìŽêž° ë묞ì íë³íìŽ íìíš }
ì°ëŠ¬ê° íë³íì ìëµíë€ê³ íŽì íë³íì ì íŽë ëë ê²ìŽ ìëëŒ ì»ŽíìŒë¬ê° ì¶ê°ë¥Œ íŽì€ë€.
- ììŒë 칎ëê° í¬íšë 겜ì°, ì ì í íì
ìŒë¡ íë³í ì¶ê°
static Juice makeJuice(FruitBox<? extends Fruit> box) { String tmp = "" ; for (Fruit f : box.getList()) { tmp += f " "; } return new Juice(tmp); }
â
static Juice makeJuice(FruitBox box) { String tmp = ""; Iterator it = box.getList().iterator(); while (it.hasNext()) { tmp += (Fruit) it.next() + " "; // ë°í íì ìŽ ObjectìŽë¯ë¡ íë³í íë€. } return new Juice(tmp); }
ê²°ë¡ â 컎íìŒ íì ì ì§ë€ëŠ íì ì ììŽì§ë€.
12-17 ìŽê±°í(enum)
- êŽë šë ììë€ì ê°ìŽ ë¬¶ìŽ ëì ê². 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; }
â
class Card { enum Kind { CLOVER, HEART, DIAMOND, SPADE } enum Value { TOW, THREE, FOUR } final Kind kind; final Value value; }
if (Card.Kind.CLOVER == Card.Value.TWO)
// 컎íìŒ ìë¬. íì ìŽ ë¬ëŒì ë¹êµ ë¶ê°â Javaì ìŽê±°íì ê°&íì 몚ë 첎í¬
12-18 ìŽê±°í(enum)
- ìŽê±°íì ì ìíë ë°©ë²
enum ìŽê±°íìŽëŠ { ììëª 1, ììëª 2, ... }
- ìŽê±°í íì
ì ë³ì륌 ì ìžíê³ ì¬ì©íë ë°©ë²
enum Direction { EAST, SOUTH, WEST, NORTH } class Unit { int x, y; // ì ëì ìì¹ Direction dir; // ìŽê±°í ìžì€íŽì€ ë³ì(iv)륌 ì ìž void init() { dir = Direction.EAST; // ì ëì ë°©í¥ì EASTë¡ ìŽêž°í } }
- ìŽê±°í ììì ë¹êµì ==ì compareTo() ì¬ì© ê°ë¥
if (dir == Direction.EAST) { // true x++; } else if (dir > Direction.WEST) { // ìë¬ ìŽê±°í ììì ë¹êµì°ì°ì ì¬ì© ë¶ê° } else if (dir.compareTo(Direction.WEST) > 0) { // compareTo()ë ì¬ì© ê°ë¥ }
compareTo() : ìŒìªœìŽ í¬ë©Ž ìì / ì€ë¥žìªœìŽ í¬ë©Ž ìì / ê°ìŒë©Ž 0
12-19 ìŽê±°íì ì¡°ì - java.lang.Enum
- 몚ë ìŽê±°íì Enumì ìììŽë©°, ìëì ë©ìë륌 ììë°ëë€.
ë©ìë ì€ëª Class<E> getDeclaringClass() ìŽê±°íì Classê°ì²Žë¥Œ ë°í String name() ìŽê±°í ììì ìŽëŠì 묞ììŽë¡ ë°í int ordinal() ìŽê±°í ììê° ì ìë ìì륌 ë°í(0ë¶í° ìì) T valueOf(Class<T> enumType, String name) ì§ì ë ìŽê±°íìì name곌 ìŒì¹íë ìŽê±°í ìì륌 ë°í
- values(), valueOf()ë 컎íìŒë¬ê° ìëìŒë¡ ì¶ê°
static E[] values() static E valueOf(String name) Direction[] dArr = Direction.values(); //Direction d = Direction.valueOf("WEST"); for (Direction d : dArr) { System.out.printf("%s=%d\n", d.name(), d.ordinal()); }
ìŽê±°í ììê° ê°ì²ŽìŽêž° ë묞ì ë¹êµ ì°ì°ì륌 ìž ì ìê³ compareTo()ì equals()륌 ìŽë€.
ìì 12-5
package chapter12; enum Direction { EAST, SOUTH, WEST, NORTH } class Ex12_5 { public static void main(String[] args) { Direction d1 = Direction.EAST; Direction d2 = Direction.valueOf("WEST"); Direction d3 = Enum.valueOf(Direction.class, "EAST"); System.out.println("d1="+d1); System.out.println("d2="+d2); System.out.println("d3="+d3); System.out.println("d1==d2 ? "+ (d1==d2)); System.out.println("d1==d3 ? "+ (d1==d3)); System.out.println("d1.equals(d3) ? "+ d1.equals(d3)); // íëíëê° ê°ì²ŽìŽêž° ë묞ì equalsë¡ ë¹êµê° ê°ë¥íë€. // System.out.println("d2 > d3 ? "+ (d1 > d3)); // ìë¬ System.out.println("d1.compareTo(d3) ? "+ (d1.compareTo(d3))); System.out.println("d1.compareTo(d2) ? "+ (d1.compareTo(d2))); switch(d1) { case EAST: // Direction.EASTëŒê³ ìž ì ìë€. System.out.println("The direction is EAST."); break; case SOUTH: System.out.println("The direction is SOUTH."); break; case WEST: System.out.println("The direction is WEST."); break; case NORTH: System.out.println("The direction is NORTH."); break; default: System.out.println("Invalid direction."); break; } Direction[] dArr = Direction.values(); // ìŽê±°íì 몚ë ìì륌 ë°°ìŽë¡ ë°í. for(Direction d : dArr) // for(Direction d : Direction.values()) System.out.printf("%s=%d%n", d.name(), d.ordinal()); // ìì } }
12-20 ìŽê±°íì ë©€ë² ì¶ê°íêž°
- ë¶ì°ìì ìž ìŽê±°í ììì 겜ì°, ìíë ê°ì êŽíž()ìì ì ëë€.
enum Direction { EAST(1), SOUTH(5), WEST(-1), NORTH(10) } // () ìì±ì ížì¶ZZ v
- êŽíž()륌 ì¬ì©íë €ë©Ž, ìžì€íŽì€ ë³ìì ìì±ì륌 ìë¡ ì¶ê°íŽ ì€ìŒ íë€.
enum Direction { EAST(2), SOUTH(3), WEST(-1), NORTH(10); // ëì ';'륌 ì¶ê°íŽìŒ íë€. private final int value; // ì ì륌 ì ì¥í íë(ìžì€íŽì€ ë³ì)륌 ì¶ê° // ìì±ì륌 ì¶ê°, private ìëµ(ìì±íë íì privateìŽêž° ë묞) Direction(int value) { this.value = value; } public int getValue() { return value; } }
- ìŽê±°íì ìì±ìë 묵ìì ìŒë¡ privateìŽë¯ë¡, ìžë¶ìì ê°ì²Ž ìì±ë¶ê°
Direction d = new Direction(1); // ìë¬. ìŽê±°íì ìì±ìë ìžë¶ìì ížì¶ë¶ê°.
ìì 12-6
package chapter12; enum Direction2 { EAST(1, ">"), SOUTH(2,"V"), WEST(3, "<"), NORTH(4,"^"); private static final Direction2[] DIR_ARR = Direction2.values(); private final int value; private final String symbol; Direction2(int value, String symbol) { // ì ê·Œ ì ìŽì privateìŽ ìëµëš this.value = value; this.symbol = symbol; } public int getValue() { return value; } public String getSymbol() { return symbol; } public static Direction2 of(int dir) { if (dir < 1 || dir > 4) throw new IllegalArgumentException("Invalid value :" + dir); return DIR_ARR[dir - 1]; } // ë°©í¥ì íì ìí€ë ë©ìë. numì ê°ë§íŒ 90ëì© ìê³ë°©í¥ìŒë¡ íì íë€. public Direction2 rotate(int num) { num = num % 4; if(num < 0) num +=4; // numìŽ ìììŒ ëë ìê³ë°ë ë°©í¥ìŒë¡ íì return DIR_ARR[(value-1+num) % 4]; } public String toString() { return name()+getSymbol(); } } // enum Direction2 class Ex12_6 { public static void main(String[] args) { for(Direction2 d : Direction2.values()) System.out.printf("%s=%d%n", d.name(), d.ordinal()); Direction2 d1 = Direction2.EAST; Direction2 d2 = Direction2.of(2); System.out.printf("d1=%s, %d%n", d1.name(), d1.getValue()); System.out.printf("d2=%s, %d%n", d2.name(), d2.getValue()); System.out.println(Direction2.EAST.rotate(1)); System.out.println(Direction2.EAST.rotate(2)); System.out.println(Direction2.EAST.rotate(-1)); System.out.println(Direction2.EAST.rotate(-2)); } }
12-23 ì ëí ìŽì ìŽë?
- 죌ìì²ëŒ íë¡ê·žëë° ìžìŽì ìí¥ì 믞ì¹ì§ ììŒë©°, ì ì©í ì 볎륌 ì ê³µ
- ì ëí
ìŽì
ì ì¬ì©ì
// JUnit ëšì í ì€íž íë¡ê·žëš @Test // ìŽ ë©ìëê° í ì€íž ëììì í ì€íž íë¡ê·žëšìê² ì늰ë€. public void method() { ... }
12-24 íì€ ì ëí ìŽì
- Javaìì ì ê³µíë ì ëí ìŽì
12-25 @Override
- ì€ë²ëŒìŽë©ì ì¬ë°ë¥Žê² íëì§ ì»ŽíìŒë¬ê° 첎í¬íê² íë€.
- ì€ë²ëŒìŽë©í ë ë©ìë ìŽëŠì ì못ì ë ì€ì륌 íë 겜ì°ê° ë§ë€.
class Parent { void parentMethod() { } } class Child extends Parent { vodi parentmethod() { } // ì€ë²ëŒìŽë©íë € íìŒë ì€ìë¡ ìŽëŠì ì못ì ì }
- ì€ë²ëŒìŽë©í ëë ë©ìë ì ìžë¶ ìì @Override륌 ë¶ìŽì.
class Child extends Parent { void parentMethod() { } }
â
class Child extends Parent { @Override void parentmethod() { } }
12-26 @Deprecated
- ììŒë¡ ì¬ì©íì§ ìì ê²ìŒë¡ ê¶ì¥íë íëë ë©ìëì ë¶ìžë€.
- @Deprecatedì ì¬ì© ì, DateíŽëì€ì getDate()
@Deprecated public int getDate() { return normalize().getDayOfMonth(); }
- Deprecatedê° ë¶ì ëììŽ ì¬ì©ë ìœë륌 컎íìŒí멎 ëíëë ë©ìì§
ìë¬ X, ê²œê³ O
12-27 @FunctionalInterface
- íšìí ìží°íìŽì€ì ë¶ìŽë©Ž, 컎íìŒë¬ê° ì¬ë°ë¥Žê² ìì±íëì§ ì²Ží¬
íšìí ìží°íìŽì€ìë íëì ì¶ìë©ìëë§ ê°ì žìŒ íë€ë ì ìœìŽ ìì
@FunctionalInterface public interface Runnable { public abstract void run(); // ì¶ìë©ìë }
12-27 @SuppressWarnings
- 컎íìŒë¬ì ê²œê³ ë©ìì§ê° ëíëì§ ìê² ìµì íë€.
- êŽíž()ìì ìµì íê³ ìíë ê²œê³ ì ì¢
ë¥ë¥Œ 묞ììŽë¡ ì§ì
@SuppressWarnings("unchecked") // ì§ë€ëŠì€ì êŽë šë ê²œê³ ë¥Œ ìµì ArrayList list = new ArrayList(); // ì§ë€ëŠ íì ì ì§ì íì§ ììì list.add(obj); // ì¬êž°ì ê²œê³ ê° ë°ì
컎íìŒë¬ê° ìë €ì£Œë ê²œê³ ë¥Œ ë³Žê³ ëŽê° íìžíë€ë ë»
- ë ìŽìì ê²œê³ ë¥Œ ëìì ìµì íë €ë©Ž ë€ì곌 ê°ìŽ íë€.
@SuppressWarnings ({"deprecation", "unchecked", "varargs", "rawypes"})
- âXlintâìµì
ìŒë¡ 컎íìŒí멎, ê²œê³ ë©ìì§ë¥Œ íìží ì ìë€.
êŽíž[]ììŽ ê²œê³ ì ì¢ ë¥. ìëì ê²œì° rawtypes
12-29 ë©í ì ëí ìŽì
â ì ëí ìŽì ì ë§ë€ ë ì¬ì©
- ë©í ì ëí ìŽì ì âìëí ìŽì ì ìí ì ëí ìŽì â
- ë©í ì ëí ìŽì ì java.lang.annotation íší€ì§ì í¬íš
ì ëí ìŽì | ì€ëª |
---|---|
@Target | ì ëí ìŽì ìŽ ì ì©ê°ë¥í ëìì ì§ì íëë° ì¬ì©íë€. |
@Documented | ì ëí ìŽì ì ë³Žê° javadocìŒë¡ ìì±ë 묞ìì í¬íšëê² íë€. |
@Inherited | ì ëí ìŽì ìŽ ìì íŽëì€ì ììëëë¡ íë€. |
@Retention | ì ëí ìŽì ìŽ ì ì§ëë ë²ì륌 ì§ì íëë° ì¬ì©íë€. |
@Repeatable | ì ëí ìŽì ì ë°ë³µíŽì ì ì©í ì ìê² íë€.(JDK1.8) |
12-30 @Target
- ì ëí
ìŽì
ì ì ìí ë, ì ì©ëì ì§ì ì ì¬ì©
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) @Retention(RetentionPolicy.SOURCE) public @interface SuppressWarnings { String[] value(); }
ëì íì ì믞 ANNOTATION_TYPE ì ëí ìŽì CONSTRUCTOR ìì±ì LOCAL_VARIABLE ì§ìë³ì METHOD ë©ìë PACKAGE íší€ì§ PARAMETER ë§€ê°ë³ì TYPE íì (íŽëì€, ìží°íìŽì€, enum) TYPE_PARAMETER íì ë§€ê°ë³ì(JDK1.8) TYPE_USE íì ìŽ ì¬ì©ëë 몚ë ê³³(JDK1.8) import static java.lang.annotation.ElementType.*; @Target({FIELD, TYPE, TYPE_USE}) // ì ì©ëììŽ FIELD, TYPE, TYPE_USE public @interface MyAnnotation { } // MyAnnotationì ì ì @MyAnnotation class MyClass { @MyAnnotation int i; // ì ì©ëììŽ FIELDìž ê²œì° @MyAnnotation MyClass mc; // ì ì©ëììŽ TYPE_USEìž ê²œì° }
12-31 @Retention
- ì ëí
ìŽì
ìŽ ì ì§(Retention)ëë êž°ê°ì ì§ì íëë° ì¬ì©
ì ì§ ì ì± ì믞 SOURCE ìì€ íìŒìë§ ì¡Žì¬, íŽëì€íìŒìë 졎ì¬íì§ ìì CLASS íŽëì€ íìŒìë§ ì¡Žì¬, ì€í ìì ì¬ì©ë¶ê°. êž°ë³žê° RUNTIME íŽëì€ íìŒì 졎ì¬. ì€í ìì ì¬ì©ê°ë¥ êž°ë³žê° ì ì ì. sourceë runtimeë§ ììë멎 ëë€.
- 컎íìŒë¬ì ìíŽ ì¬ì©ëë ì ëí
ìŽì
ì ì ì§ ì ì±
ì SOURCEì
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override {}
ex) @Override - ì€ë²ëŒìŽë© ì²Ží¬ / 컎íìŒë¬ê° 첎í¬íê³ ëìŽêž° ë묞ì ì€í ìì íì ììãŽ
- ì€í ìì ì¬ì© ê°ë¥í ì ëí
ìŽì
ì ì ì±
ì RUNTIMEìŽë€.
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface FunctionalInterface {}
12-32 @Documented, @Inherited
â ë§ìŽ ì¬ì© X, ê°ë³ê² ììë§ ë멎 ëš
- javadocìŒë¡ ìì±í 묞ìì í¬íšìí€ë €ë©Ž @Documented륌 ë¶ìžë€.
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface FunctionalInterface {}
- ì ëí
ìŽì
ì ìì íŽëì€ì ììíê³ ì í ë, @Inherited륌 ë¶ìžë€.
@Inherited // @SuperAnnoê° ììê¹ì§ ìí¥ ë¯žì¹ê² @interface SuperAnno {} @SuperAnno class Parent { } class Child extends Parent {} // Childì ì ëí ìŽì ìŽ ë¶ì ê²ìŒë¡ ìžì
12-33 @Repeatable
- ë°ë³µíŽì ë¶ìŒ ì ìë ì ëí
ìŽì
ì ì ìí ë ì¬ì©
@Repeatable(ToDos.class) // ToDoì ëí ìŽì ì ì¬ë¬ ë² ë°ë³µíŽì ìž ì ìê² íë€. @interface ToDo { String value(); }
- @RepeatableìŽ ë¶ì ì ëí
ìŽì
ì ë°ë³µíŽì ë¶ìŒ ì ìë€.
@ToDo("delete test codes."); @ToDo("override inherited methods"); class MyClass { ... }
- @Repeatableìž @ToDo륌 íëë¡ ë¬¶ì 컚í
ìŽë ì ëí
ìŽì
ë ì ìíŽìŒ íš
@interface ToDos { // ì¬ë¬ ê°ì ToDoì ëí ìŽì ì ëŽì 컚í ìŽë ì ëí ìŽì ToDos ToDo[] value(); // ToDoì ëí ìŽì ë°°ìŽíì ì ìì륌 ì ìž. ìŽëŠìŽ ë°ëì valueìŽìŽìŒ íš }
12-34 ì ëí ìŽì íì ì ìíêž°
ë©ìëìžë° ì ì€ì ì§ì í ëë ë³ìì²ëŒã·ì?
- ì ëí
ìŽì
ì ì§ì ë§ë€ìŽ ìž ì ìë€.
@interface ì ëí ìŽì ìŽëŠ { íì ìììŽëŠ(); // ì ëí ìŽì ì ìì륌 ì ìžíë€. ... }
@interface DateTime { String yymmdd(); // ë ì§ String hhmmss(); // ìê° }
- ì ëí
ìŽì
ì ë©ìëë ì¶ì ë©ìëìŽë©°, ì ëí
ìŽì
ì ì ì©í ë ì§ì (ìì X)
@interface TestInfo { int count(); String testedBy(); String[] testTools(); TestType testType(); // enum TestType { FIRST, FINAL } Datetime testDate(); // ìì ìŽ ìë ë€ë¥ž ì ëí ìŽì (@DateTime)ì í¬íší ì ìë€. }
@TestInfo( // ì¬ì©ì count = 3, testedBy = "Kim", testTools = {"JUnit", "AutoTester"}, testTYpe = TestType.FIRST, testDate = @DateTime(yymmdd="160101", hhmmss="235959") ) public class NewClass { ... }
12-35 ì ëí ìŽì íì ì ìíêž°
- ì ì© ì ê°ì ì§ì íì§ ììŒë©Ž, ì¬ì©ë ì ìë êž°ë³žê° ì§ì ê°ë¥(null ì ìž)
@interface TestInfo { int count() default 1; // Ʞ볞ê°ì 1ë¡ ì§ì } @TestInfo // @TestInfo(count=1)곌 ëìŒ public class NewClass { ... }
- ììê° íëìŽê³ ìŽëŠìŽ valueìŒ ëë ììì ìŽëŠ ìëµê°ìŒ
@interface TestInfo { String value(); } @TestInfo("passed") class newClass { ... }
- ììì íì
ìŽ ë°°ìŽìž 겜ì°, êŽíž{}륌 ì¬ì©íŽìŒ íë€.
@interface TestInfo { String[] testTools(); }
@Test(testTools={"JUnit", "AutoTestar"}) @Test(testTools={"JUnit"}) @Test(testTools={}) // ê°ìŽ ìì ëë êŽíž{}ê° ë°ëì íì
12-36 몚ë ì ëí ìŽì ì ì¡°ì - java.lang.annotation.Annotation
- Annotationì 몚ë ì ëí
ìŽì
ì ì¡°ììŽì§ë§ ìì ë¶ê°
@interface TestInfo extends Annotation { // ìë¬. íì©ëì§ ìë íí int count(); String testedBy(); ... }
- ì¬ì€ Annotationì ìží°íìŽì€ìŽë€.
package java.lang.annotation; public interface Annotation { boolean equals(Object obj); int hashCode(); String toString(); Class<? extedns Annotation> annotationType(); // ì ëí ìŽì ì íì ì ë°í }
몚ë ì ëí ìŽì ì ì¡°ìì Annotation ìží°íìŽì€ìŽê³ ìì ê°ì ì¶ì ë©ìëë€ì ê°ì§ê³ ìë€.
ìŽ ì¶ìë©ìëë 구ííì§ ììë ì¬ì©í ì ìë€. 몚ë ì ëí ìŽì ì ì¶ìë©ìëë€ì í¬íšíê³ ìë ì ìŽë©° ë€ë¥ž ììë€ì²ëŒ 구ííì§ ìê³ ë ì¬ì©í ì ìë€.
12-37 ë§ì»€ ì ëí ìŽì - Marker Annotation
- ììê° íëë ì ìëì§ ìì ì ëí
ìŽì
@Target (ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override {} // ë§ì»€ ì ëí ìŽì . ì ìë ììê° íëë ìë€. @Target (ElementType.METHOD) @Retention(RetentionPolicy/SOURCE) public @interface Test {} //ë§ì»€ ì ëí ìŽì . ì ìë ììê° íëë ìë€.
â ëëší 걎 ìëê³ ê·žë¥ ìŽë° ìŽëŠì ë¶ì¬ì ë¶ë¥žë€ë ê²ë§ ì멎 ëë€.
@Test // ìŽ ë©ìëê° í ì€íž ëììì í ì€íž íë¡ê·žëšìê² ì늰ë€. public void method() { ... } @Deprecated public int getDate() { return normalize().getDayOfMonth(); }
ë°ë¡ í ë¹í ê°ì ìì§ë§ 졎ì¬íë ê²ë§ìŒë¡ë ìŽ ì ëí ìŽì ì ì¬ì©íë íë¡ê·žëšìê² ì¶©ë¶í ì 볎ì
12-38 ì ëí ìŽì ììì ê·ì¹
- ì ëí
ìŽì
ì ìì륌 ì ìží ë ìëì ê·ì¹ì ë°ëì ì§ìŒìŒ íë€.
- ììì íì ì Ʞ볞í, String enum, ì ëí ìŽì , Class(ì€ê³ë ê°ì²Ž)ë§ íì©ëš
- êŽíž()ìì ë§€ê°ë³ì륌 ì ìží ì ìë€.
- ììžë¥Œ ì ìží ì ìë€.
- ìì륌 íì ë§€ê°ë³ìë¡ ì ìí ì ìë€.
- ìëì ìœëìì ì못ë ë¶ë¶ì 묎ììžì§ ìê°íŽë³Žì.
@interface AnnoTest { int id = 100; // ìì OK. default ë©ìë X String major(int i, int j); // êŽíž ìì ë§€ê°ë³ì ì ìž ë¶ê°ë¥ãŽ String minor() throws Exception; // ììž ì ìž ìëš ArrayList<T> list; // ìì륌 íì ë§€ê°ë³ìë¡ ì ìí ì ìë€. }
ê± ê°ëší ë³Žê³ ëìŽê°êž°.. ìžìžíì ì í ìì
ìì 12-8
package chapter12; import java.lang.annotation.*; import java.util.ArrayList; @Deprecated @SuppressWarnings("1111") // ì íšíì§ ìì ì ëí ìŽì ì 묎ìëë€. @TestInfo(testedBy="aaa", testDate=@DateTime(yymmdd="160101",hhmmss="235959")) class Ex12_8 { public static void main(String args[]) { ArrayList<Object> list = new ArrayList<Object>(); list.add(3); // Ex12_8ì Classê°ì²Žë¥Œ ì»ëë€. Class<Ex12_8> cls = Ex12_8.class; TestInfo anno = cls.getAnnotation(TestInfo.class); System.out.println("anno.testedBy()="+anno.testedBy()); System.out.println("anno.testDate().yymmdd()=" +anno.testDate().yymmdd()); System.out.println("anno.testDate().hhmmss()=" +anno.testDate().hhmmss()); for(String str : anno.testTools()) System.out.println("testTools="+str); System.out.println(); // Ex12_8ì ì ì©ë 몚ë ì ëí ìŽì ì ê°ì žìšë€. Annotation[] annoArr = cls.getAnnotations(); for(Annotation a : annoArr) System.out.println(a); } // mainì ë } // @InitParam @Retention(RetentionPolicy.RUNTIME) // ì€í ìì ì¬ì©ê°ë¥íëë¡ ì§ì @interface TestInfo { int count() default 1; String testedBy(); String[] testTools() default "JUnit"; TestType testType() default TestType.FIRST; DateTime testDate(); } @Retention(RetentionPolicy.RUNTIME) // ì€í ìì ì¬ì©ê°ë¥íëë¡ ì§ì @interface DateTime { String yymmdd(); String hhmmss(); } enum TestType { FIRST, FINAL }
ð12ì¥ ì°ìµë¬žì
Uploaded by N2T