본문 바로가기

웹 개발/Java

[Web_JAVA] 31

● Set : 집합

1. 구현 클래스

(1) HashSet

- 집합에서는 중복되는 원소를 포함할 수 없는 것 처럼 HashSet이라는 자료구조는 중복되는 값을 무시한다.

- 저장된 값들은 인덱스가 없기 때문에 순서가 없다.

- 값의 유무 검사에 특화되어 있는 자료구조이다.

- hashCode()로 유무 검사가 진행되고 속도가 상대적으로 좋다.

 

 

2. 순서 부여

(1) iterator()

- 순서가 없는 객체에 순서를 부여하거나, 순서가 있어도 iterator 방식의 순서로 변경하고자 할 때 사용한다.

- hasNext()를 통해 다음 값이 있는 지 검사하고, next()를 사용하여 값을 가져온다.

 

 


 

실습(HashSet & Iterator)

1. HashSet

import java.util.HashSet;
import java.util.Iterator;

public class HashSetTest { 

	public static void main(String[] args) {
		HashSet<String> foodSet = new HashSet<>();
		
		foodSet.add("치킨");
		foodSet.add("떡볶이");
		foodSet.add("족발");
		foodSet.add("막국수");
		foodSet.add("계란");
		foodSet.add("포켓몬빵");
		foodSet.add("포켓몬빵");
		foodSet.add("포켓몬빵");
		
		System.out.println(foodSet);  // 중복은 들어가지 않는다.
		System.out.println(foodSet.contains("치킨"));
		
	}
}

 

결과

 

 

 

2. Iterator

import java.util.HashSet;
import java.util.Iterator;

public class HashSetTest {

	public static void main(String[] args) {
		HashSet<String> foodSet = new HashSet<>();
		
		foodSet.add("치킨");
		foodSet.add("떡볶이");
		foodSet.add("족발");
		foodSet.add("막국수");
		foodSet.add("계란"); 
		foodSet.add("포켓몬빵");
		foodSet.add("포켓몬빵");
		foodSet.add("포켓몬빵");
		
		// foodSet이 Set 타입이 아닌 Iterator 타입으로 바뀐다.
		Iterator<String> iter = foodSet.iterator();  // iterator 방식의 순서가 부여된다.
		
		while(iter.hasNext()) {  // hasNext()로 다음 값이 있는지 확인하고
			System.out.println(iter.next());  // next()로 값을 가져온다.
		}
		
	}
}

 

결과

 

 

 

 

실습(HashSet)

※ 참고

// hashCode()를 사용하는 자료구조에서 정확한 결과를 내기 위해서는
// equals()뿐만 아니라 hashCode()도 재정의 해야 한다.

// 아래 문제에서 equals()와 hashCode()를 재정의하지 않을 경우,
// 중복된 값이라도 저장된다.
// ※ Set은 중복값이 저장되지 않으므로 재정의가 필요하다.

 

 

 

1. Student.java 생성

- 필요한 변수 선언

int num;
String name;

 

 

- 생성자 생성

public Student() {;}

public Student(int num, String name) {
	super();
	this.num = num; 
	this.name = name;
}

- equals() 재정의

@Override
public boolean equals(Object obj) {

	if(this == obj) {  // 주소 비교
		return true;
	}

	// obj에는 num이 없으므로 num이 있는 Student 타입으로 down casting 해준다.
	if(obj instanceof Student) {
		Student std = (Student)obj;

		if(this.num == std.num) { 
			return true;
		}

	}

	return false;
}

 

 

- hashCode() 재정의

@Override
public int hashCode() {
	return num; 
}

 

 

 

2. School.java에서 실행

import java.util.HashSet;

public class School {
	public static void main(String[] args) {

		Student han = new Student(1, "한동석");
		System.out.println(han.equals(new Student(1, "한동석")));
		
		HashSet<Student> attendance = new HashSet<>();
		attendance.add(han);
		attendance.add(new Student(1, "한동석"));
      
		System.out.println(attendance.size());
		System.out.println(attendance);
       
	}
}

 

결과
 
 

'웹 개발 > Java' 카테고리의 다른 글

[Web_JAVA] 33  (0) 2022.03.19
[Web_JAVA] 32  (0) 2022.03.18
[Web_JAVA] 30  (0) 2022.03.16
[Web_JAVA] 29  (0) 2022.03.15
[Web_JAVA] 28  (0) 2022.03.14