Day 40 (23.02.21)

Jane·2023년 2월 21일
0

IT 수업 정리

목록 보기
47/124

1. 양의 정수 입력 (객체 지향 버전 코드)

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;
			}
		}

		// sc.close();
	}
	
	public int getMax() { // 큰 수 찾기
		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;
	}
	
	
}

class JavaPractice {

	public static void main(String[] args) {
		MaxList list = new MaxList();
		list.inputList();
		list.getMax();
	}

}

2. Set < E >

2-1. Set과 List의 차이

SetList
요소의 중복
(동일한 요소/객체)
XO
요소의 순서XO

2-2. Hashset의 사용 예시

import java.util.*;

class JavaPractice {

	public static void main(String[] args) {
		Set<String> set = new HashSet<>();
		set.add("Toy");
		set.add("Box");
		set.add("Robot");
		set.add("Box"); // 추가해도 반영 X

		System.out.println("인스턴스 수 : " + set.size());

		/*
		 * for(Iterator<String> itr = set.iterator(); itr.hasNext(); ) {
		 * System.out.print(itr.next() + "\t"); }
		 */

		for (String s : set) {
			System.out.print(s + ' ');
		}

	}

}

[Console]
인스턴스 수 : 3
Box Robot Toy

  • 요소를 집어넣은 순서대로 나오지 않았다.
  • String 형태("")가 아닌, new String(객체 생성)으로 만들어도 동일한 요소로 취급한다.

2-3. 동일한 요소(인스턴스)를 걸러내는 함수

  • Object 클래스 안에 있는 함수로, extends해서 쓸 수 있다.
    • int hashCode() : 군집(群集)을 만든다.
    • boolean equals(Object obj) : 군집 내에서 같은 것이 있는지 체크한다. 새로 들어온 것이 기존의 것을 밀어낸다.
  • @Override로 자식 클래스에서 정의하지 않으면, Object 클래스의 hashCode()와 equals()를 호출하여 실행하게 된다.
import java.util.*;

class Num{ // extends Object
	private int num;
	public Num(int n) {num = n;}
	
	@Override
	public String toString() {
		return String.valueOf(num);
	}
	
	@Override
	public int hashCode() {
		return num % 3;
	}
	
	@Override
	public boolean equals(Object obj) {
		if(num == ((Num)obj).num)
			return true;
		else return false;
	}
}


class JavaPractice {

	public static void main(String[] args) {
		 HashSet<Num> set = new HashSet<>();
	        set.add(new Num(7799));
	        set.add(new Num(9955));
	        set.add(new Num(7799));

	        System.out.println("인스턴스 수: " + set.size());

	}

}

3. 해쉬코드 함수 분석하기

3-1. 해쉬코드 구조

Object 클래스 >> int hashCode()

  • native : Java가 내부적으로 C++로 코딩하며, 암호화되어 알고리즘을 누구에게나 공개하지 않는다.

Object 클래스 >> String toString()

3-2. 객체 안의 hashCode 보기

  • Overriding 되지 않은 hashCode()는 Object 클래스가 임의로 지정해준다.
import java.util.*;

class Num {
	private int num;

	public Num(int n) {
		System.out.println(super.hashCode()); // 해쉬코드를 출력해주는 코드
		num = n;
	}

	/*
	 * @Override public String toString() { return String.valueOf(num); }
	 * 
	 * @Override public int hashCode() { return num % 3; }
	 * 
	 * @Override public boolean equals(Object obj) { if(num == ((Num)obj).num)
	 * return true; else return false; }
	 */

}

class JavaPractice {

	public static void main(String[] args) {
		HashSet<Num> set = new HashSet<>();
		set.add(new Num(7799));
		set.add(new Num(9955));
		set.add(new Num(7799));
	}

}

[Console]
1227229563
1982791261
1562557367

3-3. 해쉬코드의 구역

해쉬코드의 구역이적을 때많을 때
속도느리다빠르다
안에서 비교하는시간이 많이 걸린다시간이 적게 걸린다
메모리많이 잡아먹지 않는다많이 잡아먹는다
  • 적당한 구역으로 나누는 것이 바람직하다.
  • 원하는 것을 빠르게 검색하는 것이 중요하다.
profile
velog, GitHub, Notion 등에 작업물을 정리하고 있습니다.

0개의 댓글