[TIL] 19일차 _ 키오스크 프로젝트 #7 & 계산기 프로젝트 #6

Seoyeon Lee·2025년 10월 30일

Today I Learned ...

오늘은 코드카타 SQL 21~23번 문제와 알고리즘 18~20번 문제를 풀고, 키오스크 프로젝트를 마무리지었다.
그리고 드디어!! 계산기 프로젝트의 트러블 슈팅을 시작했다..


🗒️ 코드카타 #12

오늘은 총 3개의 SQL 문제를 풀었는데, 오늘 푼 문제 중 if를 활용하는 문제가 있었다.
SQL의 if문은 자바의 삼항연산자처럼 if(조건, 참일 때, 거짓일 때)로 작성한다.
SQL에서 if문을 처음 써봐서 형식에 대해 찾아보느라 시간이 조금 걸렸지만... 이외에는 쉽게 해결할 수 있었다.

오늘 알고리즘 문제도 총 3개를 풀었는데, 알고리즘 문제는 참.. 쉽지가 않다.
과제로 나오는 계산기, 키오스크 프로젝트보다 알고리즘 문제가 더 어려운 느낌이다...

첫 번째 문제는 문자열을 정수로 바꾸는 것인데, 이건 Integer.parseInt()를 활용해 쉽게 풀 수 있었다.
이때 Integer.valueOf()를 사용할 수도 있는데,
parseInt()는 원시타입인 int형을 반환하고, valueOf()는 Integer로 감싸서 반환해준다.
이 문제에서는 반환되는 자료형이 크게 상관이 없었는데, 필요에 따라서 사용하면 된다.

두 번째 문제는 정수의 제곱근을 판별하는 것이었는데,
여기에서 처음으로 자바의 Math 클래스를 사용해보았다.
Math 클래스에는 제곱근을 찾고, 거듭제곱을 계산하는 것은 물론이고, 절댓값을 반환해주기도 하고, 심지어는 랜덤으로 값을 만들어주기도 한다.
Math 클래스를 활용하니 이 문제는 큰 어려움 없이 해결할 수 있었다.

마지막으로 세 번째 문제는 정수를 내림차순으로 정렬해 하나의 숫자로 만들어 반환하는 것이었다.
이건 스트림을 사용하면 되겠다 싶어서 스트림으로 해보기를 시도하였으나... 정말 스트림은 너무 너무 너무 어렵다.
이전에 숫자를 문자로 바꿔서 배열로 저장하는 것은 해본 적이 있다.
그래서 문자 배열을 sort를 사용해 정렬하면 되겠다고 생각했지만... 생각만큼 쉽게 풀리지는 않았다.
아직 어디에서 배열을 사용하고, 어디에서 리스트를 사용해야하는지에 대한 정리가 제대로 되지 않아서 그런 것 같다.
어찌저찌 역순으로 정렬을 하고, 다시 하나의 숫자로 만들어 반환을 하려는데, 나는 for문밖에 생각해내지 못했다.
그런데 다른 사람들의 풀이를 보니 StringBuilder라는 것을 활용하더라.
다른 문제에서도 이걸 통해 쉽게 문제를 푸는 사람들이 많던데... 이걸 좀 더 찾아봐야겠다.

각각의 문제와 풀이는 깃허브를 통해 업로드해두었다.
GitHub 보러가기


🖥️ 키오스크 프로젝트 #7

오늘은 드디어 키오스크 프로젝트의 마지막 날이다.

어제 menuItem이 3번까지만 출력된다는 문제와 스캐너가 제대로 작동되지 않는다는 문제를 해결하지 못하고 마무리를 지었었다.

첫 번째로 menuItem이 끝까지 출력되지 않는 이유는 스트림에서 range()를 잘못 사용했기 때문이다.
range(A, B)는 A에서 시작하고, B를 포함하지 않고 끝내는데, 이 사실을 몰랐던 것이다!!!
그래서 B까지 포함시켜주는 rangeClosed()를 사용하며 쉽게 해결할 수 있었다.
왜 작동이 안되는건지 열심히 디버깅도 해보고, 비쥬얼라이져도 돌려봤지만... 다음부턴 구글링을 해봐야겠다.

두 번째로 스캐너가 제대로 작동되지 않는 것은 내가 이전 스캐너의 개행문자를 처리하기 위해 스캐너를 한번 더 넣어두었는데, 그게 필요없는 때에도 작동했던 것이다.
숫자를 받아야 할 때 범위 외 숫자를 처리할 때도, 숫자가 아닌 것을 입력할 때도 예외를 던져주고, 예외를 처리하는 방식으로 진행했었다.
그랬더니 숫자가 아닌 것은 잘 처리를 하지만, 범위 외 숫자를 입력하면 스캐너가 오작동을 하게 된다.
결국에는 두가지 모두 예외 처리로 하는 것이 아니라, 범위 외 숫자 입력 시에는 특정 문구를 출력하는 것으로 마무리지었다.

