Posts Java Generic
Post
Cancel

Java Generic

Generic


πŸ’Ώ Generic

Data Type을 μΌλ°˜ν™” ν•˜λŠ”κ²ƒμ„ 의미

  • Classs λ‚˜ Methodμ—μ„œ μ‚¬μš©ν•  λ‚΄λΆ€ 데이터 νƒ€μž…μ„ 컴파일 μ‹œμ— 미리 μ§€μ •ν•˜λŠ” 방법
    • Classλ‚˜ λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ μ‚¬μš©λ˜λŠ” 객체의 νƒ€μž…μ˜ μ•ˆμ •μ„±μ„ 높일 수 μžˆλ‹€.
    • λ°˜ν™˜κ°’μ— λŒ€ν•œ νƒ€μž… λ³€ν™˜ 및 νƒ€μž… 검사에 λ“€μ–΄κ°€λŠ” λ…Έλ ₯을 쀄일 수 μžˆλ‹€.
  • Object νƒ€μž…μœΌλ‘œ μ‚¬μš©μ‹œ λ‹€μ‹œ νƒ€μž… λ³€ν™˜μ„ ν•΄μ€˜μ•Ό ν•˜λŠ” λ²ˆκ±°λ‘œμ›€μ΄ μžˆμ„ 수 μžˆλ‹€.

μž₯점

  • 잘λͺ»λœ νƒ€μž…μ΄ μ‚¬μš©λ  수 μžˆλŠ” 문제λ₯Ό 컴파일 κ³Όμ •μ—μ„œ μ œκ±°ν•  수 있기 λ•Œλ¬Έ
  • μ»΄νŒŒμΌλŸ¬λŠ” μ œλ„€λ¦­ μ½”λ“œμ— λŒ€ν•΄ κ°•ν•œ νƒ€μž… 체크λ₯Ό ν•œλ‹€.
  • μ‹€ν–‰ μ‹œ νƒ€μž… μ—λŸ¬κ°€ λ‚˜λŠ” 것보닀 컴파일 μ‹œμ— 미리 νƒ€μž…μ„ κ°•ν•˜κ²Œ μ²΄ν¬ν•΄μ„œ μ—λŸ¬λ₯Ό 사전에 방지
  • νƒ€μž… λ³€ν™˜μ„ ν•  ν•„μš”κ°€ μ—†μ–΄ ν”„λ‘œκ·Έλž¨ μ„±λŠ₯이 ν–₯상

μ‚¬μš©

1
2
3
4
5
6
7
8
9
class GenericSample<T> {
	T element;
	void setElement(T element){
		this.element = element;
		T getElement() {
			return element;
		}
	}
}

νƒ€μž… λ³€μˆ˜

  • 이름에 μ œν•œ μ—†μŒ
  • μ—¬λŸ¬κ°œμ˜ νƒ€μž… λ³€μˆ˜λŠ” ,둜 ꡬ뢄
  • Classμ—μ„œ 뿐만 μ•„λ‹ˆλΌ Method의 λ§€κ°œλ³€μˆ˜λ‚˜ λ°˜ν™˜κ°’μœΌλ‘œλ„ μ‚¬μš© κ°€λŠ₯
  • μž„μ˜μ˜ μ°Έμ‘°ν˜• νƒ€μž…μ„ 의미
  • ν˜„μ‘΄ν•˜λŠ” 클래슀λ₯Ό μ‚¬μš©ν•΄λ„ 되고 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 것을 μ‚¬μš©ν•΄λ„ 됨

이름

  • E: μš”μ†Œ
  • K: ν‚€
  • N: 숫자
  • T: νƒ€μž…
  • V: κ°’
  • S,U,V: λ‘λ²ˆμ¨°, μ„Έλ²ˆμ§Έ, λ„€λ²ˆμ§Έ

πŸ’Ώ Bounded type parameter

νŠΉμ • νƒ€μž…μ˜ μ„œλΈŒ νƒ€μž…μœΌλ‘œ μ œν•œ

1
2
3
4
5
6
public class BoundTypeSample<T extends Number> {
	public void set(T value) {}
	public static void main(String[] args) {
		BoundTypeSample<Integer> bound = new BoundTypeSample<>();
	}
}
  • Number의 μ„œλΈŒ νƒ€μž…λ§Œ ν—ˆμš©

πŸ’Ώ WildCard

