본문 바로가기
Computer Science/JAVA

[JAVA] 제너릭과 List

by 그적 2020. 11. 20.

제너릭 알고리즘

: 컬렉션에 적용할 수 있는 메서드이다. 

- static으로 선언된 함수 집합

- 요소 타입에 관계 없이 사용 가능

- 컬렉션 중에서 조건을 만족하는 경우에 사용 가능

 

리스트 알고리즘

: 리스트에 적용할 수 있는 메소드이다.

- 리스트 상속 모든 클래스에 적용 가능

- sort(), shuffle(), reverse(), rotate(), swap(), replaceAll(), fill(), binarySearch() 메소드 등

 

위의 두가지를 동시에 적용할 수 있는 예시

① Collections.sort 함수 : 리스트를 상속한 모든 컬렉션 객체를 사용 가능

- sorting한 결과를 정렬

- 전제 조건은 list의 요소 타입이 Comparable Interface를 상속해야 한다. (비교 가능)

 

import java.util.*;
public class sort{
    public static void main(String[] args){
        List<String> list = Arrays.asList(args);
        Collections.sort(list);                    // sort 메소드
        System.out.println(list);
    }
}

다음 코드를 보면, "제너릭 알고리즘+리스트 알고리즘"을 동시에 적용하였다.

sort 메소드를 사용하기 위해 List 클래스인 list를 선언하였고, sort 알고리즘 내부적으로 Comparable<T> 인터페이스를 상속하고 있다. 기본적으로 String 및 Number 클래스는 모두 Comparable 인터페이스를 상속하고 있는데, 만약 우리가 직접 만든 클래스들은 Comparable 인터페이스를 상속하고 있지 않기 때문에 해당 인터페이스를 상속하도록 해야 한다.

interface Comparable<T>{
    int compareTo(T obj);
}

 

// 직접 만든 클래스를 sorting 하려면? 해당 요소(클래스)가 Comparable을 implements해야한다.
class Student implements Comparable<Student>{
    public int compareTo(Student obj){
        if(!name.equals(obj.name) return name.compareTo(obj.name);
        return (year - obj.name);
    }
}

 

sort 함수의 정의부

1) T가 반드시 Comparable 인터페이스를 상속

static<T extends Comparable <T>> void sort(Collection<T> c) { ... }

2) sort함수에 모든 콜렉션 T가 올 수 있지만, compare 메소드를 가지는 Comparator 인터페이스를 제공

static<T> void sort(Collection<T> c, comparator<T> comp) { ... }

// Comparator 인터페이스?

 - Comparable Interface가 구현되지 않았을 경우에 사용

 - 다른 기준으로 정렬하고 싶을 때 사용

 - int compare(T obj1, T obj2); 를 통해 두 요소를 비교하는 함수를 제공

   >> 무명 클래스로 구현하여 매개변수로 넘겨준다.

 

 

제너릭 알고리즘과 리스트 알고리즘을 적용할 수 있는 또 다른 예시는

② For-each 메소드 (=Iterator 인터페이스)

: 컬렉션에 주로 사용되며, 요소를 하나씩 차례로 방문할 수 있게 돌려주는 역할을 한다.

  for-each문은 Iterator 인터페이스를 이용한다.

 

Iterator<T> 인터페이스

: Collection<E> 인터페이스가 iterator<t> 인터페이스를 구현한다. (Collection은 모든 콜렉션의 슈퍼클래스 이기 때문)

- Iterator를 돌려주는 함수를 정의하는 인터페이스이다.

- Iterator 인터페이스는 hasNext(), next() 메소드를 가진다.

interface Iterable<T>{
    Iterator<T> iterator();
}

public interface Iterator<t>{
    boolean hasNext();
    T next();
}
for(String name: names){
    System.out.println(name);
}

// 위에서 사용한 Iterator은 실제로 아래와 같은 코드를 가진다.
for(Iterator<String> i = names.iteraotr(); i.hasNext(); ){
    String name = i.next();
    System.out.println(name);
}

 

이 메소드 또한 만약 우리가 직접 만든 클래스들은 Comparable 인터페이스를 상속하고 있지 않기 때문에 해당 인터페이스를 상속하도록 해야 한다.

private class RnadIterator implements Iterator <Student>{
    List<Student> shuffleList;
    RandIterator(){
        shuffleList = new ArrayList<>(myList);
        Collections.shuffle(shuffleList);
    }
    
    public boolean hasNext(){
        return shuffleList.size() > 0;
    }
    public Student next(){
        Student st = shuffleList.get(0);
        shuffleList.remove(st);
        return st;
    }
}

 

'Computer Science > JAVA' 카테고리의 다른 글

[JAVA] String, StringBuffer, StringBuilder, StringJoiner 차이  (0) 2022.10.21
[JAVA] 기본 클래스, Object  (0) 2020.11.20
[JAVA] 컬렉션이란?  (0) 2020.11.03
[JAVA] 제너릭이란?  (0) 2020.11.03
[JAVA] 추상화란?  (0) 2020.10.23

댓글