상세 컨텐츠

본문 제목

[TIL#10-1 내배캠 Chapter 2 프로그래밍 기초] 숙제2

내배캠/작업물

by DK9 2023. 10. 18. 12:51

본문

다시 돌아온 숙제 타임.

 

구현할 기능은 이러하다.

  • 입력값
    • 저장할 자료구조명을 입력합니다. (List / Set / Map)
    • 내가 좋아하는 요리 제목을 먼저 입력합니다.
    • 이어서 내가 좋아하는 요리 레시피를 한 문장씩 입력합니다.
    • 입력을 마쳤으면 마지막에 “끝” 문자를 입력합니다.
  • 출력값
    • 입력이 종료되면 저장한 자료구조 이름과 요리 제목을 괄호로 감싸서 먼저 출력해 줍니다.
    • 이어서, 입력한 모든 문장 앞에 번호를 붙여서 입력 순서에 맞게 모두 출력해 줍니다.

그래서 코드를 짜보았다.

1. 일단 저번 숙제 심화 학습을 하면서 배운 키입력 메서드를 만들어서 밖으로 뺏다. 이게 편해서 코딩 스타일로 잡힐 것 같다.

 

2. 여기서 오류를 만났다. 이 부분을 작성하면서 생각해 보니 switch의 형식에 맞지 않아서 생긴 오류 같다. switch는 무조건 case에 실행할 연산을 작성해야 한다는 것을 순간 잊었다.

 

3. i++;이 왜 작동 안 하지? 이유가 뭘까? 그렇다 나는 바보였다. 반복문 안에 int i = 0; 을 계속 돌리고 있다, 그러니 i++;이 작동하지 않지. 대단하다...

 

4. 저렇게 코드를 짜는 게 아닌 것 같다. 숙제의 요구사항인 입력 종료 후 한 번에 출력되는 것이 아닐뿐더러 새로이 배운 것을 전혀 응용하지 않았다. 저렇게 푸는 것은 출제자의 의도가 아닌 것 같다. 그래서 고민을 했다. List, Set, Map을 보니 컬렉션을 쓰라는 것 같다. 고민을 해봐야겠다.

 

5. 고민을 해보고 일단 List부터 해보기로 했다. ArrayList인 howList를 만들고 반복문(while)으로 Kinput으로 요리법을 입력하고 구분한 채로 놔둔다(?). 만약 "끝" 을 입력하면 반복문을 종료하고, 반복문을 빠져나가 놔뒀던 요리법들을 howList에 '순서 있는 배열'로 추가한다. 여기까지 만드는데 1시간이 넘어간 것 같다. if 부분은 Linput.equals로 해도 될 것 같은데 새로 배운 Objects.equals를 사용해 봤다.

 

6. 위의 코드에 이어서 요리 방법을 모두 입력하고 나면, 제목을 입력한다(이것도 컬렉션을 만들어서 코딩하면 결과물이 깔끔할 것 같다). 출력 요구 사항을 작성하고 위에서 작성한 List howList를 순서대로 불러와서 출력한다. 컬렉션의 길이만큼을 지칭하는 단어는 size이다. length 아니다. 이걸로 또 조금 시간을 낭비했다.

 

7. List 때와 동일하게 짰다. 조금 걱정인 게 Set은 순서 없는 데이터의 집합이라고 했는데 과연 순서대로 요리법이 잘 나올까 하는 의문점이 들었다. 일단 돌려보자.

 

8. List 때와 동일하게 짰지만 오류가 발생했다. Set을 출력하기 위해 값을 가져와야 하는데 get이 아니다. 배웠던 contain은 T/F를 출력한다. 머리를 굴려보자. 찾아보니 이건 배우지 않은 부분인 것 같다. 구글링을 해보자. 3 가지를 찾았다.

 

자바 Set 사용법부터 출력까지

일단 자바의 Set을 알아보기에 앞서서 List를 알아두면 참 좋은데 List에 대해서는 아래 글을 참고해주면 된다 자바 List 정의부터 출력까지 List는 자바의 자료형 중 하나로 배열과 비슷하지만 결정

wakestand.tistory.com

 1) Set 내용 출력할 수 있게 Iterator 안에 담기   :    Iterator<데이터타입> iterator명 = set명.Iterator();

 2) Iterator 안에 담은 set 출력하기    :     Iterator명.next();  or  while(iterator명.hasNext()) {iterator명.next(); // 값없을 때까지 계속 출력} 주로 사용되는 Set은 HashSet 말고도 LinkedHashSet, TreeSet이 있는데 특징은 다음과 같다.

 3) LinkedSet  :   다른 Set들과 동일하게 중복은 허용하지 않으나 .add() 한 순서대로 값이 저장된다

 이 분을 앞으로 존경하기로 했다. 사랑한다. 무튼 적용해 보자.

 

9. 찾아온 3)을 사용하여 Set의 값에 순서를 부여했다.

10. 찾아온 1)을 이용해 howSet을 Iterator에 담았다. 그리고 2)의 Iterator이름.next로 출력했다. 여기서 for문 조건식에도 Iterator.size를 하려 했는데 오류가 발생헀다. 그래서 길이는 set으로도 충분히 설명할 수 있겠다 싶어서 howSet으로 잡아주었다. List에 이어 Set도 잘 작동한다.

 

11. 맵을 작성 하면서 맵도 순서가 없을 것 같은데?라는 생각이 스쳐 지나갔지만 곧바로 키값을 정렬하면 되겠구나 하는 생각이 들었다. 그래서 키 값을 정렬하고 반복문 돌릴 때의 증감식처럼 만들어서 컬렉션을 완성하도록 했다. 과정에서 int MapKey = 0; howMap.put~~~ 바로 위에 작성했었는데 참 바보 같았다.

 

 완성한 후에 존경하고 사랑하는 분의 블로그에서 찾아보니 TreeMap은 key값에 따라 오름차순으로 정렬한다는 것과 LinkedHashMap이 삽입 순서에 따라 정렬시키는 방식으로 순서를 부여한다는 것을 알 수 있었다.

 

12. 출력 부분은 간단했다. Map의 길이를 알 수 있는 size와 호출하는 get을 사용하여 1씩 증가하면서 저장되도록 한 Key를 불러와서 순서대로 출력을 했다.

 

총평 : 총 걸린 시간은 10시간쯤 되는 것 같다. 모르는 것들이 있어서 답답했고, 여전히 처음 숙제를 보고 아무 생각이 안 드는 것이 좀 짜증 났다. 텍스트로 본 것을 코드로 구현, 상상하는 부분이 좀 막연해서 어려웠다. 이제 제출하고 답지보고 설명 듣고 숙제를 가지고 또 심화 학습을 해봐야겠다.

끝.

 

 

 

관련글 더보기