μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- μ€νλ§
- go
- JPA
- μκ³ λ¦¬μ¦
- Spring
- GitHub
- ν΄λ¦°μ½λ
- μ½λμ
- MySQL
- μ€λΈμ
- mariadb
- Gradle
- golang
- κΈ°μ΄100μ
- ν΄λ¦° μ½λ
- κ°μ¬μ€
- H2 μ€μΉ
- java
- 둬볡
- Spring Boot
- thymeleaf
- ν°μ€ν 리μ±λ¦°μ§
- νμ΄μ¬
- Codeup
- spring security
- springboot
- Postman
- Python
- Git
- Vue.js
- 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
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
'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 |