학원 28일차 - Java
2021.05.06
List 인터페이스
-
Collection 인터페이스의 자식
-
순서가 있는 배열(★★★★★★)
-
순수배열, ArrayList, LinkedList -> 방번호 존재 -> 첨자(index)를 사용해서 요소를 관리한다.
-
요소가 중복값을 가질 수 있다.(★★★★★★★)
Set 인터페이스
-
Collection 인터페이스의 자식
-
순서가 없는 배열(★★★★★★)
-
방번호 존재X -> 첨자(index)를 사용하지 않음 -> 순서가 없다.
-
요소가 중복값을 가질 수 없다.(★★★★★★)
Collection 인터페이스의 자식
순서가 있는 배열(★★★★★★)
순수배열, ArrayList, LinkedList -> 방번호 존재 -> 첨자(index)를 사용해서 요소를 관리한다.
요소가 중복값을 가질 수 있다.(★★★★★★★)
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();
}
}
Author And Source
이 문제에 관하여(학원 28일차 - Java), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hi-dae-in/학원-28일차-Java저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)