Java

[Java]Collection - Set계열(HashSet)

MoZZANG 2022. 3. 16. 21:52
Collection이란? : 

: 메모리 기반의 객체 저장소이다.

 

 

Collection의 특성
  • 컬렉션은 heap영역에 생성된 여러 객체들의 주소값을 컬렉션 메모리에 담는다.
  • 컬렉션은 인스턴스화된 객체를 저장하는 자료구조이다.
  • 컬렉션은 객체의 주소값을 저장해 해당 객체를 저장, 삭제, 검색, 수정 등이 가능하다.
  • 컬렉션은 곧 인터페이스이다. 따라서 컬렉션을 상속받은 클래스를 컬렉션 클래스라고 한다

 

Collection의 주요 메소드
int size() collection에 저장된 객체의 갯수 리턴
boolean isEmpty() collection 객체가 비어있으면 true, 아니면 false반환
boolean add(Object obj) 객체 추가. 성공시 true반환
boolean remove(Object obj) 객체 삭제, 성공시 true반환
boolean removeAll(Collection col) 저장된 객체 전체 삭제
boolean contains(Object obj) 해당 객체가 collection안에 있으면 true
Iterator iterator() Iterator인터페이스 반환

 

 

또한 컬렉션 클래스들은 다음과 같은 타입 특징이 있다.

 

 

 

 

이번 포스팅에서는 set계열 컬렉션을 살펴보자.

 

Set계열은 데이터 저장시 중복을 허용하지 않고 순번없이 입력 및 출력된다는 특징이 있다.

 

 

 

 

 

1. 타입 파라미터(<T> 또는 <E>)에 타입을 지정 안한경우
1-1) 컬렉션 생성

타입 파라미터를 지정하지 않았다. 이 경우에는 모든 타입을 다 담을 수 있다. 즉 타입파라미터로 Object가 지정된 경우와 동일한 것이다.

 

 

1-2) 컬렉션에 저장할 객체생성

타입을 지정하지 않았기 때문에 모든 타입을 저장할 수 있다. 이런 Raw type에서는 특정 타입의 데이터만을 담아서 보관하려고 할 때 타입안정성(Type Safety)가 떨어진다. 실수로 원하는 타입이 아닌 객체를 담아도 에러가 나지 않기 때문이다.

 

 

 

 

1-3)컬렉션에 객체 저장 = boolean add(Object)

▲ 컬렉션에 객체를 담을 때는 add메소드를 사용하자. 반환타입은 boolean이다.

 

 

 

 

1-4) 컬렉션에 저장된 객체수 얻기:int size()

결과는 4가 출력된다.

▲ 담은 객체의 갯수를 알고싶을 때는 size()메소드를 사용하자. 담겨있는 객체의 갯수를 int타입으로 반환한다.

 

 

 

 

1-5) 중복저장[x]-에러는 안나지만 저장이 안됨(즉 add()메소드가 false반환)

▲set계열은 중복저장이 안된다. 이미 있는 객체를 다시 담으려고 하면 저장이안되며 false를 반환한다.

   저장이 되지 않았기 때문에 이전과 동일한 객체수를 가지고 있다.

 

 

 

 

1-6) 저장된 객체 꺼내오기

▲ 컬렉션에 저장된 객체를 가져올 때는 크게 Iterator(반복기)를 사용하는 법과 확장for를 사용하는 방법이 있다.

   우선 Iterator를 사용해서 저장된 객체를 다시 꺼내와보자.

 

 

hasNext()라는 메소드는 컬렉션에서 꺼내올 객체가 존재하는지를 체크해주는 메소드이다. 만약 꺼내올 객체가 있다면 true를, 없다는 false를 반환해준다. 꺼내올 객체의 유무를 먼저 확인 후 꺼내도록 설계해야한다.

 

next()메소드는 한번 실행될 때마다 하나의 객체를 꺼내오는 메소드이다

 

while문을 통해 꺼내올 객체가 있다면 next()메소드를 통해 하나씩 꺼내와 해당 데이터타입과 동일한 타입을 체크해 해당 출력문을 출력해게 설계하였다.

 

여기서 중요한 점이 있다.

▲ 우리가 담은 객체의 갯수는 총 4개인데 4개의 객체를 모두 꺼낸뒤에 다시 next()메소드를 하용하면 꺼내올 객체가 없기 때문에 java.util.NoSuchElementException 에러가 발생한다는 점이다.

 

출력결과는 위와 같다. set계열은 순서없이 랜덤으로 출력하기 때문에 우리가 저장한 순서대로 출력되지 않는다.

 

 

 

 

 

이번에는 확장 for문을 사용하여 저장된 객체를 꺼내와보자.

확장 for문의 형식 : for(자료형 객체를담을변수 : 배열명이나 혹은 컬렉션명)

확장for문의 형식에 맞게 입력하자. 콜론을 기준으로 우측에는 객체가 저장되어있는 컬렉션명이나 또는 배열명을, 우측에는 저장되어있는 객체를 하나씩 꺼내서 담을 변수를 넣어주면 된다.

 

일반 for문에서처럼 반복조건을 정해주지 않아도 해당 컬렉션안에 저장되어있는 객체의 갯수만큼 반복된다.

 

▲출력결과는 역시 순번없이 랜덤으로 추출되기 때문에 우리가 넣어준 순서와 상관없이 출력된다.

 

 

 

 

1-7) 검색 : boolean contains(Object e)

▲ 저장된 객체에 찾는 객체가 있는지를 검색하는 메소드이다. 있다면 true를 없다면 false를 반환한다.

 

 

 

 

1-8) 삭제 : boolean remove(Object e)

▲ 저장된 객체를 삭제하는 메소드이다. 삭제를 성공했다면 true, 삭제를 하지 못했다면 false를 반환한다.

 

 

 

 

1-9) 전체 삭제 : boolean removeAll(Collection c)

▲ 저장된 모든 객체를 한번에 삭제를 원할 경우 removeAll()메소드 또는 clear()메소드를 사용하면 된다.

 

 

 

 

 

 

 

이번에는 타입파라미터를 사용해서 컬렉션을 사용해보자.

2. 타입 파라미터(<T> 또는 <E>)에 타입을 지정 한경우

▲ 이번에는 앞선포스팅에서 써봤던 Student클래스를 사용해서 해보았다. 타입 파라미터에 Student를 넣어서 우리는 앞으로 set2 메모리에 Student타입의 객체만 담을 것이라고 선언한 것이다. 따라서 다른 타입을 담으려고 하면 에러가 날 것이다.

 

 

 

2-1) 컬렉션에 저장할 객체 생성 & 2-2) 객체 저장

▲ Student 타입의 객체들만 생성하고

▲ Student타입 객체들만 저장했다. 마지막줄에서 String타입의 객체를 저장하려고 하면 컴파일시 에러가 발생한다.

 

 

 

 2-2) 객체 꺼내오기

▲ 확장 for문을 이용하여 객체를 꺼내와서 오버라이딩된 print()메소드로 출력한다.

 

 

 

 

2-3) 검색

 

▲ contains()메소드를 이용하여 해당값이 있으면 true 없으면 false로 반환한다.

 

 

 

2-4)삭제

▲ 마지막으로 원하는 하나의 데이터만 삭제를 원할 때는 remove()메소드를 사용하면 되고, 모든 데이터를 한번에 삭제하고 싶을 때는 removeAll() 또는 clear()메소드를 이용하면 된다.