220614 오류를 수정하며 한 뼘 더 성장하기

샨티(shanti)·2022년 6월 14일
1

TIL

목록 보기
13/145

하루를 마무리 하기 전, 오늘 있었던 일들을 잔잔히 되짚어봅니다.
성공과 실패의 모든 요소에서 '배울 점'을 찾아내어 기록하고,
더 성장하는 내일의 나를 위해 'action plan'을 세웁니다.


버텨낸 하루


오늘은 하루를 힘겹게 버텨낸 것 같다.
컨디션도 좋지 않았고, 중간 중간 어린이집에서 연락이 와서는 아이가 아프다고 하니. 그냥 심난했던 하루였다.
그래도 뭐... 달리 방법이 없기 때문에 우선은 하루 하루 버티는 수밖에!!
중간에 포기하지만 않으면 된다는 마음으로. 지금은 버티는데에 집중하고 있다.

지난 토욜, 남편을 붙잡고 진지하게 이야기했다.
남편이 주말까지 일을 하기 때문에 5주차가 되도록 주말에 공부하는 것이 거의 불가능했고,
그때문에 진도를 따라잡는 것이 너무 어렵다고 솔직하게 이야기했다.

한참을 서로 이야기하고는...
결론적으로 남편은 다른 방법이 없으니 지금 하는 일을 그만두고 다른 일을 찾아보겠다고 했다.
타이밍 좋게 내가 다니던 회사에서는 복직원을 쓰라고 연락이 왔고...ㅋㅋㅋ.

이렇게, 또다시, 한껏 레버리지를 당긴다.
사면초가. 이제 내가 잘 되지 않으면 정말 우리집이 폭삭 망할 것 같다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 유유.
웃는게 웃는게 아니다.. 후 ㅋㅋㅋㅋㅋㅋ

나의 커리어 전환을 위해서 본인의 커리어는 엉망진창을 만드는 남편.
미안하면서도 고마울 뿐이다.

하루 빨리 봄이의 삶의 무게를 덜어주고 싶고, 남편의 피곤을 덜어주고 싶다.
잘하자. 잘 하자...!


오늘자 코딩테스트를 통해 배운 점

16진수 만들기 문제는 3주차였나, 4주차 때 나왔던 테스트인데 몇 번째 반복하면서 수행하고 있는 과제이다.
사실 몇 번째 진행하고 있는 과제라면 익숙해져야 하는 것이 인지상정인데...
나는 아직도 손에 잘 익지 않고 어렵게 느끼고 있다. ㅠㅠ.

오늘 오전 코딩테스트는 16진수 만들기 문제를 1시간 동안 TDD로 풀어서 제출하는 것이었다.
결론적으로 시간 안에 모두 해결하여 제출하진 못했다.

미완료된 과제를 자꾸 다음날로 누적시키고 미루고 싶지 않아서 사실 뽀모도로 사이클 쉬는시간 때에도 이 문제를 붙잡고 있었고,
점심시간에도 라면 하나 끓여다놓고 프로그램을 완성시키는 데 집중했다.

그리고 결국 2가지 굵직한 오류를 해결해냈는데, 이게 나에게는 정말 큰 경험이자 도움이 된 것 같아서 오늘자 TIL 글에 남겨둔다.
Special thanks to 로지 트레이너님과 인우 동료님.


1. for문 작성 시 '조건 확인'에 유의

