Skip to content

Commit 57d0d7d

Browse files
committed
[docs] week6_13.제네릭
1 parent f4c93e9 commit 57d0d7d

File tree

1 file changed

+106
-1
lines changed

1 file changed

+106
-1
lines changed

week6/juyeong.md

+106-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,113 @@
11
# 13.제네릭
2+
- 제네릭 타입을 이용하여 "잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거"한다.
3+
- 메소드를 정의할 때 타입(type)을 파라미터(parameter)로 사용할 수 있게 한다.
4+
5+
## 13.1 이점
6+
- 1. 컴파일 시 강한 타입체크를 하여 에러 방지
7+
- 2. 형변환을 제거한다. 지네릭이 아닌 코드는 불필요한 타입 변환을 하기 때문에 성능에 악영향을 미친다.
8+
9+
```
10+
// 비제네릭 코드
11+
List list = new ArrayList();
12+
list.add("hello");
13+
String str = (String)list.get(0);
14+
```
215
16+
```
17+
//제네릭 코드
18+
List<String> list = new ArrayList<String>();
19+
list.add("hello");
20+
String str = list.get(0); //형변환 x
21+
```
322
23+
## 13.2 제네릭 타입(class<T>, interface<T>)
24+
- 제네릭 타입 == 타입을 파라미터로 가지는 클래스와 인터페이스.
25+
- 클래스와 인터페이스 이름 뒤에 "<>" 가 붙고, 그 사이에 타입 파라미터를 넣는다.
26+
27+
- 타입 파라미터?
28+
- 1. 일반적으로 대문자 알파벳 한 글자
29+
- 2. 제네릭 타입을 실제 코드에서 사용하려면 타입 파라미터에 구체적인 타입을 지정해야 한다.
430
31+
- Object 타입을 쓰면 위의 List 예제와 같이, 형변환이 일어난다.
32+
- **모든 종류의 객체를 저장하면서 형변환이 발생하지 않는 것 == 제네릭**
33+
- 타입 파라미터를 사용해서 오브젝트 객체를 대체 -> 클래스로 객체를 생성할 때 구체적인 타입으로 변경된다.
534
35+
- 클래스를 설계할 때 구체적인 타입을 명시하지 않고, 타입 파라미터로 대체했다가 실제 클래스가 사용될 때 구체적인 타입을 지정함으로써 타입변환을 최소화한다.
636
37+
## 13.3 멀티 타입 파라미터 (class<K,V,..>, interface<K,V>,.. )
38+
- 두개 이상의 멀티 타입 파라미터를 사용할 수 있다. 이 경우 콤마(,)로 구분한다.
39+
- 자바 컴파일러는 타입 파라미터 부분에 <> 연산자를 사용하면 타입 파라미터를 유추해서 자동으로 설정해준다.
740
8-
# 14.람다식
41+
## 13.4 제네릭 메소드 (<T,R> R method(T t))
42+
- 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드
43+
- 리턴 타입 앞에 <> 기호를 추가하고 타입 파라미터를 기술한 다음, 리턴 타입과 매개타입으로 타입 파라미터를 사용하면 된다.
44+
45+
```
46+
public <T> Box<T> boxing (T t) { ... }
47+
```
48+
49+
```
50+
public <타입파라미터..> 리턴타입 메소드명 (매개변수..) { ... }
51+
```
52+
53+
- 제네릭 메소드는 두가지 방식으로 호출할 수 있다.
54+
55+
1. 타입 파라미터를 명시적으로 Integer로 지정
56+
```
57+
Box<integer> box = <Integer>boxing(100);
58+
```
59+
60+
2. 매개값을 보고 구체적 타입을 추정. 타입 파라미터를 Integer로 추정
61+
```
62+
Box<integer> box = boxing(100);
63+
```
64+
65+
## 13.5 제한된 타입 파라미터 (<T extends 최상위타입>)
66+
- 타입파라미터에 지정되는 구체적인 타입을 제한할 필요가 가끔 있다.
67+
- 예를 들어 숫자를 연산하는 제네릭 메소드는 매개값으로 Number혹은 하위 클래스 타입(Byte, Short, Integer..)의 인스턴스만 가져야한다.
68+
- 이러한 경우에 제한된 타입 파라미터(bounded type parameter)가 필요
69+
70+
- 선언하려면, 타입 파라미터 뒤에 extends 키워드를 붙이고 상위 타입 명시
71+
- 상위 타입 : 클래스뿐만 아니라 인터페이스도 가능
72+
- 인터페이스라해서 implements 쓰지 않는다
73+
74+
## 13.6 와일드카드 타입(<?>, <? extends ...>, <? super ...>)
75+
- 코드에서 ? 를 일반적으로 와일드카드라고 부른다.
76+
- 구체적인 ㅏ입 대신 와일드카드를 세가지 형태로 사용할 수 있다.
77+
78+
1. 제네릭 타입<?>
79+
1. 제한 없음
80+
2. 모든 클래스나 인터페이스 타입이 올 수 있다.
81+
2. 제네릭타입<? extends 상위타입>
82+
1. 상위 클래스 제한
83+
2. 상위 타입이나 하위 타입만 올 수 있다.
84+
3. 제네릭 타입<? super 하위타입>
85+
1. 하위 클래스 제한
86+
2. 하위타입이나 상위 타입이 올 수 있다.
87+
88+
## 13.7 제네릭 타입의 상속과 구현
89+
- 제네릭 타입도 부모 클래스가 될 수 있다.
90+
91+
```
92+
public class ChildProduct<T,M> extends Product<T,M> { ... }
93+
```
94+
- 자식 제네릭 타입은 추가적으로 타입 파라미터를 가질 수 있다.
95+
- 제네릭 인터페이스를 구현한 클래스도 제네릭 타입이 된다.
96+
97+
98+
99+
100+
101+
102+
103+
104+
105+
106+
# 14.람다식
107+
108+
## 14.1 람다식이란?
109+
## 14.2 람다식 기본 문법
110+
## 14.3 타겟 타입과 함수적 인터페이스
111+
## 14.4 클래스 멤버와 로컬 변수 사용
112+
## 14.5 표준API의 함수적 인터페이스
113+
## 14.6 메소드 참조

0 commit comments

Comments
 (0)