22.5.05 [HackerRank]Java Generics

μ„œνƒœμš±Β·2022λ…„ 5μ›” 6일
0

Algorithm

λͺ©λ‘ 보기
29/45
post-thumbnail

🌱 배경지식

λ¬Έμ œλΆ„μ„

이 λ¬Έμ œμ—μ„œλŠ” integer와 string이 μžˆμ„ λ•Œ 두 νƒ€μž… λͺ¨λ‘λ₯Ό ν”„λ¦°νŠΈ ν•  수 μžˆλŠ”
ν•˜λ‚˜μ˜ λ©”μ†Œλ“œμΈ printArrayλ₯Ό μž‘μ„±ν•˜λŠ” λ¬Έμ œλ‹€.
(μ˜€λ²„λ‘œλ”©μ„ μ‚¬μš©ν•΄μ„œλŠ” μ•ˆλœλ‹€.)

Generic

μ œλ„€λ¦­ λ©”μ†Œλ“œλŠ” 단일 λ©”μ†Œλ“œλ‘œ μ—¬λŸ¬ λ°μ΄ν„°νƒ€μž…λ“€μ„ λ‹€λ£° 수 μžˆμ–΄ 맀우 μœ μš©ν•˜λ‹€.
데이터 νƒ€μž…μ„ μΌλ°˜ν™”(generalize)ν•œλ‹€λŠ” 의미λ₯Ό μ§€λ‹ˆλŠ”λ°, ν΄λž˜μŠ€λ‚˜ λ©”μ†Œλ“œμ—μ„œ μ‚¬μš©ν•  λ‚΄λΆ€ 데이터 νƒ€μž…μ„ μ»΄νŒŒμΌμ‹œμ— 미리 μ§€μ •ν•˜κ²Œ λœλ‹€.
이λ₯Ό 톡해,
1. ν΄λž˜μŠ€λ‚˜ λ©”μ†Œλ“œ λ‚΄λΆ€μ—μ„œ μ‚¬μš©λ˜λŠ” 객체의 νƒ€μž… μ•ˆμ •μ„±μ„ 높일 수 μžˆλ‹€.
잘λͺ»λœ νƒ€μž…μ΄ μ‚¬μš©λ  수 μžˆλŠ” 문제λ₯Ό 컴파일 κ³Όμ •μ—μ„œ μ œκ±°ν•  수 있기 λ•Œλ¬Έμ΄λ‹€.
2. λ°˜ν™˜κ°’μ— λŒ€ν•œ νƒ€μž… λ³€ν™˜ 및 νƒ€μž… 검사에 λ“€μ–΄κ°€λŠ” λ…Έλ ₯을 쀄일 수 μžˆλ‹€.
즉, νƒ€μž…μ„ κ΅­ν•œν•΄ μ£ΌκΈ° λ•Œλ¬Έμ— μš”μ†Œλ₯Ό μ°Ύμ•„μ˜¬ λ•Œ νƒ€μž… λ³€ν™˜μ„ ν•  ν•„μš”κ°€ μ—†μ–΄ ν”„λ‘œκ·Έλž¨ μ„±λŠ₯ νš¨κ³Όλ„ κΈ°λŒ€ν•  수 μžˆλ‹€.

μ œλ„€λ¦­ μ‚¬μš©λ²•

public class 클래슀λͺ…<T> {...}
public interface μΈν„°νŽ˜μ΄μŠ€λͺ…<T> {...}

클래슀 λ˜λŠ” μΈν„°νŽ˜μ΄μŠ€ λͺ… 뒀에 <>λΆ€ν˜Έκ°€ λΆ™κ³ , 사이에 νƒ€μž… νŒŒλΌλ―Έν„°κ°€ λ“€μ–΄κ°„λ‹€.

  1. ν΄λž˜μŠ€μ— μ œλ„€λ¦­ νŒŒλΌλ―Έν„°λ₯Ό μ„ μ–Έν•˜λŠ” 방법
    클래슀 μΈμŠ€ν„΄μŠ€ν™” μ‹œμ μ—μ„œ μ œλ„€λ¦­ νŒŒλΌλ―Έν„°λ₯Ό 톡해 νƒ€μž…μ„ μ „λ‹¬ν•œλ‹€. 클래슀 μš°μΈ‘μ— μ œλ„€λ¦­ νŒŒλΌλ―Έν„°λ₯Ό μ„ μ–Έν•΄μ€€λ‹€.
