1. 버그(Bug)
프로그래머들 사이에는 고유한 은어가 있습니다. 가장 먼저 익히게 될 단어는 바로 버그(bug)입니다. 이는 프로그램이 의도한 대로 작동하지 않거나, 갑자기 종료되거나, 이상한 결과를 출력하는 오류를 의미합니다.
프로그램이 이상하게 작동하는데 프로그래머가 '원래 의도된 기능'이라고 우긴다면, 보통 "이건 버그가 아니라 피처(feature)입니다"라고 말하곤 하죠. 인터넷에는 이와 관련된 밈(meme)이 아주 많습니다.
역사적 배경
전설에 따르면 1947년 9월, 하버드 대학의 과학자들이 Mark II 컴퓨터를 테스트하던 중 오류가 발생했습니다. 모든 회로를 점검한 결과, 릴레이 사이에 낀 나방 한 마리를 발견했죠. 이 곤충을 일지에 붙이며 "버그가 발견된 최초의 실제 사례(First actual case of bug being found)"라고 적어 두었습니다.
그 이후로 오류를 찾고 해결하는 과정을 디버그(debug) 또는 디버깅이라고 부르게 되었습니다.

2. 디버그 모드(Debug Mode)
오류를 찾기 위해 프로그래머들은 디버거(Debugger)를 사용합니다. 이는 IntelliJ IDEA 내부에 포함된 특별한 도구로, 프로그램 실행을 잠시 멈추고 내부를 들여다볼 수 있게 해줍니다.
IntelliJ IDEA에서는 프로그램을 두 가지 모드로 실행할 수 있습니다:
| 모드 | 아이콘 | 단축키 | 설명 |
|---|---|---|---|
| Run (일반 실행) | |
Shift+F10 (Win/Lin)Ctrl+R (Mac) |
프로그램을 처음부터 끝까지 그냥 실행합니다. |
| Debug (디버깅) | |
Shift+F9 (Win/Lin)Ctrl+D (Mac) |
지정한 위치에서 프로그램을 멈출 수 있습니다. |
디버그 모드에서는 프로그램을 한 줄씩 실행하며 변수 값이 어떻게 변하는지 관찰할 수 있습니다.
3. 브레이크포인트(Breakpoint)
디버거가 어디서 멈춰야 할지 알 수 있도록 브레이크포인트(Break Point)를 설정해야 합니다. 이게 없으면 프로그램은 평소처럼 끝까지 그냥 실행됩니다.
실제 예제로 연습해 봅시다. 디버거의 강력한 기능을 보여드리기 위해 곱셈 로직을 별도의 메서드로 분리했습니다. 아래 코드를 IDEA에 복사하세요:
public class Main {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 5; i++) {
int result = calculateMultiply(i); // <--- 여기서 멈추고 싶습니다
sum += result;
System.out.println("Step: " + i + ", Result: " + result + ", Sum: " + sum);
}
System.out.println("Final Sum: " + sum);
}
public static int calculateMultiply(int number) {
return number * 2;
}
}
과제. 반복문 내부에서 변수들이 어떻게 변하는지 확인하고, 메서드 내부를 들여다보고 싶습니다.
실행. int result = calculateMultiply(i); 줄 왼쪽의 좁은 회색 영역을 마우스로 클릭하세요. 빨간 점이 나타날 것입니다.
이제 Debug(벌레 아이콘)를 통해 프로그램을 실행하세요. 프로그램이 실행되다가 이 줄이 실행되기 직전에 즉시 '멈출' 것입니다.
4. 제어: F8, F7, F9
프로그램이 일시 중지되면, Debugger 패널 상단에 제어 버튼들이 나타납니다.
F8 — 스텝 오버 (Step Over)
F8을 누르세요. 프로그램이 현재 줄을 실행하고(메서드를 호출하고 결과를 받음) 다음 줄인 sum += result;로 넘어갑니다.
F8을 다시 누르세요. 프로그램이 숫자를 더할 것입니다. 변수 값이 변하는 것을 확인할 수 있습니다.
F8을 다시 누르세요. 콘솔 출력 결과를 볼 수 있습니다.
이것이 주된 이동 방법입니다: 메서드 내부 세부 사항에 들어가지 않고, 한 줄씩 이동합니다.
F9 — 재개 (Resume Program)
우리는 1부터 5까지 반복하는 루프를 가지고 있습니다. 반복문 한 번을 돌기 위해 F8을 다섯 번 누르는 것은 번거롭습니다. 만약 반복문이 1000번 반복된다면 어떨까요?
F9를 누르세요. 프로그램이 '멈춤' 상태에서 풀려나, 현재 반복의 나머지 코드를 모두 실행하고 다음 반복으로 넘어가... 다시 브레이크포인트에서 멈춥니다.
이런 방식으로 F9를 사용하면 반복문을 빠르게 건너뛸 수 있습니다. 한 번 누를 때마다 다음 반복으로 이동합니다.
F7 — 스텝 인투 (Step Into)
코드에서 메서드 호출(여기서는 calculateMultiply(i))을 만났을 때 F8을 누르면, 디버거는 그냥 메서드를 실행하고 다음으로 넘어갑니다. 하지만 메서드 내부 코드가 어떻게 작동하는지 보고 싶다면 F7을 누르세요.
프로그램이 int result = calculateMultiply(i); 줄에서 멈췄을 때 F7을 눌러보세요. 디버거가 calculateMultiply 메서드 내부로 이동하며, 값이 number 파라미터로 어떻게 전달되는지 확인할 수 있습니다.
Shift + F8 — 스텝 아웃 (Step Out)
System.out.println(...) 줄에서 실수로 F7을 눌러 Java 시스템 코드의 깊은 곳으로 들어가 버렸다면 어떻게 할까요? 남이 짠 수천 줄의 코드를 읽는 것은 지루하고 이해하기도 어렵습니다.
Shift + F8을 누르세요. 프로그램이 현재 메서드의 나머지 부분을 빠르게 실행하고, 원래 호출했던 곳(우리의 main 메서드)으로 되돌려 보내줍니다.
5. 값은 어디서 확인하나요?
반복문 예제로 다시 돌아가 봅시다.
방법 1: 인라인 디버깅 (Inline Debugging)
코드 에디터를 바로 보세요. IDEA가 줄 오른쪽 회색 글씨로 현재 값을 보여줍니다.
방법 2: Variables 패널
Debugger 창 하단에 Variables 탭이 있습니다. 이곳에서 현재 모든 변수를 확인할 수 있습니다.
Java에 대한 중요 참고사항: 원시 타입(예: int)은 값을 즉시 보여줍니다. 하지만 객체나 배열(예: String[])은 내부에 많은 데이터를 가지고 있습니다. 내용을 보려면 변수 왼쪽의 작은 화살표를 클릭하여 객체를 '펼쳐야' 합니다.
방법 3: Frames 패널
변수 탭 왼쪽에 Frames(호출 스택)라는 목록이 있습니다. 프로그램이 현재 어떤 단계에 있는지 보여줍니다.
예를 들어, main:6, Main은 다음을 의미합니다:
- Main 클래스의 main 메서드 안에 있습니다.
- 6번 줄에서 멈췄습니다.
이것은 코드 내의 정확한 주소입니다. 만약 다른 메서드 내부로 들어가면(calculateMultiply에서 F7을 누르면), 목록 상단에 calculateMultiply:13, Main이라는 새로운 항목이 나타나며, 이전 메서드에서 새 메서드가 호출되었음을 알려줍니다.
6. Evaluate Expression (표현식 평가)
가끔은 변수를 보는 것만으로는 부족할 때가 있습니다. "만약 ~라면 어떨까?"라는 궁금증이 생기죠.
Alt + F8(Windows/Linux) 또는 Option + F8(macOS)을 누르세요. 'Evaluate' 창이 열립니다. Variables 패널 아래 줄에 직접 식을 입력할 수도 있습니다.
여기서 현재 변수들을 사용하여 어떤 코드든 작성해 볼 수 있습니다. 예를 들어, 반복문에서 다음과 같이 입력해 보세요:
sum + 100
Enter를 누르면 IDEA가 실제 프로그램을 변경하지 않고 결과를 계산해 줍니다. 실험을 위한 연습장이라고 생각하세요.
7. 조건부 브레이크포인트 (Conditional Breakpoints)
반복문이 10,000번 반복되는데, 5,000번째 단계에서만 오류가 발생한다고 상상해 보세요. F9를 5,000번 누르는 건 정말 나쁜 생각입니다.
빨간색 브레이크포인트 점을 마우스 오른쪽 버튼으로 클릭하세요. 팝업 창이 나타납니다. Condition 필드에 Java 조건을 입력하세요. 예: i == 5. 그리고 Done을 누르세요.
이제 디버거를 실행하면, 프로그램은 처음 4,999번의 루프를 무시하고 조건이 true가 될 때만 멈출 것입니다. 작업 시간을 수 시간 단축해 줄 것입니다!
8. 브레이크포인트 관리
초보자들은 프로젝트 곳곳에 너무 많은 브레이크포인트를 설정해서 프로그램이 예상치 못한 곳에서 계속 멈추는 경우가 있습니다. 파일을 일일이 뒤지며 빨간 점을 찾는 건 번거로운 일입니다.
Ctrl + Shift + F8(Windows/Linux) 또는 Cmd + Shift + F8(macOS)을 누르세요. Breakpoints 창이 열립니다.
여기서 프로젝트의 모든 브레이크포인트 목록을 볼 수 있습니다. 체크박스를 해제하여(일시적으로 비활성화) 하거나 Delete 키로 삭제할 수 있습니다.
9. 요약
Java 개발자의 기본 오류 해결 도구들을 살펴보았습니다. 디버거(Debugger)는 코딩을 '운에 맡기는 것'에서 '정밀한 엔지니어링 작업'으로 바꿔주는 도구입니다.
오류의 원인을 빠르게 찾는 능력은 코드를 빨리 짜는 능력보다 상업용 개발에서 훨씬 더 높게 평가받는 기술입니다. 조건부 브레이크포인트와 Evaluation을 연습해서 어떤 버그든 놓치지 않도록 하세요.
GO TO FULL VERSION