42일차 java 연산(2023-02-21)

권단비·2023년 2월 21일
0

IT

목록 보기
79/139

[Eclipse 연습]

[계산]
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<`E> 인터페이스를 구현하는 컬렉션 클래스들]

집합을 구현(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세)]
---

0개의 댓글