Set interface를 이용한 6개 숫자 출력 프로그램
1. 설명 및 목표
- Set자료구조를 사용해 중복이 나오지 않게 한다
- 추출된 6개의 숫자를 오름차순으로 정렬한다
2. 이론
Collection Framework, 일반적으로 자료구조라고 말하는 이것은 여러가지 자료형의 객체 값을 모두 저장해 관리할 수 있다는 특징을 가진 java.util 패키지의 Set, List, Vector, Map, Queue, Stack 등의 인터페이스와 클래스를 묶어 부르는 것으로, 객체를 효율적으로 추가,삭제,검색할 수 있기 때문에 어떻게 보면 배열에서 한층 더 확장된 개념이라고 할 수 있다. 예를 들어, 배열은 정적인 자료구조이기에 처음 생성할 때 저장할 수 있는 자료형과 크기를 지정해야 하지만 이 자료구조는 동적이기에 따로 자료형이나 크기를 지정해줄 필요가 없다. 또한 인터페이스를 통해 다양한 컬렉션 클래스를 이용할 수 있다는 것도 큰 장점이 된다.
컬렉션 중 Set 인터페이스의 특징은 다음과 같다. 먼저, 입력받은 값이 순서대로 저장되지 않고 무작위로 저장되어 출력된다. 또한 중복 값이 저장되지 않으며 null 또한 예외 없이 하나만 저장이 가능하다. 이 인터페이스의 구현클래스로는 HashSet, TreeSet 등이 있다. HashSet은 무작위로 저장되어 출력되는 Set의 특징을 그대로 가져오는 클래스이고, TreeSet은 입력받은 값을 오름차순으로 저장해 출력하기 때문에 검색이나 정렬할 때 유용하게 사용할 수 있다.
3. 세부 내용
class random {
Random num = new Random();
Set list = new TreeSet();
public void lotto() {
while (list.size() < 6) { // 수 6개 입력받을 때까지
list.add(num.nextInt(45) + 1); // 범위 1~45
}
}
random 클래스에서 숫자 추출 메소드와 출력 메소드를 둘 다 구현할 예정이기 때문에 Random 클래스 객체와 Set 객체를 필드로 선언했다. Set의 경우 인터페이스이기 때문에 원래는 자체적으로 객체를 생성할 수 없지만, 구현클래스인 TreeSet이 인터페이스를 상속하고 있기 때문에 업캐스팅해 객체를 생성해줄 수 있다. 이 경우 참조 범위가 줄어든다는 특징이 있기도 하고 TreeSet 객체를 생성해도 결과에 문제는 없지만 Set Interface를 사용하라는 조건이 붙었기 때문에 업캐스팅해주었다.
그리고 Random 클래스의 nextInt() 메소드를 이용해 1~45 범위의 난수를 발생시켜 그 값을 add를 통해 리스트에 입력시킨다. 단, 중복값이 나오는 경우 입력되지 않으므로 size()를 이용해 list의 크기가 6이 될 때까지 수를 입력받을 수 있도록 했다.
public void print() {
Iterator lt = list.iterator();
while (lt.hasNext()) { // 출력
System.out.print(lt.next() + " ");
}
System.out.println();
}
Set의 iterator() 메소드를 인터페이스 Iterator 클래스의 객체로 할당시킨다. 그리고 Iterator의 메소드 hasNext()를 이용해 list에 다음 값이 존재하는 동안 true가 리턴되어 반복문이 동작하도록 설정해 값을 출력시킨다.
4. 실행 결과
여러 번 실행해 값을 출력해보았고 중복 없이 6개의 숫자가 출력되는 것을 확인하였다.
5. 고찰
오늘은 레퍼런스 형변환과 자료구조를 배웠고 둘 모두를 복습해볼 수 있는 과제를 할 수 있어 기뻤다. 난수를 추출하는 코드는 Math 클래스의 random() 메소드도 있지만 이전에 사용해본 적이 있으니 가물가물한 Random 클래스를 사용해보기로 했다. 최대한 구글 검색 대신 API를 활용해보려고 노력했는데 아무래도 영어 설명을 직관적으로 이해하긴 힘들어서 구글의 도움도 조금 받아야 했다. 사실 업캐스팅의 경우 자동 형변환이기 때문에 이해하고 응용하는 것도 어렵지 않았는데 다운캐스팅이 아직 완벽하게 이해되지 않아서 관련된 문제가 있을까 확인해보려고 한다. 그리고 Iterator의 경우, Iterator의 클래스로 객체를 선언하고 그 객체에 Set 객체로 입력받은 list의 iterator() 메소드를 할당하고 그 Iterator의 객체를 이용해 Iterator의 hasNext() 메소드를 사용하는 과정이 조금 복잡해 이 부분도 연습이 필요하다고 느꼈다. 원하는 코드를 바로바로 뽑아 쓸 수 있어야 하는데 그런 부분의 훈련이 많이 되어있지 않다고 느꼈고 점점 배우는게 많아지는 만큼 복습을 철저히 해야겠다고 느꼈다.
6. 전체 코드
'개인 > 풀이' 카테고리의 다른 글
220111 과제+++ (0) | 2022.01.12 |
---|---|
220107 과제 (0) | 2022.01.07 |
220106 과제 (0) | 2022.01.06 |
220104 과제 (0) | 2022.01.04 |
220103 과제 보강 (0) | 2022.01.03 |