Skip to content

Commit 5856c31

Browse files
committed
feat: week4 hoonww(Generic)
1 parent 44990ff commit 5856c31

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed

week4/hoonww/제네릭.md

+114
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
# 제네릭
2+
3+
참고자료 : [https://st-lab.tistory.com/153](https://st-lab.tistory.com/153)
4+
5+
우리가 어떤 자료구조(자료구조는 클래스 형태이다!)를 만들었다고 치자.
6+
7+
이 자료구조를 같은 형태로 String, Integer 등 여러 타입에 대해 지원하고 싶을 때 제네릭을 사용한다.
8+
9+
무슨 말이냐 하면..
10+
11+
```java
12+
ArrayList<String> stringList = new ArrayList<String>();
13+
ArrayList<Integer> integerList = new ArrayList<Integer>();
14+
```
15+
16+
일반적으로 ArrayList를 생성할 때 위와 같은 형태를 갖는다.
17+
18+
자바를 개발한 사람은 ArrayList<T>라는 클래스를 잘 만들어두어 위처럼 사용하게 만들었다.
19+
20+
만약 제네릭이라는 것이 없었다면 자바 개발자는 StringArrayList, IntegerArrayList와 같이 자바에 존재하는 모든 타입에 대한 ArrayList 클래스를 만들었어야 할 것이다.
21+
22+
다시 말해 제네릭은..
23+
24+
- 타입을 변수처럼 받아 어떤 타입이 들어오더라도 처리를 할 수 있게 만들어준 것이다
25+
- 데이터 타입을 외부에서 지정할 수 있게 해준다.
26+
27+
## 특징
28+
29+
1. 위는 클래스에 사용한 예제이지만 인터페이스에도 사용한다.
30+
2. public ClassName<T>{} 와 같이 제네릭이 사용되면 T 타입은 {} 안에서만 유효하다.
31+
3. 제네릭 타입을 두 개 이상 사용할 수도 있다. ex) HashMap<K,V>()
32+
4. <T>에서 T는 argument같은 이름이라 <yaho>, <durumi>와 같이 쓰는것도 아무 문제가 없다.
33+
5. 제네릭은 **참조 타입**만 사용 가능하다.
34+
1. 참조 타입 : 객체의 번지를 참조하는 타입
35+
1. 그래서 int, double 대신 Integer, Double과 같은 Wrapper Type을 써야한다
36+
2. 사용자가 정의한 클래스도 사용 가능하다
37+
2. 기본 타입 : 정수, 실수, 문자, 논리 리터럴을 저장하는 타입
38+
39+
![Untitled](%E1%84%8C%E1%85%A6%E1%84%82%E1%85%A6%E1%84%85%E1%85%B5%E1%86%A8%20fc21c01370b94f709aeb6f356ee98717/Untitled.png)
40+
41+
## 사용 예제
42+
43+
```java
44+
@Getter
45+
@AllArgsConstructor
46+
class User{
47+
private Long id;
48+
private String name;
49+
}
50+
51+
class ClassName<Realkk>{
52+
private Realkk element;
53+
54+
void setElement(Realkk r){
55+
this.element = r;
56+
}
57+
58+
Realkk get(){
59+
return this.element;
60+
}
61+
62+
static <T> T genericStaticMethod(T arg){
63+
reutrn arg;
64+
}
65+
}
66+
67+
class Main{
68+
ClassName<String> exampleClass = new ClassName<String>();
69+
exampleClass.setElement("이게 안되네");
70+
System.out.println(exampleClass.get()); // 이게 안되네
71+
72+
ClassName<User> userClass = new ClassName<User>();
73+
userClass.setElement(new User(13254, "이정훈"));
74+
System.out.println(userClass.get().getName()); // 이정훈
75+
76+
System.out.println(userClass.genericStaticMethod(True)); // True
77+
}
78+
```
79+
80+
이때 static 메소드의 제네릭은 별도이다.
81+
82+
why? static 메소드는 프로그램이 실행되면서 메모리에 올라가기 때문에 이 클래스의 제네릭 타입을 알 방법이 없다. Realkk라는 동일한 제네릭으로 표시되어도 둘은 독립적인 제네릭이다.
83+
84+
## 제네릭을 제한
85+
86+
extend / super / ?
87+
88+
어떤 타입이든 다 허용하는 것이 아니라, 특정 범위의 타입으로만 제네릭을 제한시키고 싶을 때 위의 세 가지를 사용한다.
89+
90+
<K extend T> : T와 T의 자손 타입들을 K라는 이름으로 받음
91+
92+
<K super T> : T와 T의 부모 타입들을 K라는 이름으로 받음
93+
94+
<?> : ‘와일드카드'라고 부르며, 특정한 타입으로 지정되지 않는다.(위에서는 K라는 이름으로 타입을 지정받았다)
95+
96+
```java
97+
class NumClass1<K extends Number>{
98+
K get(K arg){
99+
return arg;
100+
}
101+
}
102+
103+
class NumClass2<? extends Number>{
104+
? get(? arg){ // 이런게 불가능
105+
return arg;
106+
}
107+
}
108+
109+
class NumClass3<K super Long>{
110+
K get(K arg){
111+
return arg;
112+
}
113+
}
114+
```

week4/hoonww/제네릭/Untitled.png

75.6 KB
Loading

0 commit comments

Comments
 (0)