comparable은 compareTo 메소드 를 오버라이딩해서 하나의 객체를 받는다.
내 주소에 있는 값과 가져온 값을 비교해서 오름, 내림 차순으로 정리할 수 있따.
comparator는 compare 로 두가지 값을 가지고 와서 비교 할 수 있다.
int compare(Integer n1, Integer n2){return n1-n2;}
import java.util.*;
class A{
public static void main(String args[]){
Set<Person> set = new TreeSet<Person>();
set.add(new Person(25));
set.add(new Person(15));
set.add(new Person(35));
System.out.println(set);// 15 25 35
}
}
class Person implements Comparable<Person>{
int age;
Person(int a) {age = a;}
public String toString(){return age+"";}
public int compareTo(Person anotherPerson){
return age-anotherPerson.age;
}
}
toString 을 호출하는 메소드가 없는데, 실행되는 이유는, 컴파일 할때 jdk가 toString() 을 호출하기 때문입니다 그니깐, System.out.println(set.toString()); 에서 호출해서 주소값이, 문자열로 바뀝니다.
age+""; 공백 없는 쌍 다옴표는 문자열로 만들어 줍니다~
import java.util.*;
class A{
public static void main(String args[]){
Set<Integer> set = new TreeSet<Integer>(new DC());
set.add(100);
set.add(99);
set.add(87);
System.out.println(set);
}
}
class DC implements Comparator<Integer>{
public int compare(Integer n1, Integer n2){return n2-n1;}
}
Person로직은 직접 만든거고, 있는 자료형으로 비교하는건 Comparator 와 compare 메소드를 사용하면 되는데, 얘를 호출한적 없는데 실행되네??
TreeSet에 new DC()가 들어 단 뒤, 내림 차순이 되었다 왜지? 왜냐면 해당 클래스를
호출하면 인터페이스로부터 상속받은 메소드가 실행됩니다 -> 클래스를 호출하지 않았따면 오름, 내림차순이 달라질 수 있어요
import java.util.*;
import java.io.*;
class A{
public static void main(String args[]){
Properties p =new Properties(); //객체생성
p.load(new FileInputStream("c:/java/cmd.properties")) //파일 읽어오기, 기본생성자 없음
String str = p.getProperty("abc");
System.out.println(str); //key 값을 넣고 100이라는 값을 출력
}
}
import java.util.*;
import java.io.*;
class A{
public static void main(String args[])throws Exception{
Properties p =new Properties(); //객체생성
p.load(new FileInputStream("c:/java/cmd.properties")); //파일 읽어오기, 기본생성자 없음
Set<String> set = p.stringPropertyNames();
System.out.println(set);// 프로펄티스에 있는 키갑만 출력하게 합니다
}
}
c 드라이버 java - test 에 src 와 bin 폴더가 있습니다.
src 폴더에 AddAction.java 파일을 만듭니다
안에 로직은 다음과 같습니다.
package a.b; //컴파일 할 파일 안에 패키지들을 만들어요~
public class AddAction{
public String toString(){return "추가";}
}
cmd 창에서 bin 폴더에 저장합니다
javac -d test/bin test/src/AddAction.java
src 폴더에 RemoveAction.java 도 만들어요
package c.d;
public class RemoveAction{
public String toString(){return "삭제";}
}
test1.java 의 로직은
import java.util.*;
import java.io.*;
class A{
public static void main(String args[])throws Exception{
Properties p =new Properties(); //객체생성
p.load(new FileInputStream("c:/java/cmd.properties")); //파일 읽어오기, 기본생성자 없음
Map<String,Object> map = new HashMap<>();
for(String key : p.stringPropertyNames()){//키가 있는 수 만큼 돌려요
String className = p.getProperty(key) //키를 주고 값을 반환해서, 패키지명+클래스명을 받았어요
Object obj = Class.forName(className).newInstance();//클래스 이름을 알면 객체 생성 할 수 있어요, 객체를 생성해서 메모리에 올리려는 거에요~ 이름을 메모리에 올리려는게 아니에요~
map.put(key,obj);이제 맵으로 key 와 AddAction을 메모리에 올렸습니다
}
System.out.println(map.get("add"));
System.out.println(map.get("remove"));
// 이제 클래스 객체가 메모리에 올라 갔기때문에 클라스 이름인AddAction이 아니라 AddAction 의 주소값이 나옵니다~
근데 해당 로직에는 toString 메소드가 잇어 JDK가 콤파일 할때 호출해서 return 값을 반환 합니다
}
}
만약 cmd 가 경로를 찾지 못한다면