-
9/17 TIL | 멱등성은 무엇인가.📝 기록/매일의 기록 2022. 9. 17. 23:38
어제 진행한 코딩 인터뷰에서 '멱등성'이라는 키워드가 등장했다. '멱등성'이란 전산학이나 수학에서 사용하는 용어로, '연산을 여러 번 하더라도 결과는 달라지지 않는 성질' 혹은 '요청을 여러 번 하더라도 한번 요청했을 때와 결과가 같은 성질'을 의미한다. 즉 메서드가 여러 번 실행되어도, 결과는 같으므로 안전하게 사용할 수 있는 성질이기도 하다. 사실 나는 어제 '멱등성'이라는 단어를 난생처음 들어봤기 때문에 무슨 뜻인지 바로 이해하지 못했을뿐더러 '네..? 역등성이요?' 이랬다가 >>멱<<등성'이라는 걸 알게 되고 머쓱했다^^;
정확한 뜻을 이해하고자 무슨 한자인지 찾아보니, 冪(덮을 멱)에 等(무리 등)이었다. 冪(덮을 멱)은 '덮다'를 의미하는데, '멱(= 둘 이상의 수나 식을 서로 곱한 수)'이라는 뜻도 내포하고 있다. 또한, 等(무리 등)은 '무리'를 의미하는데, '같다'는 뜻도 내포하고 있다. 그러니 정확하게는 '둘 이상의 수나 식을 서로 곱한 수가 같다'는 의미인 것이다.
내가 갑자기 멱등성에 대해서 왜 장황하게 늘어놓는 거냐면... 바로 오늘 딜리버리 타이쿤 과제를 하면서 상점의 로또 구매 기능의 개발하던 도중, 당첨/낙첨의 테스트 코드를 작성하면서 고민했던 부분이었기 때문이다. 랜덤 수를 뽑아 그 수가 0이면 당첨, 1이면 낙첨이라고 처리해야겠다 생각했으나 그 난수를 테스트하는 테스트 코드를 도무지 어떻게 작성해야 할지 모르겠는 것이다. 호출 시마다 랜덤하게 값이 반환되기 때문에 연속으로 같은 값이 나올 거라 예측할 수 없는, 바로 멱등성이 보장되지 않는 함수였기 때문이다.
// Before int number = random.nextInt(2); if (number == 1) { balance *= 2; } // After int number = random.nextInt(2); if (isWin(number)) { balance *= 2; } public boolean isWin(int number) { return number == 0; }
Before는 3주차에 작성했던 코드이고 After는 이번 주차에 테스트 코드를 작성해보면서 멱등성이 보장될 수 있게 재작성한 코드이다. isWin이라는 메서드를 따로 분리하여 넘겨받은 난수를 판단하여 boolean값만을 반환하게 작성하였다.
@Test void isWin() { Rider rider = new Rider(); assertTrue(rider.isWin(0)); assertFalse(rider.isWin(1)); }
테스트 코드는 위와 같이 작성하였는데, 0일 경우 당첨, 1일 경우 낙첨에 대해서 true/false를 제대로 반환해주고 있다. 코딩 인터뷰를 할 때까지만 해도 멱등성을 왜 언급하게 되었는지 그 맥락이 내게 그렇게 와닿지 않았는데, 하루 만에 이 고민을 함으로써 테스트 코드에서 멱등성이 왜 중요한지를 깨달을 수 있었다.
멱등성이 잘 지켜진다면 테스트 코드를 작성하기가 쉬워진다. 내가 3주차에 작성했던 로또를 구매하는 buyLotto라는 메서드는 난수 생성 및 난수 판별, 당첨/낙첨 분기까지 여러 가지 책임을 가지고 있는 코드였다. 그렇기에 테스트 코드를 작성하기가 어려웠던 것이다. 다시 말해 테스트하기 쉬운 코드는 적절하게 책임을 잘 분리했다는 의미도 된다. 결국 프로그램의 유지보수에도 큰 도움이 되며, 지속 가능한 소프트웨어를 만들기 위해서는 꼭 필요한 개념이다.
만약 어제 코딩 인터뷰에서 '멱등성'이라는 키워드가 등장하지 않았다면 오늘 이 개념을 그렇게 바로 이해하기는 어려웠을 것이다. 아는 만큼 보인다라는 게 정말 맞다는 걸 오늘도 다시금 깨닫고, 더 많은 것들을 알아볼 수 있도록 최대한 많이 보고 체화하자. 오늘도 파이팅~! 💪
'📝 기록 > 매일의 기록' 카테고리의 다른 글
9/19 TIL | 구현은 핵심 로직부터! (0) 2022.09.19 9/18 TIL | '굳이?'라는 마음을 이겨낸다는 건. (1) 2022.09.18 9/16 TIL | 프로처럼 일하는 법. (0) 2022.09.16 9/15 TIL | 코딩 테스트에 TDD 적용해보기! (부제: What I Ate Today😋) (1) 2022.09.15 9/13 TIL | 람다식에서는 왜 final, effectively final 변수만 사용해야 하는가?🧐 (0) 2022.09.13