우선 오늘 작성했던 소스코드 중 오류가 있었던 코드를 아래와 같이 가져왔다.

 if (inputNumber >= 16) {
      int quotient = 0;
      int remainder = 0;

      for (int i = 0; 0 < quotient; i += 1) {
        quotient = inputNumber / 16;
        remainder = inputNumber % 16;

        tempHexadecimal += String.valueOf(symbolTable.charAt(remainder));

        inputNumber = quotient;
      }

이하 생략이어서 좀 생뚱맞긴 하지만...
어쨌든 요약해보자면 사용자가 입력한 10진수가 16 이상일 때, 아래 for문이 실행되도록 만드는 것이 목적이었다.

처음에는 혼자서 이만큼까지 설계를 한 것이 너무 성공적이라고 생각되어 뿌듯함에 젖어있었는데...
역시나 인텔리제이는 내가 원하는 답을 내뱉지 않고 희한한(?) 답을 내놓고 있었다.
사실 TDD 방식으로 코드를 작성하고 있었던 터라 테스트코드에서 계속 오류가 났다고 하는게 맞겠구나.

사실 이 문제가 내 점심시간 50분을 날려먹었다.
옆에서 식어가는 라면은 안중에 둘 새가 없었다. 도대체 왜 안되는 것인지 이유를 꼭 좀 알고싶었다.

그리고 기가막히게 낮 1시가 다 되어갈 무렵....
갑자기 눈에 들어온 저 quotient의 모습...

if문에 진입하고 나서 바로 선언되는 quotient는 0으로 할당시켜놓고, for문의 '조건 확인' 부분에는 quotient가 0 초과시에만 이 for문에 진입할 수 있도록 만들어 둔 것이었다.
결국 16 이상의 숫자를 받더라도 저 for문은 거쳐가지도 못한 채 그 아래 단계에 있는 코드들만 열일하고 있던 것이었다.


아... 답답한 마음이 정말 뻥!!! 뚫어지는 기분이었다.
내가 잘못한 부분이었지만, 내가 발견하고 나니 경험치가 +1 되는 기분이었다.
다음번에 어떤 코드를 작성하더라도 for문을 작성해야 한다면 이 부분이 분명 신경쓰이고 마음에서 걸리적 거릴 것 같다.
좀 더 유의깊게 볼 것 같다는 이야기 ㅎㅎ.

결국 저 부분을 해결하기 위해 임시방편으로 int quotient = 1;quotient 할당값을 바꿔주었는데...
썩 유쾌하진 않지만 그래도 저 for문에 어떻게든 진입시키겠다는 굳은 의지를 나타내주었다.

어렵다 어려워... 좋은 것이란 대체 무엇일까....
우선 실수나 하지 말자!!


2. Test Subject와 Test의 관계

사실 오늘의 대환장 파티는 바로 여기였다.
결국 나 혼자서는 해결할 수 없어 질문방에도 질문하고, 바쁜 동료 붙잡고 늘어졌는데.
트레이너님의 힌트와 동료의 끝내주는 눈썰미로 해결할 수 있었다.

아...... 진짜 찐 대환장파티. 짤만 봐도 짜증난다.

근데, 따지고보면 짜증날것도 없는게.
내가 이상하게 써놨으니 이상한 결과물이 나오는 것이지 ㅎㅋㅋ 그렇지 않은가?

짜증의 이유는 '나는 잘못한게 없어!! 근데 왜 결과물은 그따구야?'의 생각이 깔려있기 때문이지 않을까....

쨌든 각설하고.
요지는, 메인 클래스에서 run을 하고 10진수를 넣었을 떄 16진수는 문제 없이 반환이 되는데.
저 테스트에서만 계속 오류가 발생하는 상황이었다.
그 오류도 참 기이한 것이...
앞에 있는 코드가 실행되고 그 다음 코드로 넘어가면 앞 코드의 결과물이 뒷 코드 결과물 좌 우에 붙어서 나오는!! 마치 앞 코드가 뒷 코드를 방해하는 그런 느낌적인 느낌이었다.
사실 이 패턴도 여러번 반복해서 보다보니 알게된 것이지, 처음 expected-actual 값이 다른 걸 봤을 때는 멘붕상태라서 눈치 채지도 못했었다.

결론적으론 메인 클래스에 아무 생각 없이 만들어두었던 '멤버변수' 때문이었다.
위 사진의 Test 코드가 연달아서 실행될 때, Hexadecimal 클래스의 compute 메소드 결과값이 hexadecimal 멤버변수 값에 그대로 남아있었고, 그 값이 남아있는 채로 테스트코드가 연달아 돌게 되면서 생기는 문제였다.

해결 방법은 두 가지,
(1) 테스트 코드 사이 사이 마다 Hexadecimal hexadecimal = new Hexadecimal();을 입력하여 매 코드 실행시마다 새로운 클래스를 불러들이거나,
(2) 또는 compute 메소드에 진입하자 마자 문제가 되는 멤버변수를 초기화시켜 주거나.

내가 발견한 건 아니고, 머리 끙끙 싸매다가 동료에게 질문하지 바로 눈치를 채고 알려주었다.

왜 저걸.. 한번에 눈치채고 아는거지.....?
너무 신기하다.

그리고 트레이너님 말도 고개를 끄덕일 수 밖에 없는게...
잘 작성된, 즉 정상적으로 프로그램이 돌아갈 수 있도록 작성된 코드라면 테스트에서 오류가 날 일이 없다.
결국 내 코드는 잘 만들어졌는데 테스트가 이상해! 라는 문장이 성립되지 않는다는 것이다.

오류를 수정하면서 새롭게 알게된 사실도 있고,
미처 알지 못했던 사실을 발견하게 되기도 했다.

새롭게 알게 된 사실은 새로운 지식이 되어 머리에 남을 것이고, 미처 알지 못했던 사실을 발견한 건 사고를 확장시켜주는 데 기여하게 되겠지.

머리는 아팠지만, 그래도 과제를 마무리하고 제출할 수 있어서 다행이다 싶었다.

매번 난이도 있는 문제에 치여 풀어내는데 급급하지만,
조금 더 익숙해지고, 점점 더 깊이있게 알아갈 수 있기를...!!

고생했다 오늘도~

profile
가벼운 사진, 그렇지 못한 글

0개의 댓글