학원 28일차 - Java

·2021년 7월 10일
0

2021.05.06

List 인터페이스

  • Collection 인터페이스의 자식

  • 순서가 있는 배열(★★★★★★)

  • 순수배열, ArrayList, LinkedList -> 방번호 존재 -> 첨자(index)를 사용해서 요소를 관리한다.

  • 요소가 중복값을 가질 수 있다.(★★★★★★★)

Set 인터페이스

  • Collection 인터페이스의 자식

  • 순서가 없는 배열(★★★★★★)

  • 방번호 존재X -> 첨자(index)를 사용하지 않음 -> 순서가 없다.

  • 요소가 중복값을 가질 수 없다.(★★★★★★)

public class Ex77_HashSet {
	
	public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
		HashSet<String> set = new HashSet<String>();
		
		//요소 추가
		list.add("사과");
		list.add("딸기");
		list.add("바나나");
		list.add("딸기"); //중복값 허용, 방번호가 달라서 구분 가능하기 때문에
		
		set.add("사과");
		set.add("딸기");
		set.add("바나나");
		set.add("딸기"); //중복값 허용 안함. 방번호가 없어서 데이터로 구분이 안되면 아예 구분 불가능하기 때문에..
		
		//갯수
		System.out.println(list.size());
		System.out.println(set.size());
		
		//덤프(출력용으로 사용 금지 -> 개발자만 보는 용도)
		System.out.println(list);
		System.out.println(set);
		
		//요소 접근 / 탐색
		//System.out.println(list.get(0));
		
		//get(), indexOf(), lastIndexOf(), remove().. X
		System.out.println();
		
		for (String item : list) {
			System.out.println(item);
		}
		System.out.println();
		
		//Set -> Iterator 지원
		Iterator<String> iter = set.iterator();
		
		while (iter.hasNext()) {
			System.out.println(iter.next());
		}
    }
}
  • 로또 번호 만들기
public class Ex77_HashSet {
	
	public static void main(String[] args) {
        
        //로또 번호 만들기 -> 중복값 허용X
		Random rnd = new Random();
		
		//List로 로또번호 만들기
		ArrayList<Integer> lotto = new ArrayList<Integer>();
		
		for (int i=0; i<6; i++) {
			
			boolean flag = false;
			
			int n = rnd.nextInt(45) + 1;
			
			//같은 숫자 검사
			for (int j=0; j<i; j++) {
				if (n == lotto.get(j)) {
					flag = true;
					break; // 같은 숫자 발견하면 break
				}
			}
			
			if (flag) {
				i--; 
			} else {
				lotto.add(n);				
			}
		}
		
		Collections.sort(lotto); // 정렬
		
		System.out.println(lotto);
		
		
		//Set으로 로또번호 만들기
		HashSet<Integer> lotto2 = new HashSet<Integer>();
		
		while (lotto2.size() < 6) {
			int n = rnd.nextInt(45) + 1;
            
			// System.out.println(lotto2.add(n)); //중복값이 나오면 false반환            
            lotto2.add(n); // 중복값 알아서 통제
		}
		
		System.out.println(lotto2);
    }
}
public class Ex77_HashSet {
	
	public static void main(String[] args) {
		//단일값(원자값) 집합
		// - String[]
		// - int[]
		// - HashSet<String>
		// - HashSet<Integer>
		
		//복합값 집합 -> 객체 배열
		// - Student[]
		// - HashSet<Student>
		
		HashSet<Integer> lotto = new HashSet<Integer>();
		lotto.add(10);
		lotto.add(5);
		lotto.add(10); //허용X
		
		//Set -> 중복값 허용 안함
		HashSet<Keyboard> set = new HashSet<Keyboard>();
		
		set.add(new Keyboard("K810", 200000)); //A
		set.add(new Keyboard("K310", 50000));  //B
		set.add(new Keyboard("K810", 200000)); //C
		
		//A와 C는 같은 키보드? 아니냐?
		// - 모든 참조형(객체)는 아무리 상태(멤버 변수의 값)가 동일해도.. 다른 객체로 취급한다.
		// - 쌍둥이 개념
        
		System.out.println(set);	
	}//main
}

class Keyboard {
	