μ œλ„€λ ‰μœΌλ‘œ κ΅¬ν˜„λœ Method의 경우 μ„ μ–Έλœ νƒ€μž…μœΌλ‘œλ§Œ λ§€κ°œλ³€μˆ˜λ₯Ό μž…λ ₯ν•΄μ•Ό ν•œλ‹€. 이λ₯Ό 상속받은 클래슀 ν˜Ήμ€ λΆ€λͺ¨ Classμ—μ„œ μ‚¬μš© λΆˆκ°€ν•˜κΈ° ν•˜κ³  μ–΄λ–€ νƒ€μž…μ΄ 와도 μƒκ΄€μ—†λŠ” κ²½μš°μ— λŒ€μ‘ν•˜κΈ° 쒋지 μ•Šλ‹€.

Unbounded WildCard

  • List<?> 와 같은 ν˜•νƒœλ‘œ λ¬ΌμŒν‘œλ§Œ 가지고 μ •μ˜
    • λ‚΄λΆ€μ μœΌλ‘œ Object둜 μ •μ˜λ˜μ–΄μ„œ μ‚¬μš©λ˜κ³  λͺ¨λ“  νƒ€μž…μ˜ 인자λ₯Ό 받을 수 μžˆλ‹€.
  • Object ν΄λž˜μŠ€μ—μ„œ μ œκ³΅λ˜λŠ” κΈ°λŠ₯을 μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•  수 μžˆλŠ” Methodλ₯Ό μž‘μ„±ν•  경우
  • νƒ€μž… νŒŒλΌλ―Έν„°μ— μ˜μ‘΄μ μ΄μ§€ μ•Šμ€ Class의 Methodλ₯Ό μ‚¬μš©ν•˜λŠ” 경우

Upper Bounded WildCard

  • List<? extends Foo> 와 같은 ν˜•νƒœλ‘œ νŠΉμ •ν΄λž˜μŠ€μ˜ μ„œλΈŒ 클래슀만 인자둜 λ°›μŒ
    • Foo ν΄λž˜μŠ€μ— μ •μ˜λœ κΈ°λŠ₯만 μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

Lost Bounded WildCard

  • List<? super Foo> 와 같은 ν˜•νƒœλ‘œ νŠΉμ • 클래슀의 μƒμœ„ 클래슀만 인자둜 λ°›μŒ

πŸ’Ώ λ§€κ°œλ³€μˆ˜ν™” νƒ€μž…(Parameterized Type)

  • ν•˜λ‚˜ μ΄μƒμ˜ νƒ€μž… λ§€κ°œλ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³  μžˆλŠ” Class λ‚˜ Interfaceλ₯Ό μ œλ„€λ¦­ 클래슀 λ˜λŠ” μ œλ„€λ¦­ μΈν„°νŽ˜μ΄μŠ€λΌκ³  ν•˜κ³  이λ₯Ό μ œλ„€λ¦­ νƒ€μž…μ΄λΌ ν•œλ‹€. 각 μ œλ„€λ¦­ νƒ€μž…μ—μ„œλŠ” λ§€κ°œλ³€μˆ˜ν™” νƒ€μž…λ“€μ„ μ •μ˜ν•œλ‹€.
1
List<String>list = new ArrayList<>();
  • <>μ•ˆμ˜ String은 μ‹€ νƒ€μž… λ§€κ°œλ³€μˆ˜λΌκ³  ν•˜κ³  List μΈν„°νŽ˜μ΄μŠ€μ— μ„ μ–Έλ˜μ–΄μžˆλŠ” List의 Eλ₯Ό ν˜•μ‹ νƒ€μž… λ§€κ°œλ³€μˆ˜λΌκ³  ν•œλ‹€.
    • μ œλ„€λ¦­μ€ νƒ€μž…μ†Œκ±°μžμ— μ˜ν•΄ μžμ‹ μ˜ νƒ€μž… μš”μ†Œ 정보λ₯Ό μ‚­μ œν•œλ‹€.
    • ArrayListλ₯Ό 생성할 λ•Œ μ–΄λ– ν•œ νƒ€μž… 정보도 λ“€κ³  μžˆμ§€ μ•Šκ²Œ λœλ‹€.
    • 즉 new ArrayList() 와 κ°™μŒ
  • μ»΄νŒŒμΌλŸ¬λŠ” 컴파일 λ‹¨κ³„μ—μ„œ List μ»¬λ ‰μ…˜μ— String μΈμŠ€ν„΄μŠ€λ§Œ μ €μž₯λ˜μ–΄μ•Ό ν•œλ‹€λŠ” 것을 μ•Œκ²Œλ˜μ—ˆκ³  또 그것을 보μž₯ν•΄μ£ΌκΈ° λ•Œλ¬Έμ— ArrayList list둜 λ³€κ²½ν•˜μ—¬λ„ λŸ°νƒ€μž„μ— λ™μΌν•œ λ™μž‘μ„ 보μž₯
  • νƒ€μž… μ†Œκ±°μžμ—μ˜ν•΄ 컴파일 νƒ€μž„μ— νƒ€μž… 정보가 μ‚¬λΌμ§€λŠ” 것: λΉ„ ꡬ체화
    • E, List 와 같은 λŸ°νƒ€μž„μ— κ΅¬μ²΄ν™”ν•˜μ§€ μ•ŠλŠ” νƒ€μž…λ“€μ„ λΉ„ ꡬ체화(non reifiable type)νƒ€μž…μ΄λΌκ³  ν•œλ‹€.
    • λ°˜λŒ€λ‘œ primitive, non-generic types, raw types λ˜λŠ” List<?> Map κ³Ό 같은 Unbounded WildCard Type은 λŸ°νƒ€μž„μ— ꡬ체화 ν•˜μ—¬ ꡬ체화(reifiable type)이라고 ν•œλ‹€.

