제너릭 알고리즘
: 컬렉션에 적용할 수 있는 메서드이다.
- 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 |
댓글