	private String model;
	private int price;
	
	public Keyboard(String model, int price) {
		this.model = model;
		this.price = price;
	}

	public String getModel() {
		return model;
	}

	public void setModel(String model) {
		this.model = model;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}

	@Override
	public String toString() {
		return "[model=" + model + ", price=" + price + "]";
	}
	
	//hashCode 오버라이딩 + equals 오버라이딩
	@Override
	public int hashCode() {
	
		//return 100; //고정 상수 반환 금지
		
		//본인의 상태에 따라 달라지는 값을 반환하도록 재정의
		//k1: "K810", 200000 -> "K810200000" -> 100
		//k2: "K810", 200000 -> "K810200000" -> 100
		//k4: "K990", 350000 -> "K990350000" -> 200
		
		return (this.model + this.price).hashCode();
	}
	
	@Override
	public boolean equals(Object obj) {
		
		return this.hashCode() == obj.hashCode();
	}
}
public class Ex77_HashSet {
	
	public static void main(String[] args) {
        
        //값형
		int a = 10;
		int b = 10;		
		System.out.println(a == b);
		
		boolean f1 = true;
		boolean f2 = true;
		System.out.println(f1 == f2);
		System.out.println();
		
		//참조형
		
		//1. 문자열은 불변이다.(Immutable) -> 메모리 성질, 문자열 재사용
		//2. 모든 참조형 변수의 비교(==)는 주소값을 비교한다.
		String s1 = "홍길동";
		String s2 = "홍길동";
		
		s1 = "홍길동님";
		
		String s3 = "홍";
		s3 = s3 + "길동";
		
		//절대로 하지 말것(==) 문자열 비교는 반드시 equals로 할 것
		System.out.println(s1 == s2); //true
		System.out.println(s1.equals(s2));//String.equals(Object anObject)
		
		System.out.println(s1 == s3); //false
		System.out.println(s1.equals(s3)); //true
		System.out.println();
		
        
		//참조형 객체의 비교
		Keyboard k1 = new Keyboard("K810", 200000);
		Keyboard k2 = new Keyboard("K810", 200000);
		Keyboard k3 = k1;
		Keyboard k4 = new Keyboard("K990", 350000);
		
		System.out.println(k1 == k2); //false
		System.out.println(k1.equals(k2)); //주소값 비교(Object.equals)
		System.out.println(k1 == k3); //true
		System.out.println();
		
		System.out.println(k1.toString());
		System.out.println(k2.toString());
		
		System.out.println(k1.hashCode()); //객체의 위치(메모리 주소값)
		System.out.println(k2.hashCode());
		System.out.println(k4.hashCode());
		
		System.out.println(k1 == k2); //false(X)
		System.out.println(k1.equals(k2)); //true
		System.out.println(k1.equals(k4)); //true -> false
		
		System.out.println();
		System.out.println();
		System.out.println();
		
		System.out.println(k1.hashCode());
		System.out.println(k2.hashCode());
		System.out.println(k4.hashCode());
		System.out.println();
		System.out.println();
		
		System.out.println(k1.equals(k2)); //같은 키보드
		System.out.println(k1.equals(k4)); //다른 키보드
    }
}

class Keyboard {
	
	private String model;
	private int price;
	
	public Keyboard(String model, int price) {
		this.model = model;
		this.price = price;
	}

	public String getModel() {
		return model;
	}

	public void setModel(String model) {
		this.model = model;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}

	@Override
	public String toString() {
		return "[model=" + model + ", price=" + price + "]";
	}
	
	//hashCode 오버라이딩 + equals 오버라이딩
	@Override
	public int hashCode() {
	
		//return 100; //고정 상수 반환 금지
		
		//본인의 상태에 따라 달라지는 값을 반환하도록 재정의
		//k1: "K810", 200000 -> "K810200000" -> 100
		//k2: "K810", 200000 -> "K810200000" -> 100
		//k4: "K990", 350000 -> "K990350000" -> 200
		
		return (this.model + this.price).hashCode();
	}
	
	@Override
	public boolean equals(Object obj) {
		
		return this.hashCode() == obj.hashCode();
	}
}
profile
모르면 괴롭고 알면 즐겁다.

0개의 댓글