어제 쓴 글을 보고 멘토님께서 생각해보라고 던져주신 주제에 대해 다시 정리해본다.


가장 중요한 것은 의미이다.

최근에 계속 알고리즘 문제풀이를 하다보니 코드의 성능에 대해 관심이 많았다.
같은 기능을 하는데 어떤게 좀 더 처리속도가 빨라서 효율성 테스트를 통과할 수 있는가 하는 의미로 말이다.

하지만 성능도 중요하지만 더 먼저 생각해봐야하는 것이 의미에 대한 것이다.


parseInt와 Math.floor 둘 중 뭘 사용할까?

정수형 몫을 구하기위해 parseIntMath.floor 중 뭘 사용하는게 좋을까에 대해 고민했다.
예제들마다 다양한 함수를 사용하고 있어서 어떤 기준으로 사용할 함수를 선택해야할지 헷갈렸다.
나는 우선 메소드의 동작 과정에 대해 찾아보고 생각했다.

parseInt는 문자를 특정진수의 숫자로 변환하기 위해 문자를 파싱하는 과정을 거친다.
애초에 숫자를 내림처리하는 용도인 Math.floor와 차이가 날 수밖에 없다라고 결론지었다.

이것을 의미적으로 생각해보면 어떤 차이가 있을까?
일단 의미적으로 parseInt와 비교하려면 Math.floor보다는
소수점 이하를 버림처리하는 Math.trunc가 맞겠다.

그럼 앞자리 정수를 얻기위해 내림처리하는 것과 버림처리 하는 것은 어떤 차이일까?

내림은 소수값에서 가장 적게 차이나는 낮은 값을 반환하는 것이고,
버림은 소수점을 이하를 무시하고 앞에있는 정수형을 반환한다.

내림처리는 더 낮은값을 구하고자 하는 의도에 맞게 양수,음수 상관없이 확실하게 더 낮은값을 구할 수 있다.
반면 버림처리를 하면 양수의 경우 원본보다 더 작은값이 되고, 음수의 경우 원본보다 더 큰값이 되어 잘못 사용하면 의도가 흐려질 수 있다.

따라서 내림처리 하고자하는 의도가 확실한 상황에서 생각없이 버림처리되는 함수를 사용하면
당장 생기는 버그는 없더라도 언젠가는 의도치 않은 결과값이 나올 수도 있게된다.


== 와 === 의 의미적 비교

나는 =====의 차이를 데이터타입까지 비교할 것인가 말것인가로 생각했다.
그런데 이렇게 생각해보자.
비교하고자 하는게 완전히 같아야하는가, 아니면 느슨하게 같아도 되는가.

생각해보면 느슨하게 같아도 되는 경우는 정말 예외적인 케이스이겠다.
1 == '1' 을 사용해서 true 값을 얻고자 하는 경우는 없을테니까.
그래서 최근에는 == 의 사용을 지양한다고 한다.

의도가 애매한 == 보다는 의도가 명확한 === 를 쓰는것이 더 나은 것이다.


의도를 생각해보고 의미에 맞는 코드를 구현하자

의미가 모호한 요소들로 프로그램을 구현하다보면
의도치 않은 의미가 쌓이고 쌓여 전체 코드가 부실해진다.

의미에 잘 맞는 코드를 사용하고 의미에 대해 고민하는 것을 먼저 하다보면 성능은 자연스럽게 따라온다.
또 명확한 의도를 가지고 잘 짜여진 코드에서 성능 이슈가 생긴다면
그때 성능 관점에 중심을 두고 개선해나가면 되는 것이다.


오늘의 결론

결과값만 보고 비슷하게 동작하는 함수들을 혼용해서 사용해왔는데
앞으로는 의도를 명확하게 생각해보고 그 의도에 딱 맞는 함수를 쓰도록 노력해야겠다.

Leave a comment