N Log

버그, 오류, 에러, 예외

버그(Bug)

버그(Bug)는 기계의 결함이나 문제를 의미하는 용어로, 19세기부터 공학 분야에서 사용되어 왔다.
1878년 토마스 에디슨의 편지에서도 장치의 문제를 버그라고 표현한 기록이 있다.

“I did find a ‘bug’ in my apparatus…”

이후 이 용어는 컴퓨터 개발 과정에서도 자연스럽게 이어져 사용되었다.

1947년 9월 9일, Harvard Mark II에서 발생한 사건은 이 용어를 널리 알리는 계기가 되었다.
그레이스 호퍼와 연구팀은 오작동의 원인을 조사하던 중 릴레이 회로에서 실제 나방(moth)을 발견했고, 일지에 다음과 같이 기록했다.

“First actual case of bug being found”

이 사건으로 버그라는 용어는 컴퓨터 분야에서 널리 알려지게 되었다.

이처럼 버그는 19세기부터 기계의 결함을 뜻하는 용어였으며, 소프트웨어 분야에서도 결함이나 문제를 의미하는 용도로 사용된다.
설계 문제, 논리적 문제, 단순 오타 등 다양한 이유로 버그가 발생할 수 있다.
이러한 버그를 찾아 고치는 과정을 디버깅(debugging)이라 하며, 여기서 ’de’는 제거를 뜻하는 접두사(prefix)이다.

오류(誤謬)

일상에서 오류는 그릇되거나 잘못된 일을 의미한다.
프로그래밍에서 잘못된 동작이나 결과를 뜻하는 넓은 의미로 쓰이기도 하고, 에러(Error)의 번역으로 사용되기도 한다.
문맥에 따라 의미가 달라질 수 있으므로, 명확한 의사소통이 필요할 때는 에러(Error)나 예외(Exception)와 같은 구체적인 용어를 사용하는 것이 좋다.

에러(Error)

에러는 프로그램이 정상적인 실행을 이어나갈 수 없는 치명적인 상태이다.
일반적으로 복구가 어렵거나 복구를 시도하는 것이 적절하지 않은 상황에 해당한다.

예시

  • 하드웨어 고장 및 손상
  • 저장 장치 공간 부족
  • 메모리 부족 (Out of Memory)
  • 스택 오버플로우 (Stack Overflow)

에러 발생 시 프로그램은 대부분 즉시 종료된다.
일부 언어에서는 에러를 처리할 수 있지만, 실제 복구는 거의 불가능하며 대부분 로그 기록 후 종료한다.

예외(Exception)

예외는 프로그램 실행 중 발생하는, 특별한 처리가 필요한 비정상적인 상황이다.
예외는 발생 가능성을 사전에 예측할 수 있지만, 예외가 발생하는 것을 방지할 수는 없다.
즉, 예외는 발생을 전제로 적절히 처리해야 하는 대상이다.

예시

  • 네트워크 관련
    • 서버/클라이언트 오류: HTTP 4xx, 5xx
    • 실제 네트워크 실패: 연결 실패, 타임아웃
  • 존재하지 않는 파일 접근
  • 잘못된 형식의 사용자 입력값
  • 권한 부족

대부분의 프로그래밍 언어에서는 try / catch 구문을 통해 예외를 처리할 수 있다.