마지막 편
'디버깅'
코딩을 작성하다보면 에러는 피할 수 없다. 인간은 완벽하지 않기 때문에 어쩌면 당연한 것일지도 모른다. 그렇기에 이를 해결하는 것도 인간의 몫인 것이다. 여기서 디버깅이란 코드에서 발생한 에러 즉, 버그를 잡아내고 고치는 것을 말한다. 버그를 잡아내는 것은 프로그램을 운용하는 데 있어서 대단히 중요하기 때문에, 결국 개발자들이 디버깅에 많이 신경을 쓰는 것이다. 하지만 나도 그렇고 코딩에 입문한지 얼마 안된 사람들이 쉽게 착각하는 것이 있다.
에러를 적게 낼수록 좋은 거네?
사실 틀린 말은 아니다. 에러를 적게 낼 수 있다는 것은 그만큼 코딩에 대한 이해도가 높고 논리적으로 문법을 구사할 수 있다는 것과 마찬가지이기 때문이다. 하지만 실무적 관점에서 보면 조금은 그 관점이 달라질 수 있다. 에러를 적게 내는 것보다도 더 중요한 것이 있다는 것이다. 이전 글에서도 언급했다시피 개발자들의 주 업무는 기존 코드를 수정하고 개선하며 디버깅하는 것이 주 업무다. 그 말은 즉슨, 에러를 적게 내는 것보다 이미 발생한 에러를 얼마나 빨리, 정확하게 잡아내는 지가 더 중요한 것이다.
에러의 종류
컴퓨터는 인간의 의도를 모른다. 그렇기에 코드는 내가 생각한데로 실행되는 것이 아닌 코드가 작성된 그대로 실행된다. 그래서 에러가 쉽게 발생하는 것이고, 어쩔 수 없이 우리는 컴퓨터의 시각으로 코드를 바라보는 훈련을 할 수 밖에 없는 것이다.
에러는 크게 문법 에러, 논리 에러, 런타임 에러로 나눠볼 수 있다. 문법 에러는 말 그대로 코드 문법이 틀려서 발생하는 에러이다. 괄호나 세미콜론 ; 을 누락시키는 것이 그 예가 될 수 있을 것이다. 논리 에러는 문법은 맞지만 결과가 틀린 것을 말한다. 한마디로 내가 원하는 결과를 내기에는 코드가 논리적으로 틀린 것이다. 예를 들어서 특정 집단의 평균값을 내려고 할 때 그 범위를 20대로 한정지으려했지만 내 코드는 40대까지 무작위로 포함되어있게 코드가 짜져있는 것이다. 그러면 내가 원하는 결과가 나오지 않는 것이 당연하다. 이것이 논리 에러이다. 마지막으로 런타임 에러가 있다. 런타임에러는 코드를 실행함에 있어서 예외 상황이 발생하면서 나타나는 에러이다. 배열 인덱스가 초과하거나 0으로나 숫자를 나누는 등의 상황이 그 예가 될 수 있다.
디버깅의 기본 원칙
디버깅을 한다고 해서 내가 오류난 곳을 임의로 수정하고 추측해서 코드를 대략적으로 짚어대면 헛다리를 짚을 가능성이 커진다. 애초에 인간의 두뇌로 생각하는 방식이 고정되어 있기 때문에 무작정 오류를 찾기 시작하면 어느 새부턴가 일이 더 꼬여버리는 상황에 맞딱뜨릴 수도 있다. 그렇기에 우리는 다음 세 가지를 준수할 필요가 있다.
앞선 글들에서 계속 언급하고 강조했다시피 코딩에서 중요한 것은 코드를 정확히 이해하는 것이다. 그렇기에 오류가 난 사황에서도 내가 짠 코드를 정확하게 이해해야 할 필요가 있다. 문제가 생긴 부분을 대략적으로 짚기 보다는 에러가 어디서, 어떻게, 어떤 입력을 통해서 발생하는지 정확히 파악해야할 필요가 있다. 예를 들어 특정 아이콘을 클릭할 때마다 오류가 발생한다면 그 부분의 코드부터 차근차근 이해하면서 오류의 원인을 찾는 것이다.
뿐만 아니라 명확한 검증 단계도 분명 필요하다. 문제를 추측해보는 것에서 끝내는 것이 아니라 그 부분을 직접 출력하여 문제를 확인하는 것이다. 이 방법 이외에도 의심이 드는 코드 구간만 따로 가져와서 실행하면서 오류가 나는 지 검증하는 것이다. 이러한 과정은 실제 업무 효율에도 좋을 수밖에 없다.
마지막으론 아주 당연한 이야기지만 에러 메시지를 꼼꼼히 확인하는 것이다. 이 방법은 꽤나 당연한 이야기지만 그만큼 중요하기 때문에 넣어보았다. 대부분의 오류는 에러 메시지에 적혀있기 때문에 이를 확인하는 것은 디버깅에 기초중에 기초이다. 예로 IndexError, TypeError, NullPointerException 과 같은 에러 메시지를 확인할 수 있는 데, 이를 통해 에러 이름과 라인 번호를 확인할 수 있기 때문에 오류가 난 곳과 원인을 좀 더 쉽게 추측할 수 있다. 그 외에도 변경 이력을 확인하거나 디버거 툴을 사용해서 디버깅에 활용할 수 있다.
코딩은 코드를 작성하고 실행하고, 오류난 곳을 디버깅하고 다시 실행하는 이 과정을 반복한다. 그만큼 디버깅은 코딩을 하는 사람에게 있어서 빠질 수 없는 과정이자 중요한 스킬 중 하나인 것이다. 그렇기에 좀 더 효율적이고 명확한 디버깅을 위해 적절한 습관을 가지는 것이 좋다.
마무리하며
코딩에 관심을 가지고 있거나 초심자의 길을 걷고 있는 누군가에게 좀 더 도움이 되고자 연재를 시작하였습니다. 저도 아직 많이 부족하지만 그럼에도 끝까지 관심가져 읽어주심에 감사드린다는 말씀을 마지막으로 전하고 싶습니다. 거창한 내용은 아니었지만 작게나마 저의 경험치가 독자분들에게 보탬이 되었기를 하는 바램입니다. 이상으로 "코딩, 누구도 알려주지 않은 진실" 연재를 마칩니다.
p.s. 한없이 밝을 당신의 앞날에 부담스럽지 않을 정도의 작은 응원을 던져봅니다 :)