java.util.AbstractSet 클래스는 자바 컬렉션 프레임워크(Collection Framework)의 일부로, Set 인터페이스를 구현하는 추상 클래스입니다. AbstractSet 클래스는 Set 인터페이스를 구현하기 위한 기본적인 메소드들을 제공하며, 이를 상속받는 클래스들은 이러한 메소드들을 오버라이딩하여 자신만의 독특한 동작을 추가할 수 있습니다.
AbstractSet 클래스는 Set 인터페이스에서 정의된 메소드 중 일부를 구현합니다. 예를 들어, add() 메소드, remove() 메소드, iterator() 메소드, size() 메소드 등이 있습니다. AbstractSet 클래스를 상속받아 새로운 Set 클래스를 만들 때는, 이러한 메소드들을 오버라이딩하여 새로운 클래스의 동작을 구현합니다.
AbstractSet 클래스의 주요 특징은 다음과 같습니다.
1. 추상 클래스이며, 직접 인스턴스화할 수 없습니다.
2. Set 인터페이스의 구현체로서, 중복된 원소를 허용하지 않으며, 순서가 보장되지 않습니다.
3. add() 메소드, remove() 메소드, iterator() 메소드, size() 메소드 등의 기본적인 Set 메소드들을 구현합니다.
4. AbstractCollection 클래스를 상속받으며, Collection 인터페이스의 다른 메소드들을 구현합니다.
5. HashSet, TreeSet 등의 구체적인 Set 클래스들은 AbstractSet 클래스를 상속받아 만들어집니다.
AbstractSet 클래스를 상속받아 새로운 Set 클래스를 만들 때는, add() 메소드, remove() 메소드 등을 오버라이딩하여 자신만의 독특한 동작을 추가할 수 있습니다. 또한, AbstractSet 클래스의 iterator() 메소드를 오버라이딩하여 새로운 Iterator 클래스를 만들어서, 새로운 Set 클래스에서 사용할 수도 있습니다.
예를 들어, 아래는 AbstractSet 클래스를 상속받아 새로운 Set 클래스를 만드는 예시 코드입니다.
import java.util.*;
public class MySet<E> extends AbstractSet<E> {
private ArrayList<E> items;
public MySet() {
items = new ArrayList<E>();
}
public boolean add(E item) {
if (items.contains(item)) {
return false;
} else {
items.add(item);
return true;
}
}
public Iterator<E> iterator() {
return new MySetIterator();
}
public int size() {
return items.size();
}
private class MySetIterator implements Iterator<E> {
private int index = 0;
public boolean hasNext() {
return index < items.size();
}
public E next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
E item = items.get(index);
index++;
return item;
}
}
indexAbstractSet 클래스는 Set 인터페이스의 구현체로서, Set 인터페이스에서 정의된 메소드들을 구현하는 추상 클래스입니다. 따라서, AbstractSet 클래스를 상속받아 새로운 Set 클래스를 만들 때는, Set 인터페이스에서 정의된 메소드들을 반드시 구현해야 합니다. 이를 통해, 새로운 Set 클래스는 Set 인터페이스의 기본 동작을 지원하며, 자신만의 독특한 동작을 추가할 수 있게 됩니다.
AbstractSet 클래스는 다른 컬렉션 클래스와 마찬가지로, Iterator 인터페이스를 구현합니다. 이를 통해, Set 클래스의 요소를 순회할 수 있는 Iterator 객체를 생성할 수 있습니다. 예를 들어, Set 클래스의 요소를 출력하는 코드는 다음과 같이 작성할 수 있습니다.
Set<String> set = new HashSet<String>();
set.add("Java");
set.add("Python");
set.add("C++");
Iterator<String> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
위 코드에서는, HashSet 클래스를 사용하여 Set 객체를 생성한 후, Iterator 객체를 생성하여 Set 객체의 요소를 출력합니다. 이때, AbstractSet 클래스는 iterator() 메소드를 구현하여, Iterator 객체를 생성하는 기본 동작을 제공합니다. 따라서, 새로운 Set 클래스에서는 iterator() 메소드를 오버라이딩하여 자신만의 Iterator 클래스를 생성할 수 있습니다.
또한, AbstractSet 클래스는 Collection 인터페이스의 메소드들도 구현합니다. Collection 인터페이스는 List, Set, Queue 인터페이스의 부모 인터페이스이며, 컬렉션 객체들이 공통으로 가지는 메소드들을 정의합니다. 따라서, AbstractSet 클래스를 상속받은 새로운 Set 클래스는 Collection 인터페이스의 메소드들도 사용할 수 있습니다.
AbstractSet 클래스를 상속받아 새로운 Set 클래스를 만들 때는, 다음과 같은 메소드들을 오버라이딩하여 자신만의 독특한 동작을 추가할 수 있습니다.
1. add(Object obj) : Set에 새로운 요소를 추가합니다.
2. remove(Object obj) : Set에서 지정된 요소를 제거합니다.
3. contains(Object obj) : Set에 지정된 요소가 포함되어 있는지 여부를 확인합니다.
4. size() : Set에 저장된 요소의 개수를 반환합니다.
5. iterator() : Set의 요소를 순회할 수 있는 Iterator 객체를 반환합니다.
따라서, AbstractSet 클래스를 상속받아 새로운 Set 클래스를 만들 때는, 이러한 메소드들을 오버라이딩하여 자신만의 독특한 동작을 추가할 수 있습니다.아래는 AbstractSet 클래스를 상속받아 새로운 Set 클래스를 만들고, 이를 사용하는 예제 코드입니다. 이 예제에서는 HashSet 클래스를 상속받아 새로운 Set 클래스를 만들고, add() 메소드를 오버라이딩하여 새로운 요소를 추가할 때마다 로그를 출력하는 동작을 추가했습니다.
import java.util.*;
public class LoggingHashSet<E> extends HashSet<E> {
@Override
public boolean add(E e) {
System.out.println("Adding element " + e);
return super.add(e);
}
public static void main(String[] args) {
Set<String> set = new LoggingHashSet<String>();
set.add("Java");
set.add("Python");
set.add("C++");
Iterator<String> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
위 코드에서는, LoggingHashSet 클래스를 생성하여 add() 메소드를 오버라이딩하여 로그를 출력하도록 구현하였습니다. 이후 main() 함수에서는 LoggingHashSet 클래스를 사용하여 Set 객체를 생성하고, 요소를 추가한 후, Iterator 객체를 생성하여 Set 객체의 요소를 출력합니다. 실행 결과는 다음과 같습니다.
Adding element Java
Adding element Python
Adding element C++
Java
Python
C++
위 예제 코드에서는 HashSet 클래스를 상속받았지만, AbstractSet 클래스를 상속받아도 동일한 방식으로 새로운 Set 클래스를 만들 수 있습니다. 예를 들어, add() 메소드를 오버라이딩하여 요소를 추가할 때마다 요소의 길이를 출력하는 동작을 추가한 예제 코드는 다음과 같습니다.
import java.util.*;
public class LengthHashSet<E> extends AbstractSet<E> {
private HashSet<E> set = new HashSet<E>();
@Override
public boolean add(E e) {
System.out.println("Adding element " + e + " with length " + e.toString().length());
return set.add(e);
}
@Override
public Iterator<E> iterator() {
return set.iterator();
}
@Override
public int size() {
return set.size();
}
public static void main(String[] args) {
Set<String> set = new LengthHashSet<String>();
set.add("Java");
set.add("Python");
set.add("C++");
Iterator<String> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
위 코드에서는 LengthHashSet 클래스를 생성하여 add() 메소드를 오버라이딩하여 요소를 추가할 때마다 요소의 길이를 출력하도록 구현하였습니다. 이후 main() 함수에서는 LengthHashSet 클래스를 사용하여 Set 객체를 생성하고, 요소를 추가한 후, Iterator 객체를 생성하여 Set 객체의 요소를 출력합니다. 실행 결과는 다음과 같습니다.
Adding element Java with length 4
Adding element Python with length 6
Adding element C++ with length 3
Java
Python
C++
'PT선생님의 코딩 강좌' 카테고리의 다른 글
[PT선생님][55]javax.swing.table.AbstractTableModel 알아보기 (0) | 2023.03.05 |
---|---|
[PT선생님][54]javax.swing.AbstractSpinnerModel 알아보기 (0) | 2023.03.04 |
[PT선생님][52]java.util.AbstractSequentialList 알아보기 (0) | 2023.03.04 |
[PT선생님][51]java.nio.channels.spi.AbstractSelector 알아보기 (0) | 2023.03.03 |
[PT선생님][50]java.nio.channels.spi.AbstractSelectionKey 알아보기 (0) | 2023.03.03 |