class Sample<T> {
   private T anonyTypeData;
 }    
  1. λ©”μ†Œλ“œμ— μ œλ„€λ¦­ νŒŒλΌλ―Έν„°λ₯Ό μ„ μ–Έν•˜λŠ” 방법
    λ©”μ†Œλ“œ μˆ˜ν–‰ μ‹œμ μ—μ„œ νŒŒλΌλ―Έν„° νƒ€μž…κ³Ό λΉ„κ΅ν•˜μ—¬ νƒ€μž…μ„ μ „λ‹¬ν•œλ‹€.
    μ œλ„€λ¦­ νƒ€μž…μ΄ λ©”μ†Œλ“œ 호좜 μ‹œμ μ— κ²°μ •λ˜μ–΄μ•Ό ν•  경우 μ‚¬μš©λ˜λ©°, νŒŒλΌλ―Έν„° νƒ€μž…μ— 따라 μ œλ„€λ¦­ νƒ€μž…μ΄ κ²°μ •λ˜κΈ° λ•Œλ¬Έμ— λ‹€μ΄λ‚˜λ―Ήν•œ 처리λ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.
    λ©”μ†Œλ“œ λ°˜ν™˜νƒ€μž… μ•žλΆ€λΆ„μ— μ œλ„€λ¦­ νŒŒλΌλ―Έν„°λ₯Ό μ„ μ–Έν•΄μ€€λ‹€.
public <T> T test2(Supplier<T> supplier){
   System.out.println("supplier μΈν„°νŽ˜μ΄μŠ€μ˜ λ°˜ν™˜νƒ€μž…μ— λ”°λΌμ„œ test2의 λ°˜ν™˜νƒ€μž…μ΄ κ²°μ •λœλ‹€.");
   return supplier.get();
 }
  1. λ™μ‹œμ— μ—¬λŸ¬ νƒ€μž…μ„ 선언해쀄 μˆ˜λ„ μžˆλ‹€.
public <P, R> R test(P p, Function<P, R> function){
    return function.apply(p);
}

class AnonyMap<K, V> implements Map<K, V>{
    ....
}

commaλ₯Ό κΈ°μ€€μœΌλ‘œ μ—¬λŸ¬κ°€μ§€ νƒ€μž…μ„ μ„ μ–Έν•΄ μ‚¬μš©ν•  수 μžˆλ‹€.

4.μ™€μΌλ“œ μΉ΄λ“œλ₯Ό μ‚¬μš©ν•΄ μœ μ—°ν•œ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜λ‹€.

@Test
public void test(){
  List<String> example = new ArrayList<>();
  method1(example); // μ œλ„€λ¦­ νƒ€μž…μ΄ μΌμΉ˜ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 컴파일 μ—λŸ¬ λ°œμƒ
  method2(example); // λͺ¨λ“  μ œλ„€λ¦­ νƒ€μž…μ„ ν—ˆμš©ν•˜κΈ° λ•Œλ¬Έμ— 컴파일 μ—λŸ¬ μ—†μŒ
}

public void method1(List<Object> param){ // List의 μ œλ„€λ¦­νƒ€μž…μœΌλ‘œ Object만 ν—ˆμš©ν•œλ‹€.
  // ...
}

public void method2(List<?> param){ // List의 μ œλ„€λ¦­νƒ€μž…μœΌλ‘œ λͺ¨λ“  νƒ€μž…μ„ ν—ˆμš©ν•œλ‹€.
  // ...
}

μ™€μΌλ“œ μΉ΄λ“œλŠ” 3가지 νƒ€μž…μ΄ μžˆλ‹€.
μ œλ„€λ¦­νƒ€μž…<?> : νƒ€μž… νŒŒλΌλ―Έν„°λ₯Ό λŒ€μΉ˜ν•˜λŠ” κ²ƒμœΌλ‘œ λͺ¨λ“  ν΄λž˜μŠ€λ‚˜ μΈν„°νŽ˜μ΄μŠ€νƒ€μž…μ΄ 올 수 μžˆμŠ΅λ‹ˆλ‹€.

μ œλ„€λ¦­νƒ€μž…<? extends μƒμœ„νƒ€μž…> : μ™€μΌλ“œμΉ΄λ“œμ˜ λ²”μœ„λ₯Ό νŠΉμ • 객체의 ν•˜μœ„ 클래슀만 올 수 μžˆμŠ΅λ‹ˆλ‹€.

μ œλ„€λ¦­νƒ€μž…<? super ν•˜μœ„νƒ€μž…> : μ™€μΌλ“œμΉ΄λ“œμ˜ λ²”μœ„λ₯Ό νŠΉμ • 객체의 μƒμœ„ 클래슀만 올 수 μžˆμŠ΅λ‹ˆλ‹€.