μ œλ„€λ¦­ 선엔에 μ‚¬μš©ν•˜λŠ” νƒ€μž…μ˜ λ²”μœ„λ„ 지정 κ°€λŠ₯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class CarWildCardSample {

	public static void main(String[] args) {
		CarWildCardSample sample = new CardWukdcardSample();
		sample.callBoundedWildcardMethod();
	}

	public void callBoundedWildcardMethod() {
		WildcardGeneric<Car> wildcard = new WildcardGeneric<Car>();
		boundedWildCardMethod(wildcard);
	}
	
	public void boundedWildCardMethod(WildCardGeneric<? extends Car> c) {
		Car value = c.getWildCard();
	}
}
1
2
3
public class WildcardGeneric<W> {
	W wildcard;
}
1
2
3
public class Car {}

public class Bus extends Car {}

πŸ’Ώ μ œλ„€λ¦­ λ©”μ„œλ“œ

1
2
- μ ‘κ·Όμ§€μ‹œμž <νƒ€μž…νŒŒλΌλ―Έλ”, ...> λ¦¬λ˜νƒ€μž… λ©”μ„œλ“œλͺ…(λ§€κ°œλ³€μˆ˜, ...) { ... }의 ν˜•μ‹
- public <T> Box<T> boxing(T t) { ... };

호좜

  1. Box box = boxing(100);
    • λͺ…μ‹œμ μœΌλ‘œ ꡬ체적 νƒ€μž… 지정
  2. Box box = boxing(1000);
    • λ§€κ°œκ°’μ„ 보고 ꡬ체적 νƒ€μž…μ„ μΆ”μ •

πŸ’Ώ Erasure

μ›μ†Œ νƒ€μž…μ„ 컴파일 νƒ€μž„μ—μ„œλ§Œ κ²€μ‚¬ν•˜κ³  λŸ°νƒ€μž„μ—λŠ” ν•΄λ‹Ή νƒ€μž… 정보λ₯Ό μ•Œμˆ˜κ°€ μ—†λ‹€.

  • 즉 컴파일 μƒνƒœμ—λ§Œ μ œμ•½ 쑰건을 μ μš©ν•˜κ³  λŸ°νƒ€μž„μ—λŠ” νƒ€μž…μ— λŒ€ν•œ 정보λ₯Ό μ†Œκ±°

κ³Όμ •

  • μ œλ„€λ¦­ νƒ€μž…μ—μ„œλŠ” ν•΄λ‹Ή νƒ€μž… νŒŒλΌλ―Έν„°(T)λ‚˜ Object(unbounded)둜 λ³€κ²½
  • νƒ€μž… μ•ˆμ •μ„± 보쑴을 μœ„ν•΄ ν•„μš”μ‹œ type casting μ‚½μž…
  • ν™•μž₯된 μ œλ„€λ¦­ νƒ€μž…μ—μ„œ λ‹€ν˜•μ„± λ³΄μ‘΄ν•˜κΈ° μœ„ν•΄ bridge method 생성

μœ ν˜•

Class Type Erasure

클래슀 μˆ˜μ€€μ—μ„œ μ»΄νŒŒμΌλŸ¬λŠ” 클래슀의 Type Parameterλ₯Ό 버리고 첫번째 λ°”μΈλ”©μœΌλ‘œ λŒ€μ²΄ν•˜κ±°λ‚˜ Type Parameterκ°€ 바인딩(extends λ“±μœΌλ‘œ) λ˜μ§€ μ•Šμ€ 경우 Object둜 λ³€ν™˜

Method Type Erasure

method-level type erasureκ°€ λ°”μΈλ”©λ˜μ§€ μ•Šμ€ 경우 λΆ€λͺ¨ ν˜•μ‹ Object둜 λ³€ν™˜λ˜κ±°λ‚˜ 바인딩 될 λ•Œ 첫번쨰 바인딩 된 클래슀둜 λ³€ν™˜

This post is licensed under CC BY 4.0 by the author.

Spring

SQL Basic