Java Generic μ΄λ?
Table of contents
μ΄λ€ κ°μ΄ νλμ μ°Έμ‘° μλ£νμ΄ μλ μ¬λ¬ μ°Έμ‘° μλ£νμ μ¬μ©ν μ μλλ‘ νλ‘κ·Έλλ° νλ κ²μ βμ λ€λ¦(Generic) νλ‘κ·Έλλ°β μ΄λΌκ³ νλ€.
μλ£ν λ³λ‘ λ©μλλ₯Ό λ§λ€λ©΄ μ½λμ ν¨μ¨μ±μ΄ λ¨μ΄μ§κΈ° λλ¬Έμ, μ¬λ¬ μ°Έμ‘° μλ£νμ΄ μ°μΌ μ μλ κ³³μ νΉμ ν μλ£νμ μ§μ νμ§ μκ³ ,
ν΄λμ€λ λ©μλλ₯Ό μ μν ν μ¬μ©νλ μμ μ μ΄λ€ μλ£νμ μ¬μ©ν κ²μΈμ§ μ§μ νλ λ°©μμ΄λ€.
Genericμ μ₯μ
- μ λ€λ¦μ μ°Έμ‘° μλ£νμ΄ λ³νλ λ μ΄μ λν κ²μ¦μ μ»΄νμΌλ¬κ° νλ―λ‘ μμ μ
- ν΄λμ€ μΈλΆμμ νμ μ μ§μ ν΄μ£ΌκΈ° λλ¬Έμ λ°λ‘ νμ μ 체ν¬νκ³ λ³νν΄μ€ νμκ° μλ€.
- λΉμ·ν κΈ°λ₯μ μ§μνλ κ²½μ° μ½λμ μ¬μ¬μ©μ±μ΄ λμμ§λ€.
μ₯μ μ μμλ‘ μμ보μ
public class Test {
public static void main(String[] args) {
Sample sample = new Sample();
int i = sample.get(1);
String text = sample.get("λ¬Έμμ΄");
}
}
class Sample{
String get(String input) {
return input;
}
int get(int input) {
return input;
}
}
μμ κ°μ΄ νλΌλ―Έν°λ‘ Stringκ³Ό int νμ νλΌλ―Έν°λ₯Ό λ°λ λ©μλκ° μλ€κ³ ν λ,
μλ£νμ λ§κ² λ©μλ 2κ°λ₯Ό μ€λ²λ‘λ©ν΄μ ꡬνν΄λ λμ§λ§,
class Sample{
Object get(Object input) {
return input;
}
}
κ°μ₯ μμ κ°μ²΄μΈ Objectλ₯Ό μ΄μ©ν΄μ, μμ κ°μ΄ λ©μλλ₯Ό μμ±ν΄λ λ κ²μ΄λ€.
νμ§λ§, μ λ°©μμ λ¨μ μ΄ μλλ° μ°λ¦¬κ° μνλ κΈ°λ₯μ Stringμ μ λ ₯νλ©΄ String λ¬Έμμ΄μ λ°νλ°μκ³ , intλ₯Ό μ λ ₯νλ©΄ intλ₯Ό λ°νλ°μλ€.
public class Test {
public static void main(String[] args) {
Sample sample = new Sample();
String text = (String)sample.get("text");
int i = (int) sample.get(1);
}
}
λͺ¨λ ν΄λμ€μ μ‘°μμΈ Objectλ₯Ό μ λ ₯λ°μ Objectλ₯Ό λ°ννλ―λ‘ λ²μ©μ±μ΄ μ’λ€κ³ ν μ μμ§λ§,
λ€μ μνλ νμ μΌλ‘ λ°νλ°κΈ° μν΄μλ Casting μμ μ΄ μλ°λλ€.
public class Test {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("λ¬Έμμ΄");
String str = list.get(0); //π‘list.get() ν΄μ λμ¨ κ°μ²΄λ Objectμ΄λ―λ‘ μ»΄νμΌ μλ¬ λ°μ
}
}
μ°λ¦¬κ° 리μ€νΈ 컬λ μ μ μ¬μ©ν λλ μμ κ°μ μ΄μ λ‘ μ λ€λ¦ νμ μ νμ λͺ μν΄μ£Όλ μ΄μ μ΄λ€.
π‘ μ μν©μ Listμ νμ μ λͺ μν΄μ£Όμ§ μμ κ²½μ° Objectλ‘ λ³΄κ΄μ νκΈ° λλ¬Έμ,
λ°νν λλ λ€μ String νλ³νμ ν΄μ£Όμ΄μΌ μλ¬κ° λ°μνμ§ μλλ€.
List<String> list = new ArrayList<>();
λ‘ listλ₯Ό μμ±νλ©΄ String νμ
μ κ°μ²΄λ§ μ
λ ₯λ¨μ 보μ₯ν΄μ£ΌκΈ° λλ¬Έμ Casting(ν λ³ν) μμ΄ StringμΌλ‘ λ°νλ°μ μ μλ κ²μ΄λ€.
π κ²°λ‘ μ μ΄ λͺ¨λ λ¨μ μ ν΄κ²°ν΄μ£Όλ λ°©μμ΄ μ λ€λ¦ λ°©μμΈ κ²μ΄λ€.
class Sample{
<T> T get(T input) {
return input;
}
}
λ©μλ μμ <T>
(κΌ Tκ° μλμ΄λ λ¨) μ κ°μ΄ <> μμ νμ
κΈ°νΈλ₯Ό μ μν΄μ μ λ€λ¦μ΄λΌλ νμλ₯Ό ν΄μ£Όκ³ λ©μλλ₯Ό μμ±νλ©΄ λλ€.
μ΄λ°μμΌλ‘ μ λ€λ¦ λ©μλλ₯Ό μμ±νλ©΄, TλΌλ νμ μ΄ λ€μ΄μμ TλΌλ νμ μΌλ‘ λ°νλ¨μ λͺ μν΄μ£ΌμκΈ° λλ¬Έμ,
νλ³νλ νμμκ³ μ€λ³΅λλ λ©μλλ μ€μΌ μ μλ€.
μ λ€λ¦ λ©μλλ₯Ό μμλ‘ λ€μμ§λ§, μ λ€λ¦ ν΄λμ€λ μμ κ°μ μ΄μ λ‘ μ¬μ©λλ€.
class Sample <T> {
T value;
public Sample(T t){
this.value = t;
}
T get(){
return value;
}
}
μ λ€λ¦ ν΄λμ€λ μμ κ°μ΄ ν΄λμ€ λ 벨μ <νμ
κΈ°νΈ>
λ₯Ό λͺ
μνκ³ μ¬μ©νλ©΄ λλ€.
μ λ€λ¦ μ¬μ© μ μ£Όμμ
μ λ€λ¦ ν΄λμ€μ μ λ€λ¦ λ©μλμ νμ κΈ°νΈλ λμΌ νμ μ΄ μλλ€.
class Sample <T> {
T value;
public Sample(T t){
this.value = t;
}
<T> T getInput(T input) {
return input;
}
}
μμ κ°μ΄ μ λ€λ¦ ν΄λμ€μ μ λ€λ¦ λ©μλκ° ν¨κ» μλ ν΄λμ€κ° μμ λ,
μ λ€λ¦ λ©μλμμ μ¬μ©ν T
μ ν΄λμ€μμ μ¬μ©ν T
λ λμΌ νμ
μ΄ μλλΌλ κ²μ μ£Όμν΄μΌνλ€.
public class Test {
public static void main(String[] args) {
Sample<Integer> sample = new Sample(1);
System.out.println(sample.getInput("μλ
").getClass());
}
}
Sample κ°μ²΄λ₯Ό μμ±ν λ, μ λ€λ¦ νμ
μ Integerλ₯Ό λͺ
μνμ§λ§ μ μ½λλ getInput()
νλΌλ―Έν°λ‘ λ¬Έμμ΄μ λ£μ΄λ μ μ λμνκ³
getClass()λ₯Ό νμ λ, String ν΄λμ€κ° λμ€λ κ²μ νμΈν μ μλ€.
μ¦ λ 립μ μΈ νμ μ΄λΌλ κ²μ μ μ μλ€.
class Sample <T> {
T value;
public Sample(T t){
this.value = t;
}
T getInput(T input) {
return input;
}
}
ν΄λμ€ λ 벨μμ μ¬μ©ν νμ κΈ°νΈλ₯Ό λ©μλλ 벨μμλ μ μ©μν€κ³ μΆλ€λ©΄ λ©μλ μμ λ³λμ μ λ€λ¦ νμλ₯Ό μ μΈνκ³ λ©μλλ₯Ό μμ±ν΄μΌνλ€.
μ λ€λ¦ ν΄λμ€λ λ€νμ±μ νμ©νμ§λ§, λͺ μν νμ κΈ°νΈλ λ€νμ±μ΄ νμ©λμ§ μλλ€.
public class Test {
public static void main(String[] args) {
Dad<String> dad = new Son<>();
}
}
class Son <T> extends Dad{
T value;
}
class Dad<T>{
}
μμ κ°μ΄ λ μ λ€λ¦ ν΄λμ€κ° μμκ΄κ³μ μμ λλ, λ€νμ±μΌλ‘ μ λ€λ¦ κ°μ²΄λ₯Ό μμ±ν μ μμ§λ§
public class Test {
public static void main(String[] args) {
Family<Dad> family = new Family<Son>(); //π‘ μλ¬ λ°μ!
}
}
class Family<T>{
T value;
}
class Son extends Dad{
}
class Dad{
}
μμ κ°μ΄ μ λ€λ¦ νμ μ λ€νμ±μ΄ μ μ©λμ§ μλλ€.
<> μμ λ€μ΄κ°λ μ λ€λ¦ νμ κΈ°νΈλ 무쑰건 λμΌν΄μΌνκ³ ,
λ°λΌμ Sample<Dad> sample = new Sample<>();
μ²λΌ μλ΅μ΄ κ°λ₯νλ€.
μ λ€λ¦ νμ μ νκ³Ό μμΌλ μΉ΄λ
public class Test {
public static void main(String[] args) {
Family<Dog> family = new Family<>();
}
}
class Family<T>{
T value;
}
class Dog{
}
class Son extends Dad{
}
class Dad{
}
μ μν©μμ μ λ€λ¦ ν΄λμ€μΈ Familyμ Dog ν΄λμ€λ‘ λͺ μνμ§ λͺ»νλλ‘ νΉμ νμ μ μ ννλ λ°©λ²μ extendsλ₯Ό μ¬μ©νλ©΄ λλ€.
<T extends ν΄λμ€>
λ‘ μ λ€λ¦μ λͺ
μνλ©΄ ν΄λμ€μ μμ νμ
λ§ λμ
λ μ μλ€.
public class Test {
public static void main(String[] args) {
Family<Dog> family = new Family<>(); //π‘ Dog ν΄λμ€λ Dadλ₯Ό μμλ°λ ν΄λμ€κ° μλλ€.
}
}
class Family<T extends Dad>{
T value;
}
class Dog{
}
class Son extends Dad{
}
class Dad{
}
μ μ½λλ Dad
ν΄λμ€λ₯Ό μμνλ ν΄λμ€λ§ μ νμ λμκΈ° λλ¬Έμ Dog
ν΄λμ€λ₯Ό λμ
νλ €κ³ νλ©΄ μλ¬κ° λ°μνκ² λλ€.
β οΈ λ§μ½ νΉμ μΈν°νμ΄μ€λ₯Ό ꡬνν κ°μ²΄λ‘ μ ννκ³ μΆμ κ²½μ°μλ implementsκ° μλ extendsλ₯Ό μ¬μ©νλ©΄ λλ€.
μ λ€λ¦ νμ μμΌλ μΉ΄λ
public class Test {
public static void main(String[] args) {
Ex.getName(new Family<Dad>());
Ex.getName(new Family<Son>());
}
}
class Ex{
static void getName(Family<Dad> family) {
}
static void getName(Family<Son> family) { //π‘ μ»΄νμΌ μλ¬ λ°μ
}
}
class Family<T extends Dad>{
T value;
}
class Son extends Dad{
}
class Dad{
}
μ‘°κΈ μ΅μ§μ€λ¬μΈ μ μκ² μ§λ§, μμ κ°μ μ½λκ° μλ€κ³ μκ°ν΄λ³΄μ.
Family κ°μ²΄λ Family<Dad> family = new Family<>();
νΉμ Family<Son> family = new Family<>();
λ‘ μμ±λ μ μκ³
μ΄λ₯Ό 맀κ°λ³μλ‘ λ°μ μ²λ¦¬νλ λ©μλλ₯Ό λ§λ λ€κ³ μκ°ν΄λ³΄λ©΄,
μμ κ°μ΄ νμ
κΈ°νΈμμ μλ κ°μ²΄λ λ€νμ±μ΄ μ±λ¦½νμ§ μκΈ° λλ¬Έμ getName()
λ©μλλ₯Ό 2κ° μ μν΄μ£Όμ΄μΌ νλ€.
νμ§λ§, μ»΄νμΌμλ¬κ° λ°μνλ€.
μ΄μ λ μ λ€λ¦ νμ μ΄ λ€λ₯Έκ² λ§μΌλ‘λ μ€λ²λ‘λ©μ΄ μ±λ¦½νμ§ μμμ, λ©μλ μ€λ³΅ μ μ λ¬Έμ λ‘ μ»΄νμΌ μλ¬κ° λ°μνκΈ° λλ¬Έμ΄λ€.
μ΄λ΄λ μ¬μ©ν μ μλ κ²μ΄ ?
λ₯Ό μ΄μ©ν μμΌλ μΉ΄λμ΄λ€.
public class Test {
public static void main(String[] args) {
Ex.getName(new Family<Dad>());
Ex.getName(new Family<Son>());
}
}
class Ex{
static void getName(Family<? extends Dad> family) {
}
}
class Family<T extends Dad>{
T value;
}
class Son extends Dad{
}
class Dad{
}
μμ κ°μ΄ νλΌλ―Έν°μ <? extends Dad>
λ‘ λͺ
μν΄μ£Όμκ³ , μ΄λ Dadλ₯Ό μμνλ ν΄λμ€λ‘ νμ
μ μ§μ ν μ λ€λ¦ ν΄λμ€λ₯Ό λ°μ μ μμμ μλ―Ένλ€.
<? super Dad>
μ κ°μ΄ super
ν€μλλ₯Ό μ¬μ©νλ©΄ Dadμ Dadν΄λμ€μ μ‘°μ ν΄λμ€λ‘ μ νν μ μλ€.
μ°Έκ³ ν κΈ
- μλ°μ μ μ