나만의 레시피북을 List, Set, Map 형식으로 만드는 방법에 대해서 코드를 짜보려고 한다.
우선 공통적으로 사용하는 Scanner부분의 코드를 짜보겠다.
우리에게 필요한 건
1. 어떤 컬렉션타입을 사용할 건지
2. 요리 제목
3. 레시피
4. 끝날때 사용할 단어 = "끝"
이렇게 3가지가 되겠다.
Scanner sc = new Scanner(System.in);
System.out.println("어떤 타입으로 입력하시겠어요? List / Set / Map");
String type = sc.nextLine();
String title = sc.nextLine();
while (true) {
String text = sc.nextLine();
if (text == "끝") {
break;
}
}
여기에서 각 컬렉션별로 while문 쪽을 변경하면 될 것 같다!
List는 일단 선언과 생성을 한 뒤에 순차적으로 값을 더해주면 될 것 같다.
ArrayList<String> strList = new ArrayList<>(); //선언생성
while (true) {
String text = sc.nextLine();
if (text.equals("끝")) {
break;
}
strList.add(text); //리스트에 추가
}
System.out.println("["+type+"으로 만든 " + title + " 레시피]");
for(int i=0; i<strList.size();i++){
System.out.println((i+1) + ". " + strList.get(i)); //리스트값 가져오기
}
Map도 비슷하게 List처럼 등록하지만 Map은 순서가 없으므로 key에는 인덱스 값을 주고 value에 레시피를 적으면 될 것 같다.
Map<Integer, String> strMap = new HashMap<>();
int index = 0; //index를 0부터
while (true) {
String text = sc.nextLine();
if (text.equals("끝")) {
break;
}
strMap.put(index,text);
index ++; //반복하는 만큼 index++
}
System.out.println("[" + type + "으로 만든 " + title + " 레시피]");
for (int i = 0; i < strMap.size(); i++) {
System.out.println((i + 1) + ". " + strMap.get(i));
//get은 key로 하는데 index를 0부터했으므로 i값과 같을 것임.
}
Set중에서 순서보장할때 사용하는 LinkedHashSet을 사용해야할 것이다.
그리고 강의 중에선 향상된 for문을 사용해서 출력하는 방법으로만 진행해왔어서 LinkedHashSet을 순회하며 출력하는 방법을 찾아보았다.
바로 Iterator를 사용하는 것이다.
여기서 잠깐!
Iterator에 대하여 살펴보자.
자바의 컬렉션(Collection)에 저장되어 있는 요소들을 순회하는 인터페이스이다.
정의방법 : Iterator<참조형> iterator = Collection.iterator();
메서드
1. hasNext() = 다음 요소가 있는지 boolean형태로 나타내줌.
2. next() = 다음 요소를 가져옴.
3. remove() = 가져온 요소를 삭제
이 방법을 통해서 Set방식으로 레시피 작성하는 코드를 짜보겠다.
Set<String> strSet = new LinkedHashSet<>();
while (true) {
String text = sc.nextLine();
if (text.equals("끝")) {
break;
}
strSet.add(text);
}
Iterator<String> iterator = strSet.iterator();
System.out.println("[" + type + "으로 만든 " + title + " 레시피]");
for (int i = 0; i < strSet.size(); i++) {
System.out.println((i + 1) + ". " + iterator.next());
}
이렇게 각각의 컬렉션 별로 만들었으며, 처음에 입력받은 type값을 통해 if문 혹은 switch문으로 해당 코드로 이동하여 작동하도록 하여 완성했다.
강의에서 들은 List와 Map은 생각하여 해냈는데 Set은 순서대로 하나씩 가져오는 방법을 고민하다 결국 구글링을 해서 찾아냈다.
Iterator 꼭 기억해서 나중에 비슷한 문제가 나올 때 사용해보아야겠다.

이전 팀원한테 같은 부분에 대하여 질문이 왔다.. 나는 편협하게도 Iterator에 대하여 알려드렸고 이거 사용하시면 편해요~ 라고 했는데 강의에서는 향상된 for문으로만 알려주셨기 때문에 그 방법으로 성공하셨다며 말씀해주셨다.
나는 순서대로 하나씩, 그리고 앞에 index를 붙여야하는데 향상된 for문은 index를 조건부에 써놓지않는데 어떻게 출력하지? 라고 생각했다가 아! for문 안에 index++을 하면되겠구나~ 라고 생각하며 향상된 for문으로도 충분히 구현가능하다는 것을 알게 되었다.
(튜터님 죄송합니다 의심했어요)
Iterator<String> iterator = strSet.iterator();
System.out.println("[" + type + "으로 만든 " + title + " 레시피]");
for (int i = 0; i < strSet.size(); i++) {
System.out.println((i + 1) + ". " + iterator.next());
}
// --> 바꾼 코드
int index = 1;
System.out.println("[" + type+ "으로 저장된 " + title + "]");
for(String receipe:stringSet){
System.out.println(index + ". " + receipe);
i++;
}