[TIL] 가장 중요한 것은 의미
어제 쓴 글을 보고 멘토님께서 생각해보라고 던져주신 주제에 대해 다시 정리해본다.
가장 중요한 것은 의미이다.
최근에 계속 알고리즘 문제풀이를 하다보니 코드의 성능에 대해 관심이 많았다.
같은 기능을 하는데 어떤게 좀 더 처리속도가 빨라서 효율성 테스트를 통과할 수 있는가 하는 의미로 말이다.
하지만 성능도 중요하지만 더 먼저 생각해봐야하는 것이 의미에 대한 것이다.
parseInt와 Math.floor 둘 중 뭘 사용할까?
정수형 몫을 구하기위해 parseInt
와 Math.floor
중 뭘 사용하는게 좋을까에 대해 고민했다.
예제들마다 다양한 함수를 사용하고 있어서 어떤 기준으로 사용할 함수를 선택해야할지 헷갈렸다.
나는 우선 메소드의 동작 과정에 대해 찾아보고 생각했다.
parseInt
는 문자를 특정진수의 숫자로 변환하기 위해 문자를 파싱하는 과정을 거친다.
애초에 숫자를 내림처리하는 용도인 Math.floor
와 차이가 날 수밖에 없다라고 결론지었다.
이것을 의미적으로 생각해보면 어떤 차이가 있을까?
일단 의미적으로 parseInt
와 비교하려면 Math.floor
보다는
소수점 이하를 버림처리하는 Math.trunc
가 맞겠다.
그럼 앞자리 정수를 얻기위해 내림처리하는 것과 버림처리 하는 것은 어떤 차이일까?
내림은 소수값에서 가장 적게 차이나는 낮은 값을 반환하는 것이고,
버림은 소수점을 이하를 무시하고 앞에있는 정수형을 반환한다.
내림처리는 더 낮은값을 구하고자 하는 의도에 맞게 양수,음수 상관없이 확실하게 더 낮은값을 구할 수 있다.
반면 버림처리를 하면 양수의 경우 원본보다 더 작은값이 되고, 음수의 경우 원본보다 더 큰값이 되어 잘못 사용하면 의도가 흐려질 수 있다.
따라서 내림처리 하고자하는 의도가 확실한 상황에서 생각없이 버림처리되는 함수를 사용하면
당장 생기는 버그는 없더라도 언젠가는 의도치 않은 결과값이 나올 수도 있게된다.
== 와 === 의 의미적 비교
나는 ==
와 ===
의 차이를 데이터타입까지 비교할 것인가 말것인가로 생각했다.
그런데 이렇게 생각해보자.
비교하고자 하는게 완전히 같아야하는가, 아니면 느슨하게 같아도 되는가.
생각해보면 느슨하게 같아도 되는 경우는 정말 예외적인 케이스이겠다.
1 == '1'
을 사용해서 true
값을 얻고자 하는 경우는 없을테니까.
그래서 최근에는 ==
의 사용을 지양한다고 한다.
의도가 애매한 ==
보다는 의도가 명확한 ===
를 쓰는것이 더 나은 것이다.
의도를 생각해보고 의미에 맞는 코드를 구현하자
의미가 모호한 요소들로 프로그램을 구현하다보면
의도치 않은 의미가 쌓이고 쌓여 전체 코드가 부실해진다.
의미에 잘 맞는 코드를 사용하고 의미에 대해 고민하는 것을 먼저 하다보면 성능은 자연스럽게 따라온다.
또 명확한 의도를 가지고 잘 짜여진 코드에서 성능 이슈가 생긴다면
그때 성능 관점에 중심을 두고 개선해나가면 되는 것이다.
오늘의 결론
결과값만 보고 비슷하게 동작하는 함수들을 혼용해서 사용해왔는데
앞으로는 의도를 명확하게 생각해보고 그 의도에 딱 맞는 함수를 쓰도록 노력해야겠다.
Leave a comment