-
2022년 7월 12일 TIL - 메서드를 사용할 때는 구체적인 작동 방식도 확인하자Today I Learned 2022. 7. 12. 23:56
어제 주어졌던 코딩 도장 문제인 문자열 내림차순으로 배치하기 문제를 푸는 과정에서 처음 알게 된 Character 클래스의 메서드 compare()를 사용해보는 과정에서 작은 이슈가 있었다.
어제 코딩 도장 문제는 영어 소문자와 대문자가 혼용되어 있는 주어지는 문자열을 영어 소문자 z와 영어 대문자 A의 순서인 [z-aZ-A]의 순서대로 정렬하는 문제였다. 해당 문제를 푸는 방법으로는 해당 문자열을 String인 상태 그대로 혹은 char 배열 타입의 변수로 변환한 뒤 정렬을 수행해주는 메서드를 사용하는 방법이 있었지만, 정렬 메서드를 이용해보지 않고 풀어보겠다는 계획을 세웠다. 주어진 문자열의 문자를 하나씩 꺼내와서 List에 문자를 넣는데, List에 이미 들어가 있는 문자들과 하나씩 크기를 비교해서 자신이 들어가야 할 위치를 결정하는 방식으로 구현하려 하였다.
그 과정에서 compare 메서드를 활용했다. 두 문자의 크기 비교를 위해 compare 메서드를 활용하려 했었는데, 공식 문서와 블로그의 설명을 통해 크기를 비교할 두 개의 Character 혹은 char 타입의 변수들을 인자로 받아 크기를 비교한 뒤 그 결과에 따라 -1보다 작은 정수값, 0, 1보다 큰 정수값들 중 하나를 반환한다는 설명을 확인했다. 처음에는 이 설명을 '먼저 주어진 인자의 크기가 작으면 -1, 같으면 0, 크면 1을 반환하는구나!'라고 인지해 조건문의 조건을 compare 메서드의 반환 값이 -1인 경우에 단어를 List에 추가하거나, 혹은 1인 경우에 추가하도록 소스코드를 작성했었다.
이상하게도 테스트 코드를 아무리 반복해도 테스트가 ignore되었다는 메세지를 확인해야만 했다. 수십 분을 붙잡고 있어도 어디에 문제가 있는지 보이지 않아 일단 무식하게 모든 변수와 리스트에 들어갈 단어의 값을 콘솔에 찍어보는 것을 시도했다. 그 결과... 리스트에 특정 문자가 무한히 더해지고 있는 모습을 확인했다.
깜짝 놀라 compare() 메서드의 반환값도 콘솔 화면에 찍어 확인해보았고, 그러자 반환값이 -1, 0, 1의 세 종류가 아닌 어떤 일정 크기의 양수 정수나 음수 정수 값이 반환되는 것을 확인했다. 이게 어떻게 된 일인가 싶어 compare() 메서드를 cmd + 좌클릭해 설명을 찾아 들어갔다.
해당 메서드는 주어진 두 인자의 차이를 계산하여 그 결과값을 반환하는 구조로 이루어져 있었다. 그제서야 -1보다 작은 정수값, 1보다 큰 정수값을 반환한다고 설명되어 있던 부분의 의미를 이해하고 compare() 메서드의 작동 방식을 완전히 이해할 수 있었다.
우리는 우리의 프로그래밍 실력을 다채롭게 해 줄 다양한 라이브러리와 메서드들이 있는 것을 알지만, 그 사용법은 어쨌든 하나하나 알아가야 한다. 공식 문서, 블로그 등 메서드에 대한 설명을 접할 수 있는 곳은 다양하다. 그렇지만 결국 그 메서드가 사용되는 곳은 소스코드이기에, 메서드가 내부적으로 어떻게 작동하는지도 메서드를 사용하기 전에 충분히 찾아봐야 할 것이라는 깨달음을 얻었던 날이었다.
'Today I Learned' 카테고리의 다른 글
2022년 7월 14일 TIL - 지나친 추상화는 오히려 가독성을 저해한다 (0) 2022.07.14 2022년 7월 13일 TIL - 무엇을 시도해도 안 될 때는 눈 딱 감고 뒤로 돌아가기 (0) 2022.07.13 2022년 7월 11일 TIL (0) 2022.07.11 2022년 7월 10일 TIL - 결과물의 도출과 완벽주의 (0) 2022.07.10 2022년 7월 9일 TIL - 멤버 변수의 가시성과 접근 방식에 대한 고찰 (0) 2022.07.09