Ajax에는 Same Origin Policy라는 원칙이 있다. 말 그대로, 현재 브라우져에 보여지고 있는 HTML을 내려준 웹서버(Origin)에게만 Ajax 요청을 보낼 수 있다.
MS가 XMLHttpRequest를 처음 만들 때만 해도 이런 제약은 당연한 것처럼 보였지만, 지금에 와서는 OpenAPI를 통한 매시업(Mashup)이 활성화되는 데 가장 큰 장애물이 되었다. 매시업이 아니더라도 여러 개의 도메인을 사용해야 하는 대규모 사이트를 개발할 때도 골치거리였다. Same Origin Policy를 우회하는 방법으로 JSONP, IFRAME IO, CrossDomain Proxy 등이 고안되었지만, 보안성이 취약하다거나, 동기 호출이 안되거나, 주고 받는 데이터 형식이 제한되거나, 직관적이지 못하거나(dirty hack), ... 등의 문제점 때문에 표준화되기엔 무리가 있었다.
(중략) 한 참 뒤에야 W3C는 (MS의 IE가 제공하는 방식을 수용하여) 크로스도메인간에도 Ajax요청을 주고 받을 수 있는 방법을 표준화 했는데, 그것이 바로 CORS다.
CORS를 한 마디로 요약하면, "요청을 받은 웹서버가 허락하면 크로스도메인이라도 Ajax로 통신할 수 있다"라는 정책이다. 기술적으로는 크로스도메인에 위치한 웹서버가 응답에 적절한 Access-Control-Allow-류의 헤더를 보냄으로써 크로스도메인 Ajax를 허용 수 있다
리스트 같은 객체들을 인자로 받아서 TreeSet을 만들면 알아서 기본순서로(compareTo에 정의된 대로) 정렬
Set set = new TreeSet(list);
정렬기준을 바꾸고 싶다면 Comparator를 구현한 객체를 생성자로 만든후 리스트를 집어넣어줌
Set set2 = new TreeSet(new YoungOrderComparator());
set2.addAll(list);
예제 소스
import java.util.*;
public class A {
public static void main(String args[]) {
// 다섯명의 고객에 대한 배열 생성
Customer[] arr = new Customer[] {
new Customer("헤더 로클리어",1961, "Heather Deen Locklear"),
new Customer("데미 무어", 1962, "Demetria Gene Guynes"),
new Customer("안젤라 바셋", 1958, "Angela Bassett"),
new Customer("신디 크로퍼드", 1966, "Cintia Ann Crawford"),
new Customer("캐서린 제타 존스", 1969, "Catherine Jones")
};
printArray(arr, "Before Array sort Using Default sort");
// 배열을 정렬 (클래스에 정의된 기본정렬)
Arrays.sort(arr);
printArray(arr, "\nAfter Array sort Using Default sort");
// 배열을 어린 나이부터 정렬
Arrays.sort(arr, new YoungOrderComparator());
printArray(arr, "\nAfter Array sort Using YoungOrderComparator");
List list = Arrays.asList(arr); // 배열을 리스트로
Collections.shuffle(list); // 리스트의 순서를 마구 섞어 주세요.
printList(list, "\nBefore List sort Using Default sort");
// 리스트를 정렬 (클래스에 정의된 기본정렬)
Collections.sort(list);
printList(list, "\nAfter List sort Using Default sort");
// 리스트를 영문이름으로 정렬
Collections.sort(list, new EngNameComparator());
printList(list, "\nAfter List sort Using EngNameComparator");
// 디폴트 정렬할 수 있는 TreeSet을 만든다
Set set = new TreeSet(list);
System.out.println("\nAfter Making Set Using Default sort\n" + set);
// 어린 나이부터 정렬할 수 있는 TreeSet을 만든다
Set set2 = new TreeSet(new YoungOrderComparator());
set2.addAll(list);
System.out.println("\nAfter Making Set Using YoungOrderComparator\n" + set2);
}
static void printArray(Customer[] a , String title) {
System.out.println(title);
for (int i=0; i<a.length; i++)
System.out.println(a[i]);
}
// 디폴트 소팅을 위해서 Comparable 인터페이스를 구현한다.
class Customer implements Comparable {
String name;
int birthYear;
String engName;
// Constructor
public Customer(String name, int birthYear, String engName) {
this.name = name;
this.birthYear = birthYear;
this.engName = engName;
}
// Object의 toString 메소드 overriding.. 객체의 문자적 표현
public String toString() {
return name + "(" + engName + ") " + birthYear + "년생";
}
// Comparable 인터페이스를 구현한 클래스에서 반드시 overriding 해야만 하는 비교 메쏘드
public int compareTo(Object o) {
// String의 compareTo 메소드를 호출(사전순서적( lexicographically)으로 비교)
return name.compareTo(((Customer)o).name);
}
}
// 젊은 순서대로 정렬하기 위해 Comparator 인터페이스를 구현
class YoungOrderComparator implements Comparator {
public int compare(Object o1, Object o2) {
int by1 = ((Customer)o1).birthYear;
int by2 = ((Customer)o2).birthYear;
return by1 > by2 ? -1 : (by1 == by2 ? 0 : 1); // descending 정렬.....
}
}
// 영문이름으로 정렬하기 위해 Comparator 인터페이스를 구현
class EngNameComparator implements Comparator {
public int compare(Object o1, Object o2) {
String en1 = ((Customer)o1).engName;
String en2 = ((Customer)o2).engName;
return en1.compareTo(en2); // ascending 정렬
}
}
3. 중복 제거하고 정렬하기
Treeset 사용
public class TSetTest {
public static void main(String[] args) {
String str = "가,나,다,다,라, 마, 바, 사,라";
TreeSet tset = new TreeSet();
String[] tokens = str.split(",");
for(int i = 0; i < tokens.length; i++) {
tset.add(tokens[i]);
}