κ°œμ„ λœ forλ¬Έ

  • 쑰건
    1.JDK 1.5 이상
    2.μ‚¬μš©ν•  λ³€μˆ˜λŠ” μ§€μ—­λ³€μˆ˜λ‘œ μΈμ‹λœλ‹€. (Forλ¬Έ μ•ˆμ—μ„œ μ‚¬μš©λ˜κΈ° λ•Œλ¬Έ)
    3.λŒ€μƒμ€ λ°°μ—΄ or μ—¬λŸ¬ μ›μ†Œλ₯Ό ν¬ν•¨ν•œ μžλ£Œν˜•μ΄μ–΄μ•Ό ν•œλ‹€.

  • 문법

for(μžλ£Œν˜• λ³€μˆ˜λͺ… : λ°°μ—΄λͺ…){
	λ¬Έμž₯
}
  • 예제
String[] arr = {"1-1","1-2","1-3","1-4","1-5"};
 		
for(String s : arr) {
		  
 System.out.println(s);
		  
}

//κ²°κ³Ό
1-1
1-2
1-3
1-4
1-5

μžλ°” λ¦¬ν”Œλ ‰μ…˜

컴파일된 μžλ°” μ½”λ“œμ—μ„œ μ—­μœΌλ‘œ 클래슀λ₯Ό λΆˆλŸ¬μ„œ method및 λ³€μˆ˜(field)λ₯Ό λΆˆλŸ¬μ˜€λŠ” λ°©λ²•μœΌλ‘œ, 클래슀λ₯Ό 동적 λ‘œλ”©ν•˜μ—¬ μ‚¬μš©ν•  λ•Œ 많이 μ‚¬μš©λ˜κ³  λ””μ»΄νŒŒμΌμ‹œμ—λ„ 자주 μ‚¬μš©λœλ‹€.

ꡬ체적인 클래슀 νƒ€μž…μ„ μ•Œμ§€ λͺ»ν•˜μ§€λ§Œ ν•΄λ‹Ή ν΄λž˜μŠ€μ— μ ‘κ·Όν•˜λ € ν•  λ•Œ μ‚¬μš©ν•˜λŠ” APIλ‹€. λ³€μˆ˜μ˜ 값을 쑰건에 λ”°λΌμ„œ λ‹€λ₯΄κ²Œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 경우 ν˜Ήμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹€ν–‰λ˜κ³  λ‚˜μ„œ μƒμ„±λ˜λŠ” 클래슀의 κ²½μš°μ— μ‚¬μš©ν•΄λ³Ό 수 μžˆλ‹€.

✏️ ν•΄μ„€


import java.io.IOException;
import java.lang.reflect.Method;
import java.security.PublicKey;

class Printer {
    //Write your code here
    public <T> void printArray(T[] array){ //μ œλ„€λ¦­ νƒ€μž…μ΄ λ©”μ†Œλ“œ 호좜 μ‹œμ μ— κ²°μ •λ˜μ–΄μ•Ό ν•  경우 μ‚¬μš©λ˜λ©°, νŒŒλΌλ―Έν„° νƒ€μž…μ— 따라 μ œλ„€λ¦­ νƒ€μž…μ΄ κ²°μ •λ˜κΈ° λ•Œλ¬Έμ— 동적인 처리 κ°€λŠ₯
        for (T element: array){ //ν–₯μƒλœ forλ¬Έ. for(μžλ£Œν˜• λŒ€μž…λ°›μ„ λ³€μˆ˜λͺ…: λ°°μ—΄λͺ…) λ°°μ—΄ ν•­λͺ©μ„ μ²˜μŒλΆ€ν„° ν•˜λ‚˜μ”© element에 λŒ€μž…ν•΄ μ‹€ν–‰ν•œλ‹€. κ·Έ λ°°μ—΄μ˜ 길이만큼 for문이 λˆλ‹€.
            System.out.println(element);
        }
    }

}

public class JavaGenerics {


    public static void main( String args[] ) {
        Printer myPrinter = new Printer();
        Integer[] intArray = { 1, 2, 3 };
        String[] stringArray = {"Hello", "World"};
        myPrinter.printArray(intArray); //intArray: Integer[3]
        myPrinter.printArray(stringArray); //stringArray: ["Hello", "World"]
        int count = 0;

        for (Method method : Printer.class.getDeclaredMethods()) { //getDeclaredMethods()λŠ” ν΄λž˜μŠ€μ— μ •μ˜λœ λͺ¨λ“  λ©”μ†Œλ“œ(μ ‘κ·Όμž, λ¦¬ν„΄νƒ€μž…, νŒŒλΌλ―Έν„°) 정보λ₯Ό κ°€μ Έμ˜¨λ‹€.
            String name = method.getName(); // name: printArray

            if(name.equals("printArray"))
                count++; //쑰건이 μΆ©μ‘±ν•˜λ―€λ‘œ count +1
        }

        if(count > 1)System.out.println("Method overloading is not allowed!");

    }
}

πŸ‘‰ μ°Έκ³ 

0개의 λŒ“κΈ€