μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- νμ΄μ¬
- Vue.js
- GitHub
- 둬볡
- μκ³ λ¦¬μ¦
- ν΄λ¦° μ½λ
- Postman
- JPA
- springboot
- Python
- Spring
- μ½λμ
- Gradle
- golang
- ν°μ€ν 리μ±λ¦°μ§
- μ€νλ§
- java
- κΈ°μ΄100μ
- MySQL
- thymeleaf
- κ°μ¬μ€
- μ€λΈμ
- Codeup
- H2 μ€μΉ
- go
- ν΄λ¦°μ½λ
- Spring Boot
- spring security
- mariadb
- Git
- Today
- Total
nyximos.log
[Java] μ λ€λ¦ λ³Έλ¬Έ
π©π λͺ©ν
μλ°μ μ λ€λ¦μ λν΄ νμ΅νμΈμ.
π©π» νμ΅ν κ²
- μ λ€λ¦ μ¬μ©λ²
- μ λ€λ¦ μ£Όμ κ°λ (λ°μ΄λλ νμ , μμΌλ μΉ΄λ)
- μ λ€λ¦ λ©μλ λ§λ€κΈ°
- Erasure
μ λ€λ¦ Generics
λ€μν νμ μ κ°μ²΄λ€μ μ²λ¦¬ν μ μλ ν΄λμ€μ λ©μλλ₯Ό μμ±νλ κΈ°λ²
컬λ μ ν΄λμ€μ μ»΄νμΌ μ νμ 체ν¬λ₯Ό ν΄μ£Όλ κΈ°λ₯
μλ° 1.5λΆν° μΆκ°
μ₯μ
κ°μ²΄ νμ μμ μ±μ λμ¬μ€λ€. (μλνμ§ μμ κ°μ²΄λ₯Ό μ μ₯νλ κ²μ λ§κ³ , λ€λ₯Έ νμ μΌλ‘ νλ³νλλ κ°λ₯μ±μ μ€μ¬μ€)
νμ 체ν¬μ νλ³νμ μλ΅νμ¬ μ½λκ° κ°κ²°ν΄μ§λ€.
class Box<T>
Box<T> : μ λ€λ¦ ν΄λμ€ Tμ Box, T BoxλΌκ³ μ½λλ€.
T : νμ λ³μ
Box : μμ νμ raw type
μ λ€λ¦ νμ νΈμΆ
Box<String> b = new Box<String>();
μΌλ°μ μΌλ‘ μ¬μ©νλ μ λ€λ¦ νμ μ΄λ¦
- E - Element (used extensively by the Java Collections Framework)
- K - Key
- N - Number
- T - Type
- V - Value
- S,U,V etc. - 2nd, 3rd, 4th types
νμ λ³μ
μ λ€λ¦ ν΄λμ€ μμ±μ Object νμ λμ νμ λ³μλ₯Ό μ μΈνλ€.
ν΄λμ€ μμ <T> μ Tκ° νμ λ³μμ΄λ€.
μ λ€λ¦ μ¬μ©λ²
μ λ€λ¦ μ¬μ© μ΄μ λ°©λ²
Object νμ λ³μλ μ΄λ€ κ°μ²΄λ μ°Έμ‘° ν μ μλ€.
→ λ΄λΆμ Object νμ μ λ³μλ₯Ό μ μΈνκ³ μ΄ λ³μλ‘ λ°μ΄ν°λ₯Ό κ°λ¦¬ν¨λ€.
public class Box {
private Object data;
public void set(Object data){
this.data = data;
}
public Object get() {
return data;
}
}
μ¬μ©
λ°μ΄ν°λ₯Ό κΊΌλΌ λλ§λ€ νμ νλ³νμ΄ νμνλ€.
λΆμ£Όμνκ² λ€λ₯Έ κ°μ²΄λ‘ νλ³νμ ν μλ μμ΄ μ€ν λμ€μ μ€λ₯λ₯Ό λ°μμν¬ μ μλ€.
Box box = new box();
box.set("Hello World");
String s = (String)b.get();
box.set(new Integer(10));
Integer i = (Integer)box.get();
μ λ€λ¦ μ¬μ©
μλ£νμ νμνλ μ리μ Tκ° μ¬μ©λλ€.
public class Box<T> {
private T data;
public void set(T data) {
this.data = data;
}
public T get(){
return data;
}
}
μ¬μ©
νμ 맀κ°λ³μμ κ°μ κ°μ²΄λ₯Ό μμ±ν λ ꡬ체μ μΌλ‘ κ²°μ λλ€.
Box<String> stringBox = new Box<String>();
stringBox.set("Hello World");
String s = stringBox.get();
μ μ νμ μ μΆκ°νλ €κ³ νλ©΄
μ»΄νμΌλ¬κ° μ»΄νμΌλ¬ λ¨κ³μμ μ€λ₯λ₯Ό κ°μ§νλ€.
→ λ μμ νκ² νλ‘κ·Έλλ° ν μ μλ€.
Box<String> stringBox = new Box<String>();
stringBox.set(new Integer(10)); // μ»΄νμΌ μ€λ₯!
μ£Όμμ¬ν
1. static νλλ‘ νμ λ³μλ₯Ό μ¬μ©ν μ μλ€.
Tλ μΈμ€ν΄μ€ λ³μλ‘ κ°μ£ΌλκΈ° λλ¬Έμ΄λ€.
static λ©€λ²λ μΈμ€ν΄μ€ λ³μλ₯Ό μ°Έμ‘°ν μ μλ€.
public class Fruit<T> {
static T fruit; // μ»΄νμΌ μλ¬
}
2. μ λ€λ¦ νμ μ λ°°μ΄μ μμ±ν μ μλ€. νμ λ³μλ‘ λ°°μ΄ μ μΈμ κ°λ₯νλ€.
new μ°μ°μ λλ¬ΈμΈλ°
new μ°μ°μλ μ»΄νμΌ μμ μ νμ Tκ° λ¬΄μμΈμ§ μ νν μμμΌ νλ€.
κ·Έλ¬λ μλ μ½λμ Box<T> ν΄λμ€λ₯Ό μ»΄νμΌ μμ μ Tκ° μ΄λ€ νμ μ΄ λ μ§ μ μ μμΌλ―λ‘ λ°°μ΄μ μμ±ν μ μλ κ²μ΄λ€.
class Box<T> {
T[] itemArr; // Tνμ
λ°°μ΄μ μν μ°Έμ‘°λ³μ
T[] toArr() {
T[] tmmpArr = new T[itemArr.length]; // μλ¬, μ λ€λ¦ λ°°μ΄ μμ±λΆκ°
...
return tmpArr;
}
}
4. νμ λ§€κ° λ³μλ‘ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ€.
3. instanceof μ°μ°μλ₯Ό μ¬μ©ν μ μλ€. μμΌλμΉ΄λ? λ₯Ό μ¬μ©νλ©΄ κ°λ₯νλ€.
μ λ€λ¦ μ£Όμ κ°λ (λ°μ΄λλ νμ , μμΌλ μΉ΄λ)
νμ λ νμ λ§€κ° λ³μ bounded type parameter
νμ λ§€κ° λ³μλ‘ μ λ¬λλ νμ μ’ λ₯ μ ν νκ³ μΆμ λ μ¬μ©
ν€μλ extendsλ₯Ό μ¬μ©νλ€.
νΉμ νμ μ μμλ€λ§ λμ ν μ μκ² μ νν μ μλ€.
κ³ΌμΌ μμμ μ₯λκ°μ λ΄μ μ μλ€.
FruitBox<Toy> FruitBox = new FruitBox<Toy>();
fruitBox.add(new Toy());
Fruitμ μμλ§ νμ μΌλ‘ μ§μ κ°λ₯
class FruitBox<T extends Fruit> {
ArrayList<T> list = new ArrayList<T>();
}
μ¬μ ν ν μ’ λ₯μ νμ λ§ λ΄μ μ μμ§λ§ Fruitν΄λμ€μ μμλ€λ§ λ΄μ μ μλ€λ μ νμ΄ μΆκ° λμλ€....
FruitBox<Apple> appleBox = new FruitBox<Apple>();
FruitBox<Toy> toyBox = new FruitBox<Toy>(); // Toyλ Fruitμ μμμ΄ μλλΌμ μλ¬
ν΄λμ€κ° μλ μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌνλ€λ μ μ½μ΄ νμν λλ extends ν€μλλ₯Ό μ¬μ©νλ€.
implementsλ₯Ό μ¬μ©νμ§ μλλ‘ μ£Όμνλ€.
interface Eatable {}
// μ¬λ°λ₯Έ μ¬μ©
class FruitBox<T extends Eatable> {...}
// μλͺ»λ μ¬μ©
class FruitBox<T implements Eatable> {...}
ν΄λμ€ Fruitμ μμμ΄λ©΄μ Eatable μΈν°νμ΄μ€λ ꡬνν΄μΌ ν λλ & κΈ°νΈλ‘ μ°κ²°νλ€.
class FruitBox<T extends Fruit & Eatable> {...}
μ λ€λ¦ ν΄λμ€ μμ±μ μ°Έμ‘° λ³μμ μ§μ λ μ λ€λ¦ νμ κ³Ό μμ±μμ μ§μ λ νμ μ΄ μΌμΉν΄μΌ νλ€.
μΌμΉνμ§ μμΌλ©΄ μ»΄νμΌ μλ¬κ° λ°μνλ€. (μμκ΄κ³λλΌλ μλ¬)
ArrayList<Fruit> fruitList = new Array<Apple>(); // μλ¬
μμΌλμΉ΄λ WildCard
μ λ€λ¦ νμ μ λ€νμ±μ μ μ©νλ λ°©λ²
κΈ°νΈ ? μ¬μ©
extends ν€μλλ‘ μνμ, super ν€μλλ‘ ννμ μ νν μ μλ€.
<? extends T> Upper Bounded Wildcard
μμΌλ μΉ΄λμ μν μ ν, Tμ Tμ μμλ€λ§ κ°λ₯
<? super T> Lower Bounded Wildcard
μμΌλ μΉ΄λμ νν μ ν, Tμ Tμ μ‘°μλ€λ§ κ°λ₯
<?> Unbounded WildCard
μ νμ΄ μλ μμΌλ μΉ΄λ. λͺ¨λ νμ μ΄ κ°λ₯, <? extends Object>μ λμΌ
νλμ μ°Έμ‘°λ³μλ‘ λ€λ₯Έ μ λ€λ¦ νμ μ΄ μ§μ λ κ°μ²΄λ₯Ό λ€λ£° μ μλ€.
ArrayList<? extends Fruit> fruitList = new Array<Apple>();
ArrayList<? extends Fruit> fruitList = new Array<Banana>();
μμΌλ μΉ΄λλ₯Ό 맀κ°λ³μμ μ μ©
static Juice makeJuice(FruitBox<? extends Fruite> box){
String tmp = "";
for(Fruit f : box.getList()){
tmp += f + " ";
}
return new Juice(tmp);
}
νμ μ΄ λ€λ₯Έ μ¬λ¬ κ°μ²΄λ₯Ό λ§€κ° λ³μλ‘ μ§μ κ°λ₯
System.out.println(Juicer.makeJuice(new FruiteBox<Fruit>()));
System.out.println(Juicer.makeJuice(new FruiteBox<Apple>()));
μ λ€λ¦ λ©μλ λ§λ€κΈ°
μ λ€λ¦ λ©μλ
λ©μλμ μ μΈλΆμ μ λ€λ¦ νμ μ΄ μ μΈλ λ©μλ
μ λ€λ¦ νμ μ μ μΈμμΉλ λ°ν νμ λ°λ‘ μμ΄λ€.
static <T> void sort(List<T> list, Comparator<? super T> c)
μ λ€λ¦ ν΄λμ€μ μ μλ νμ 맀κ°λ³μκ° Tμ΄κ³ ,
μ λ€λ¦ λ©μλμ μ μλ νμ 맀κ°λ³μκ° Tμ¬λ μ΄ λμ λ³κ°μ κ²μ΄λ€.
κ°μ νμ λ¬Έμ Tλ₯Ό μ¬μ©νλλΌλ λ€λ₯Έ νμ λ³μλΌλ κ²μ μ μνμ.
class FruitBox<T> {
static <T> void sort(List<T> list, Comparator<? super T> c)
}
static λ©€λ²μλ νμ 맀κ°λ³μλ₯Ό μ¬μ©ν μ μμ§λ§,
λ©μλμ μ λ€λ¦ νμ μ μ μΈνκ³ μ¬μ©νλ κ²μ κ°λ₯νλ€.
λ©μλμ μ μΈλ μ λ€λ¦ νμ 맀κ°λ³μλ
λ©μλ λ΄μμλ§ μ§μμ μΌλ‘ μ¬μ©λ κ²μ΄λ―λ‘ λ©μλκ° staticμ΄κ±΄ μλ건 μκ΄μλ€.
Type Erasure
μ»΄νμΌ μ μ격ν νμ κ²μ¬λ₯Ό μν΄ λμ λμλ€.
μ λ€λ¦μ ꡬννκΈ° μν΄ Java μ»΄νμΌλ¬λ μλ μ νμΌ λ μ νμμ λ₯Ό μ μ©νλ€.
- νμ
맀κ°λ³μκ° μ νλμ§ μμ λ μ λ€λ¦ λ§€κ° λ³μλ₯Ό ν΄λΉ κ²½κ³ λλ objectλ‘ λ°κΎΌλ€.
λ°λΌμ μμ±λ λ°μ΄νΈ μ½λμλ μΌλ° ν΄λμ€, μΈν°νμ΄μ€, λ©μλλ§ ν¬ν¨λλ€. - μ ν μμ μ±μ μ μ§νκΈ° μν΄ νμνκ²½μ° type castsλ₯Ό μ½μ νλ€.
- νμ₯λ μ λ€λ¦ νμμμ λ€νμ±μ μ μ§νκΈ°μν΄ bridge methodλ₯Ό μμ±νλ€.
Type Erasureλ 맀κ°λ³μν λ μ νμ λν΄ μ ν΄λμ€κ° μμ±λμ§ μλλ‘ νλ€.
κ²°κ³Όμ μΌλ‘ μ λ€λ¦μ λ°νμ μ€λ²ν€λλ₯Ό λ°μμν€μ§ μλλ€.
https://docs.oracle.com/javase/tutorial/java/generics/erasure.html
Type Erasure (The Java™ Tutorials > Learning the Java Language > Generics (Updated))
The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated
docs.oracle.com
Erasure of Generic Types
Type Erasure νλ‘μΈμ€ λμ,
Java μ»΄νμΌλ¬λ λͺ¨λ νμ 맀κ°λ³μλ₯Ό μ§μ°κ³
νμ 맀κ°λ³μκ° μ νλμ΄ μμΌλ©΄ κ° λ§€κ°λ³μλ₯Ό 첫 λ²μ§Έ λ°μ΄λλ‘ λ체νκ³
μ ν 맀κ°λ³μκ° μ νλμ§ μμ κ²½μ° Objectλ‘ λ°κΎΌλ€.
public class Node<T> {
private T data;
private Node<T> next;
public Node(T data, Node<T> next) {
this.data = data;
this.next = next;
}
public T getData() { return data; }
// ...
}
μ΄λ° μ½λκ° μμ λ νμ 맀κ°λ³μ Tλ μ νλμ§ μμΌλ―λ‘ Java μ»΄νμΌλ¬λ Objectλ‘ λ체νλ€.
public class Node {
private Object data;
private Node next;
public Node(Object data, Node next) {
this.data = data;
this.next = next;
}
public Object getData() { return data; }
// ...
}
λ€μ μμ μμ μΌλ° Node ν΄λμ€λ μ νλ νμ λ§€κ° λ³μλ₯Ό μ¬μ©νλ€.
public class Node<T extends Comparable<T>> {
private T data;
private Node<T> next;
public Node(T data, Node<T> next) {
this.data = data;
this.next = next;
}
public T getData() { return data; }
// ...
}
Java μ»΄νμΌλ¬λ bounded type 맀κ°λ³μ Tλ₯Ό 첫 λ²μ§Έ bound ν΄λμ€μΈ Comparableλ‘ λ°κΎΌλ€.
public class Node {
private Comparable data;
private Node next;
public Node(Comparable data, Node next) {
this.data = data;
this.next = next;
}
public Comparable getData() { return data; }
// ...
}
Erasure of Generic Methods
Java μ»΄νμΌλ¬λ μΌλ° λ©μλ μΈμμ μ ν 맀κ°λ³μλ μ§μ΄λ€.
// Counts the number of occurrences of elem in anArray.
public static <T> int count(T[] anArray, T elem) {
int cnt = 0;
for (T e : anArray)
if (e.equals(elem))
++cnt;
return cnt;
}
Tλ μ νμ΄ μκΈ° λλ¬Έμ Java μ»΄νμΌλ¬λ μ΄λ₯Ό Objectλ‘ λ체νλ€.
public static int count(Object[] anArray, Object elem) {
int cnt = 0;
for (Object e : anArray)
if (e.equals(elem))
++cnt;
return cnt;
}
λ€μ ν΄λμ€κ° μ μλμ΄ μλ€κ³ κ°μ ν΄λ³΄μ.
class Shape { /* ... */ }
class Circle extends Shape { /* ... */ }
class Rectangle extends Shape { /* ... */ }
λ€λ₯Έ λͺ¨μμ 그리기 μν΄ generic methodλ₯Ό μ¬μ©νμ¬ draw() λ©μλλ₯Ό μμ±ν μ μλ€.
public static <T extends Shape> void draw(T shape) { /* ... */ }
Java μ»΄νμΌλ¬λ Tλ₯Ό Shapeλ‘ λ°κΎΌλ€.
public static void draw(Shape shape) { /* ... */ }
μ°Έμ‘°
λ¨κΆμ±, μλ°μ μ μ κΈ°μ΄νΈ, λμ°μΆν, 2019
μ²μΈκ΅, μ΄μμ JAVAλ μ²μμ΄μ§!, INFINITYBOOKS, 2015
https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html
Erasure of Generic Types (The Java™ Tutorials > Learning the Java Language > Generics (Updated))
The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated
docs.oracle.com
'Programming > JAVA' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] λλ€μ (0) | 2023.03.29 |
---|---|
[Java] I/O (1) | 2022.09.21 |
[Java] μ λ Έν μ΄μ (1) | 2022.09.11 |
[Java] Enum (1) | 2022.09.08 |
[Java] λ©ν°μ°λ λ νλ‘κ·Έλλ° (0) | 2022.09.06 |