1. μ§λ€λ¦μ€(Generics)λ?
μ§λ€λ¦μ€(Generics)λ?
μ»΄νμΌ μ νμ
μ 체ν¬ν΄ μ£Όλ κΈ°λ₯(compile-time type check) - JDK1.5
κ°μ²΄μ νμ
μμ μ±μ λμ΄κ³ νλ³νμ λ²κ±°λ‘μμ μ€μ¬μ€
ArrayList< Tv > tvList = new ArrayList< Tv >();
tvList. add ( new Tv ()); // OK.
tvList. add ( new Audio ()); // μ»΄νμΌ μλ¬.
// Tv t = (Tv)tvList.get(0);
Tv t = tvList. get ( 0 ); // νλ³ν λΆνμ
RuntimException
μΈ ClassCastException
μ Compiletime
μμ μ²λ¦¬νκΈ° μν΄
e.g. String str = null;
λ³΄λ€ String str = ββ;
λ‘ μ΄κΈ°ννμ¬ NullPointerException
ννΌ
2~3. νμ
λ³μ
νμ
λ³μ
ν΄λμ€λ₯Ό μμ±ν λ, Object νμ
λμ νμ
λ³μ(E)λ₯Ό μ μΈν΄μ μ¬μ©
νμ
λ³μμ λμ
νκΈ°
κ°μ²΄ μμ± μ, νμ
λ³μ(E) λμ μ€μ νμ
(Tv)μ μ§μ (λμ
)
// νμ
λ³μ E λμ μ μ€μ νμ
Tvλ₯Ό λμ
ArrayList< Tv > tvList = new ArrayList< Tv >();
νμ
λ³μ λμ μ€μ νμ
μ΄ μ§μ λλ©΄, νλ³ν μλ΅κ°λ₯
4~5. μ§λ€λ¦μ€ μ©μ΄, νμ
κ³Ό λ€νμ±
μ§λ€λ¦μ€ μ©μ΄
Box<T>
μ§λ€λ¦ ν΄λμ€. βTμ Boxβ λλ βT BoxβλΌκ³ μ½μ
T
νμ
λ³μ λλ νμ
맀κ°λ³μ. (Tλ νμ
λ¬Έμ)
Box
μμ νμ
(raw type). μΌλ° ν΄λμ€
μ§λ€λ¦μ€ νμ
κ³Ό λ€νμ±
ArrayList< Tv > list = new ArrayList< Tv >(); // OK.
ArrayList< Product > list = new ArrayList< Tv >(); // μλ¬.
μ°Έμ‘° λ³μμ μμ±μμ λμ
λ νμ
μ μΌμΉν΄μΌ ν¨
List< Tv > list = new ArrayList< Tv >(); // OK. λ€νμ±. ArrayListκ° Listλ₯Ό ꡬν
List< Tv > list = new LinkedList< Tv >(); // OK. λ€νμ±. LinkedListκ° Listλ₯Ό ꡬν
μ§λ€λ¦ ν΄λμ€κ°μ λ€νμ±μ μ±λ¦½. (μ¬μ ν λμ
λ νμ
μ μΌμΉν΄μΌ ν¨)
ArrayList< Product > list = new ArrayList< Product >();
list. add ( new Product ());
list. add ( new Tv ());
list. add ( new Audio ());
맀κ°λ³μμ λ€νμ±λ μ±λ¦½
7~8. Iterator, HashMapκ³Ό μ§λ€λ¦μ€
Iterator<E>
Iterator< Student > it = list. iterator ();
while (it. hasNext ()) {
Student s = it. next (); // νλ³ν μλ΅ κ°λ₯
}
ν΄λμ€λ₯Ό μμ±ν λ, Object νμ
λμ T μ κ°μ νμ
λ³μλ₯Ό μ¬μ©
HashMap<K, V>
HashMap< String , Student > map = new HashMap< String , Student >();
map. put ( "μλ°μ" , new Student ( "μλ°μ" , 1 , 1 , 100 , 100 , 100 ));
μ¬λ¬ κ°μ νμ
λ³μκ° νμν κ²½μ°, μ½€λ§λ₯Ό ꡬλΆμλ‘ μ μΈ
9~11. μ νλ μ§λ€λ¦ ν΄λμ€, μ μ½
μ νλ μ§λ€λ¦ ν΄λμ€
class FruitBox < T extends Fruit > { // Fruitμ μμλ§ νμ
μΌλ‘ μ§μ κ°λ₯
ArrayList< T > list = new ArrayList< T >();
}
extendsλ‘ λμ
ν μ μλ νμ
μ μ ν
interface Eatable {}
class FruitBox < T extends Eatable > { ... }
μΈν°νμ΄μ€μΈ κ²½μ°μλ extendsλ₯Ό μ¬μ©
μ§λ€λ¦μ€μ μ μ½
Box< Apple > appleBox = new Box< Apple >();
Box< Grape > grapeBox = new Box< 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~14. μμΌλ μΉ΄λ, μ§λ€λ¦ λ©μλ
μμΌλ μΉ΄λ <?>
νλμ μ°Έμ‘° λ³μλ‘ λμ
λ νμ
μ΄ λ€λ₯Έ κ°μ²΄λ₯Ό μ°Έμ‘° κ°λ₯
ArrayList< ? extends Product > list = new ArrayList< Tv >(); // OK.
ArrayList< ? extends Product > list = new ArrayList< Audio >(); // OK.
ArrayList< Product > list = new ArrayList< Tv >(); // μλ¬. λμ
λ νμ
λΆμΌμΉ
<? extends T>
μμΌλ μΉ΄λμ μν μ ν. Tμ κ·Έ μμλ€λ§ κ°λ₯
<? super T>
μμΌλ μΉ΄λμ μν μ ν. Tμ κ·Έ μ‘°μλ€λ§ κ°λ₯
<?>
μ ν μμ. λͺ¨λ νμ
μ΄ κ°λ₯. <? extends Object>
μ λμΌ
static Juice makeJuice (FruitBox <? extends Fruit > box) {
String tmp = "" ;
for (Fruit f : box. getList ()) {
tmp += f + " " ;
}
return new Juice (tmp);
}
λ©μλμ 맀κ°λ³μμ μμΌλ μΉ΄λλ₯Ό μ¬μ©
μ§λ€λ¦ λ©μλ
static < T > void sort (List < T > list, Comparator <? super T > c)
μ§λ€λ¦ νμ
μ΄ μ μΈλ λ©μλ (νμ
λ³μλ λ©μλ λ΄μμλ§ μ ν¨)
class FruitBox < T > {
...
static < T > void sort (List< T > list , Comparator< ? super T > c ) {
...
}
}
ν΄λμ€μ νμ
맀κ°λ³μ<T>
μ λ©μλμ νμ
맀κ°λ³μ <T>
λ λ³κ°
System.out. println (Juicer. < Fruit > makeJuice (fruitBox));
System.out. println (Juicer. < Apple > makeJuice (appleBox));
λ©μλλ₯Ό νΈμΆν λλ§λ€ νμ
μ λμ
ν΄μΌ(λλΆλΆ μλ΅ κ°λ₯)
System.out. println ( < Fruit > makeJuice (fruitBox)); // μλ¬. ν΄λμ€ μ΄λ¦ μλ΅λΆκ°
System.out. println ( this . < Fruit > makeJuice (appleBox)); // OK.
System.out. println (Juicer. < Fruit > makeJuice (fruitBox)); // OK.
λ©μλλ₯Ό νΈμΆν λ νμ
μ μλ΅νμ§ μμ λλ ν΄λμ€ μ΄λ¦ μλ΅ λΆκ°
15~16. μ§λ€λ¦ νλ³ν
μ§λ€λ¦ νμ
μ νλ³ν
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< 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 >(); // μ λ¬Έμ₯κ³Ό λμΌ
// 맀κ°λ³μλ‘ FruitBox<Fruit>, FruitBox<Apple>, FruitBox<Grape> λ±μ΄ κ°λ₯
static Juice makeJuice < FruitBox <? extends Fruit > box) { ... }
FruitBox< ? extends Fruit > box = new FruitBox< Fruit >(); // OK.
FruitBox< ? extends Fruit > box = new FruitBox< Apple >(); // OK.
μμΌλ μΉ΄λκ° μ¬μ©λ μ§λ€λ¦ νμ
μΌλ‘λ νλ³ν κ°λ₯
μ§λ€λ¦ νμ
μ μ κ±°
μ»΄νμΌλ¬λ μ§λ€λ¦ νμ
μ μ κ±°νκ³ , νμν κ³³μ νλ³νμ λ£μ
μ§λ€λ¦ νμ
μ κ²½κ³(bound)λ₯Ό μ κ±°
μ§λ€λ¦ νμ
μ κ±° ν νμ
μ΄ λΆμΌμΉνλ©΄, νλ³ν μΆκ°
μμΌλ μΉ΄λκ° ν¬ν¨λ κ²½μ°, μ μ ν νμ
μΌλ‘ νλ³ν μΆκ°
17~20. μ΄κ±°ν
μ΄κ±°ν(enum)
κ΄λ ¨λ μμλ€μ κ°μ΄ λ¬Άμ΄ λμ κ²
class Card {
enum Kind { CLOVER , HEART , DIAMOND , SPADE }
enum Value { TWO , THREE , FOUR }
final Kind kind; // νμ
μ΄ intκ° μλ Kind
final Value value;
}
μ₯μ
Javaλ νμ
μ μμ ν μ΄κ±°νμ μ 곡
if (Card.Kind.CLOVER == Card.Value.TWO) { // μ»΄νμΌ μλ¬. νμ
μ΄ λ¬λΌμ λΉκ΅λΆκ°
μ΄κ±°νμ μ μμ μ¬μ©
enum Direction { EAST , SOUTH , WEST , NORTH }
μ΄κ±°νμ μ μνλ λ°©λ²
class Unit {
int x, y; // μ λμ μμΉ
Direction dir; // μ΄κ±°ν μΈμ€ν΄μ€ λ³μ μ μΈ
void init () {
dir = Direction.EAST; // μ λμ λ°©ν₯μ EASTλ‘ μ΄κΈ°ν
}
}
μ΄κ±°ν νμ
μ λ³μλ₯Ό μ μΈνκ³ μ¬μ©νλ λ°©λ²
if (dir == Direction.EAST) {
x ++ ;
} else if (dir > Direction.WEST) { // μλ¬. μ΄κ±°ν μμμ λΉκ΅μ°μ°μ μ¬μ© λΆκ°
...
} else if (dir. compareTo (Direction.WEST) > 0 ) {
...
}
μ΄κ±°ν μμμ λΉκ΅μ ==
μ compareTo()
μ¬μ© κ°λ₯
μ΄κ±°νμ μ‘°μ - java.lang.Enum
λͺ¨λ μ΄κ±°νμ Enumμ μμμ΄λ©°, μλμ λ©μλλ₯Ό μμλ°μ
// μ΄κ±°ν μμμ μ΄λ¦μ λ¬Έμμ΄λ‘ λ°ν
String name ()
// μ΄κ±°ν μμκ° μ μλ μμλ₯Ό λ°ν
int ordinal ()
// μ§μ λ μ΄κ±°νμμ nameκ³Ό μΌμΉνλ μ΄κ±°ν μμλ₯Ό λ°ν
T valueOf (Class < T > enumType, String name)
// λͺ¨λ μ΄κ±°ν μμλ₯Ό λ°°μ΄λ‘ λ°ν
static E [] values ()
// μ΄κ±°ν μμ μ΄λ¦μΌλ‘ κ° λ°ν
static E valueOf (String name)
21~22. μ΄κ±°ν λ©€λ² μΆκ°νκΈ°
μ΄κ±°ν λ©€λ² μΆκ°νκΈ°
enum Direction { EAST ( 1 ), SOUTH ( 5 ), WEST ( - 1 ), NORTH ( 10 ) }
λΆμ°μμ μΈ μ΄κ±°ν μμμ κ²½μ°, μνλ κ°μ κ΄νΈ μμ μ μ
enum Direction {
EAST ( 1 ), SOUTH ( 5 ), WEST ( - 1 ), NORTH ( 10 );
private final int value;
Direction ( int value ) {
this .value = value;
}
public int getValue () {
return value;
}
}
κ΄νΈλ₯Ό μ¬μ©νλ €λ©΄, μΈμ€ν΄μ€ λ³μμ μμ±μλ₯Ό μλ‘ μΆκ°ν΄ μ€μΌ ν¨
Direction d = new Direction ( 1 ); // μλ¬. μ΄κ±°νμ μμ±μλ μΈλΆμμ νΈμΆλΆκ°
μ΄κ±°νμ μμ±μλ 묡μμ μΌλ‘ private μ΄κΈ° λλ¬Έμ, μΈλΆμμ κ°μ²΄ μμ± λΆκ°
23~26. νμ€ μ λν
μ΄μ
μ λν
μ΄μ
μ΄λ?
μ£Όμμ²λΌ νλ‘κ·Έλλ° μΈμ΄μ μν₯μ λ―ΈμΉμ§ μμΌλ©°, μ μ©ν μ 보λ₯Ό μ 곡
@Override
μ€λ²λΌμ΄λ©μ μ¬λ°λ₯΄κ² νλμ§ μ»΄νμΌλ¬κ° 체ν¬νκ² ν¨
μ€λ²λΌμ΄λ©ν λ λ©μλ μ΄λ¦μ μλͺ» μ λ μ€μλ₯Ό νλ κ²½μ°κ° λ§μ
@Deprecated
μμΌλ‘ μ¬μ©νμ§ μμ κ²μ κΆμ₯νλ νλλ λ©μλμ λΆν
@Deprecatedμ μ¬μ© μ, Date ν΄λμ€μ getDate()
@FunctionalInterface
ν¨μν μΈν°νμ΄μ€μ λΆμ΄λ©΄, μ»΄νμΌλ¬κ° μ¬λ°λ₯΄κ² μμ±νλμ§ μ²΄ν¬
ν¨μν μΈν°νμ΄μ€μλ νλμ μΆμλ©μλλ§ κ°μ ΈμΌ νλ€λ μ μ½μ΄ μμ
ν¨μν μΈν°νμ΄μ€μ μ λ΅ ν¨ν΄
@SuppressWarning
μ»΄νμΌλ¬μ κ²½κ³ λ©μμ§κ° λνλμ§ μκ² μ΅μ
κ΄νΈ μμ μ΅μ νκ³ μ νλ κ²½κ³ μ μ’
λ₯λ₯Ό λ¬Έμμ΄λ‘ μ§μ
29~33. λ©ν μ λν
μ΄μ
λ©ν μ λν
μ΄μ
μ΄λ?
μ λν
μ΄μ
μ μν μ λν
μ΄μ
@Target
μ λν
μ΄μ
μ μ μν λ, μ μ©λμ μ§μ μ μ¬μ©
@Retention
μ λν
μ΄μ
μ΄ μ μ§λλ κΈ°κ°μ μ§μ νλλ° μ¬μ©
@Documented, @Inherited
javadocμΌλ‘ μμ±ν λ¬Έμμ ν¬ν¨μν€λ €λ©΄ @Documented
μ λν
μ΄μ
μ μμ ν΄λμ€μ μμνκ³ μν λ, @Inherited
@Repeatable
λ°λ³΅ν΄μ λΆμΌ μ μλ μ λν
μ΄μ
μ μ μν λ μ¬μ©
34~37. μ λν
μ΄μ
νμ
μ μ, μμ
μ λν
μ΄μ
νμ
μ μνκΈ°
@ interface DateTime {
String yymmdd ();
String hhmmss ();
}
μ λν
μ΄μ
μ μ§μ λ§λ€μ΄ μΈ μ μμ
// μ μ
@ interface TestInfo {
int count ();
String testedBy ();
String [] testTools ();
TestType testType ();
DateTime testDate ();
}
// μ¬μ©
@ TestInfo (
count = 3 , testedBy = "Kim" ,
testTools = { "JUnit" , "AutoTester" },
testType = TestType.FIRST,
testDate = @ DateTime ( yymmdd = "160101" , hhmmss = 235959 ")
)
public class NewClass { ... }
μ λν
μ΄μ
μ λ©μλλ μΆμ λ©μλμ΄λ©°, μ λν
μ΄μ
μ μ μ©ν λ μ§μ (μμ X)
μ λν
μ΄μ
μ μμ
@ interface TestInfo {
int count () default 1 ; // κΈ°λ³Έκ°μ 1λ‘ μ§μ
}
@ TestInfo // @TestInfo(count=1)κ³Ό λμΌ
public class NewClass { ... }
μ μ© μ κ°μ μ§μ νμ§ μμΌλ©΄, μ¬μ©λ μ μλ κΈ°λ³Έκ° μ§μ κ°λ₯ (null μ μΈ)
@ interface TestInfo {
String value ();
}
@ TestInfo ( "passed" ) // @TestInfo(value="passed")μ λμΌ
public class NewClass { ... }
μμκ° νλμ΄κ³ μ΄λ¦μ΄ valueμΌ λ, μμμ μ΄λ¦ μλ΅ κ°λ₯
@ interface TestInfo {
String [] testTools ();
}
@ TestInfo ( testTools = { "JUnit" , "AutoTester" })
@ TestInfo ( testTools = "JUnit" )
@ TestInfo ( testTools = {}) // κ°μ΄ μμ κ²½μ° λΉκ΄νΈ νμ
μμμ νμ
μ΄ λ°°μ΄μΈ κ²½μ°, μ€κ΄νΈ μ¬μ©
λͺ¨λ μ λν
μ΄μ
μ μ‘°μ
Annotationμ λͺ¨λ μ λν
μ΄μ
μ μ‘°μμ΄μ§λ§ μμ λΆκ°
μ¬μ€ Annotationμ μΈν°νμ΄μ€
λ§μ»€ μ λν
μ΄μ
μμκ° νλλ μ μλμ§ μμ μ λν
μ΄μ
public @ interface Override {}
public @ interface Test {}
μ λν
μ΄μ
μμμ κ·μΉ
μ λν
μ΄μ
μ μμλ₯Ό μ μΈν λ κ·μΉ
μμμ νμ
μ κΈ°λ³Έν, String, enum, μ λν
μ΄μ
, Class λ§ νμ©
κ΄νΈ μμ 맀κ°λ³μ μ μΈ X
μμΈ μ μΈ X
μμλ₯Ό νμ
맀κ°λ³μλ‘ μ μ X