이렇게 트러블슈팅을 잘 마무리짓고 과제 제출을 끝냈다!!
그리고 과제 해설 강의를 들었는데... 튜터님의 예시를 보고... 정말 왜 자바가 객체지향이라고 하는 건지 이해해버렸다.
나도 나름 이것저것 기능별로 클래스를 분리해서 만들었다고 생각했는데...
이것보다 훨씬 더 자잘하게 나눌 수 있었고, 더 자잘하게 나누니 훨씬 더 깔끔하게 동작할 수 있게 되었다.

또.. 나는 모든 메서드 안에서 다른 클래스의 객체를 따로따로 만들어서 사용했었는데...
이걸 그냥 해당 클래스의 필드에 만들어버리면 그 클래스 안에서는 똑같이 사용할 수 있었다...
사실 동작하는 방식이 조금 달라지긴 하지만... 거기까진 생각을 안해봤다.

그리고 while문에 continue라는게 있었다는 걸 정말 까맣게 잊어버렸다.
나는 while 안에 while 안에 while을 만들어서 사용하고 있었는데... 그냥 continue를 사용했으면 더 간단해질 수 있었을 것 같다.

그래도 가장 충격적인 것은 클래스를 그렇게 많이 나눠서 만들 수가 있고, 그 많은 클래스를 그렇게 쉽게 관리할 수 있다는 것이다...
내가 생각한 것보다 훨씬 더 객체지향으로 동작한다는 사실에 놀랐고, 그걸 생각할 수 있다는 것에 또 놀랐다...
계속 계속 연습하다보면 언젠간 나도 그렇게 생각해낼 수 있으리라 믿는다.

내가 작성한 코드는 깃허브에 업로드해두었다.
GitHub 보러가기


🖥️ 계산기 프로젝트 #6

해설 강의를 듣고 너무 큰 충격을 받아 키오스크는 더 보고싶지 않았기에... 오늘은 오랜만에 다시 계산기로 돌아왔다.

계산기에 제네릭을 적용하고 나서인지, 사실 언제부터인지 잘 모르겠지만...
리스트 컬렉션에 계산 결과를 저장하고, 삭제하는 등의 기능들이 전혀 작동되지 않고 있었다.

일단 오늘 컬렉션에 계산 결과가 저장되지 않는 문제는 해결을 했다.
그 이유는.. 내가 while문 안에서 컬렉션이 있는 ArithemeticCalculator 객체를 만들어서 while문이 돌아갈 때마다 새로운 객체가 되어버렸다는 것이다.
언제부터 저 친구가 while문 안으로 들어가버린 것인지...
그리고 난 왜 그걸 깨닫지 못하고 있었던 것인지...
그래도 while문 바깥으로 저 친구를 빼내고 나서 결과가 저장되지 않는 문제는 잘 해결이 되었다.

문제는 이제 삭제 기능인데...
처음에는 원하는 결과값을 입력해도 그걸 처리를 하지 못했다.
그건 내가 입력한 건 int이고, 저장되어 있는 값은 double이었기 때문인데, 이건 입력값을 double로 바꿔주며 잘 해결이 되었다.
그 다음엔 내가 입력한 값으로 해당 값을 가진 친구의 index를 반환해주게 되는데, 여기까지도 작동이 잘 된다.
이제 문제는 그 index를 가지고 리스트 컬렉션에서 해당 값을 삭제하는 것인데...
이게 왜인지 지정한 인덱스만 삭제하는 것이 아니라 모든 값을 clear 해버린다...
아직 해결을 하지 못했기에... 시간이 날 때마다 틈틈이 시도해봐야겠다.

사실 어차피 과제 제출도, 피드백도 끝난거 이대로 끝내버릴까 싶었지만...
그래도 이상한 코드를 깃허브에 그대로 둘 순 없으니.. 계속 해결해봐야겠다.

내가 작성한 코드는 깃허브에 업로드해두었다.
GitHub 보러가기


🙃 오늘의 느낀점

과제 해설 강의를 들으면서 계속 난 왜 저렇게 생각을 못했을까 싶었다.
자바 3주 다뤄보고 몇년 동안 다뤄본 사람들과 동일한 생각을 하는게 말이 안되긴 하겠지만...
언젠간 내 뇌 구조도 저렇게 바뀔 수 있게 되기를 바란다.

내일부터는 새롭게 스프링을 배운다고 하는데...
스프링은 정말 이름만 알고 한 번도 다뤄본 적이 없어서 걱정이 되는데, 한편으로는 재미있을 것 같기도 하다.
스프링은 자바 개발자들에게 겨울은 가고 봄이 왔다는 의미로 이름이 붙여졌다고 한다.
어쩌다가 이런걸 만들게 되었는지, 또 이건 얼마나 쉽고 편하게 다룰 수 있게 도와주는건지 궁금하다.
새로운 공부도 열심히 해봐야겠다.

profile
백엔드 개발자 지망생

0개의 댓글