[계산] package CollectionF; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test4 { public static void main(String[] args) { List<String> list = new ArrayList<>(); // 컬렉션 인스턴스 생성 list.add("Toy"); list.add("Box"); list.add("Robot"); for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i) + '\t'); } System.out.println(); for (String word : list) { System.out.print(word + '\t'); } System.out.println(); for (Iterator<String> itr = list.iterator(); itr.hasNext();) { System.out.print(itr.next() + '\t'); } } }
[결과값] Toy Box Robot Toy Box Robot Toy Box Robot
[계산] //Scanner 클래스로 -1이 입력될 때까지 //양의 정수를 입력 받아 저장(List객체)하고 검색하여 //가장 큰 수를 출력하는 프로그램을 작성하라. package CollectionF; import java.util.*; public class Test5 { public static void main(String[] args) { int num = 0; Scanner sc = new Scanner(System.in); List<Integer> list = new ArrayList<>(); boolean run = true; while (run) { System.out.print("숫자를 입력하시오 ⇒ "); num = sc.nextInt(); list.add(num); if (num == -1) { System.out.println("종료합니다."); run = false; } } System.out.println("가장 큰 수: " + Collections.max(list)); } }
[결과값] 숫자를 입력하시오 ⇒ 20 숫자를 입력하시오 ⇒ 10 숫자를 입력하시오 ⇒ 50 숫자를 입력하시오 ⇒ 100 숫자를 입력하시오 ⇒ -1 종료합니다. 가장 큰 수: 100
[계산] //Scanner 클래스로 -1이 입력될 때까지 //양의 정수를 입력 받아 저장(List객체)하고 검색하여 //가장 큰 수를 출력하는 프로그램을 작성하라. package CollectionF; import java.util.*; class MaxList { private List<Integer> list; private Scanner sc; public MaxList() { list = new LinkedList<>(); sc = new Scanner(System.in); } public void inputList() { System.out.print("정수(-1이 입력될 때까지)>>"); int num = 0; while (num != -1) { try { num = sc.nextInt(); list.add(num); } catch (Exception e) { System.out.println("잘못된 입력입니다. 다시 입력하시기 바랍니다."); continue; } } } public int getMax() { // Max 값 구하기 int maxNum = Integer.MIN_VALUE; for (int i = 0; i < list.size(); i++) { if (list.get(i) > maxNum) { maxNum = list.get(i); } } System.out.println("가장 큰 수는 " + maxNum); return maxNum; } } public class Test6 { public static void main(String[] args) { MaxList maxList = new MaxList(); maxList.inputList(); maxList.getMax(); } }
[결과값] 정수(-1이 입력될 때까지)>>1 20 80 100 -1 가장 큰 수는 100
집합을 구현(set = hashcode)
equals == hashCode : 동일 객체를 판단하는 것
★set 호출 원리★
①add를 호출하는 순간, Object함수 안에 있는 hashCode함수를 호출하여 군집을 만든다.
②equals 함수를 사용하여 군집 내에 같은 것이 있는가 체크한다.
・저장 순서가 유지되지 않는다.
・동일 객체 ★데이터의 중복 저장을 허용하지 않는다.★
ex)로또
hash알고리즘 : num % 10 ⇒ 0, 1, 2 집합 생성
hashCode : 0, 1, 2를 hashCode라고 한다.
hashCode가 속도가 제일 빠르다.
[계산] // 출력 결과를 통해 동일 인스턴스가 저장되지 않음을 알 수 있다. package CollectionF; import java.util.*; public class SetClassTest { public static void main(String[] args) { Set<String> set = new HashSet<>(); set.add("Toy"); set.add("Box"); set.add("Robot"); set.add("Box"); System.out.println("인스턴스 수: " + set.size()); // 반복자를 이용한 전체 출력 for (Iterator<String> itr = set.iterator(); itr.hasNext();) System.out.print(itr.next() + '\t'); System.out.println(); // for-each문을 이용한 전체 출력 for (String s : set) System.out.print(s + '\t'); System.out.println(); } }
[결과값] 인스턴스 수: 3 Box Robot Toy Box Robot Toy ---
[계산] package CollectionF; import java.util.HashSet; class Num { private int num; public Num(int num) { this.num = num; } @Override public String toString() { return String.valueOf(num); } } public class SetHashCode { public static void main(String[] args) { HashSet<Num> set = new HashSet<>(); // 인스턴스 수: 3 set.add(new Num(7799)); set.add(new Num(9955)); set.add(new Num(7799)); for (Num n : set) System.out.println(n.toString() + '\t'); } } // HashSet<Integer> set = new HashSet<>(); // 인스턴스 수: 2 // set.add(7799); // set.add(9955); // set.add(7799); // System.out.println("인스턴스 수: " + set.size());
[결과값] 인스턴스 수: 3 7799 7799 9955 ---
[계산] package CollectionF; import java.util.HashSet; class Num { // extends Object 생략되어 있어, hashCode를 호출한다. private int num; public Num(int num) { // System.out.println(super.hashCode()); // new Num의 주소를 출력한다. this.num = num; } @Override public String toString() { return String.valueOf(num); } @Override public int hashCode() { // 보통 num % 31을 사용한다. return num % 3; // 3개의 군집을 만들겠다는 의미. (0,1,2) | 군집↓ : 메모리↓, 작업시간↑ | 군집↑ : 메모리↑, 작업시간↓ // 7799 나머지 2 ... 2라는 이름의 군집을 만든다. ⇒ 2 집합 안에 7799가 들어간다. // 9955 나머지 1 ... 1이라는 이름의 군집을 만든다. ⇒ 1집합 안에 9955가 들어간다. // 7799 나머지 2 ... 2라는 이름의 군집을 만든다. ⇒ 2 집합 안에 동일한 내용이 있기에 기존에 있던 7799를 삭제하고 들어간다. // (equals 단계에서 삭제) } @Override public boolean equals(Object obj) { if (num == ((Num) obj).num) return true; else return false; } } public class SetHashCode { public static void main(String[] args) { HashSet<Num> set = new HashSet<>(); // 인스턴스 수: 3 set.add(new Num(7799)); set.add(new Num(9955)); set.add(new Num(7799)); // 오버라이딩이 안 되어 있으면 부모 것을 호출한다. // public native int hashCode(); // String toString(){ return getClass().getName() + "@" + // Integer.toHexString(hashCode()); ⇒ hashCode는 주소 System.out.println("인스턴스 수: " + set.size()); for (Num n : set) System.out.println(n.toString() + '\t'); } }
[결과값] // 1562557367 주소 // 1101288798 주소 // 942731712 주소 인스턴스 수: 2 9955 7799 ---
[계산] package CollectionF; import java.util.HashSet; class Person { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public int hashCode() { return age % 3; } @Override public boolean equals(Object obj) { if (this.name.equals(((Person) obj).name) && (this.age == (((Person) obj).age))) { return true; } else { return false; } } @Override public String toString() { return this.name + "(" + this.age + "세)"; } } public class Test7 { public static void main(String[] args) { HashSet<Person> hSet = new HashSet<Person>(); hSet.add(new Person("LEE", 10)); hSet.add(new Person("LEE", 10)); hSet.add(new Person("PARK", 35)); hSet.add(new Person("PARK", 35)); System.out.println("저장된 데이터 수: " + hSet.size()); System.out.println(hSet); } }
[결과값] 저장된 데이터 수: 2 [LEE(10세), PARK(35세)] ---