Java로 프로그래밍하는 경우 IDE의 선택지가 좀 있는 편인데 저는 Eclipse를 사용합니다.
사람들은 그 무거운 거 왜 쓰냐 차라리 IntelliJ 쓰지 라고 하는데 회사에서도 이걸로 개발 읍읍 적응되고 단축키도 알아가니 생각보다 좋습니다.
무튼 Eclipse 시리즈의 첫 글로 디버깅에 대해 이야기를 해보고자 합니다.
학부 때 학교에서 잘 안 알려주는 것 중 하나가 디버깅입니다. 맨날 디버깅하라고 하는데 알려주지는 않더라고요.
그래서 정말 간단한 정도로만 여기에 사용법 정도로 올릴테니 반드시 읽어주셨으면 좋겠습니다.
근데 디버깅이 뭔지 모를 수 있어요. 저도 정의는 잘 몰라요..
꺼무.. 아니 나무위키에서 설명된 글을 옮겨봤습니다.
디버그(Debug)는 프로그래밍 과정 중에 발생하는 오류나 비정상적인 연산, 즉 버그를 찾고 수정하는 것이다. 이 과정을 디버깅(Debugging)이라 하기도 한다.
오호라.. 버그를 찾는 과정이군요.
아래 코드는 정말 문제도 없고 누가 봐도 결과를 알 수 있습니다.
int a = 3;
int b = 5;
int aLoopResult = 0;
int bLoopResult = 0;
for(int i = 0; i < 10; i++) {
aLoopResult += a;
}
for (int i = 0; i < 20; i++) {
bLoopResult += b;
}
우리가 만약 위 코드에 문제가 있고 IDE에 있는 디버깅 도구의 사용법을 모른다면 모두 print를 찍어가면서 값을 확인했겠죠.
int a = 3;
int b = 5;
int aLoopResult = 0;
int bLoopResult = 0;
for(int i = 0; i < 10; i++) {
aLoopResult += a;
}
System.out.println(aLoopResult);
for (int i = 0; i < 20; i++) {
bLoopResult += b;
}
System.out.println(bLoopResult);
확인할 부분이 2개라 다행이지 엄청 늘어난다면..? 우리는 모든 부분에 print를 찍을 자신이 없습니다. 그래서 디버깅 방법을 알아둬야 합니다.
다음과 같은 코드가 있습니다.
CalcManager.java
package CalcPack;
/**
* Calculate Manager Class
*
* @author BernoYoun
*
*/
public class CalcManager {
private static CalcManager calcManager = null;
public static CalcManager getInstance() {
if(calcManager == null) {
calcManager = new CalcManager();
}
return calcManager;
}
/**
* return num1 - num2
*
* @param num1
* @param num2
* @return
*/
public int minus(int num1, int num2) {
int result = 0;
result = num1 - num2;
return result;
}
/**
* return num1 + num2
*
* @param num1
* @param num2
* @return
*/
public int plus(int num1, int num2) {
int result = 0;
result = num1 + num2;
return result;
}
/**
* return num1 * num2
*
* @param num1
* @param num2
* @return
*/
public int multiply(int num1, int num2) {
int result = 0;
result = num1 * num2;
return result;
}
/**
* return num1 / num2
*
* @param num1
* @param num2
* @return
*/
public double divide(int num1, int num2) {
double result = 0;
result = num1 / num2;
return result;
}
/**
* return String num1 + String num2
*
* @param num1
* @param num2
* @return
*/
public String plus(String num1, String num2) {
String result = null;
int resultLength = result.length();
return result;
}
}
세상에.. 코딩하다 잠시 졸았나 봅니다. public String plus 메서드에 문제가 있군요. 하지만 이 함수의 사용자는 단순히 생각하면 "문자로 들어온 값들도 잘 처리해주나 보다" 하고 사용할 거예요.
public class Calculator {
public static void main(String[] args) {
int a = 3;
int b = 5;
String c = "3";
String d = "5";
CalcManager.getInstance().plus(a, b);
CalcManager.getInstance().plus(c, d);
}
}
큰일났어요.
NPE(NullPointerException)이 발생했군요. 근데 이게 코드가 짧아서 다행이지 depth와 complexity가 엄청나다면..?
이제 디버깅을 해봅시다.
잘은 모르겠지만 일단 Calculator클래스 main메서드의 12번째 라인에서 문제가 있다고 합니다.
그 부분에 breakpoint를 찍어줍니다.(라인 넘버에 더블클릭하면 찍혀요)
그리고 CalcManager의 plus메서드에 문제가 있네요. 그 근방으로 breakpoint를 찍고 진행해봅니다.
사용자 퍼스펙티브마다 다를 수 있는데 벌레처럼 생긴 게 디버그 아이콘입니다.
누르고 디버깅을 시작하면 우리가 main문에서 찍은 breakpoint에 멈춥니다.
오른쪽에 Variables를 보면 어떤 변수에 어떤 값이 들어왔는지 보입니다.
아직은 문제가 없군요.
단축키로 F5, F6, F7, F8 이 있습니다.
F5는 호출한 메서드로 들어가기(Step into)
F6은 다음 라인으로 넘어가기(Step over)
F7은 현재 들어가 있는 함수 탈출하기(Step return)
F8은 다음 breakpoint가 나오는 부분까지 진행하기
우리는 메서드로 들어가야 하므로 F5를 누릅니다.
싱글턴 클래스여서 여기를 먼저 들어오네요. F7을 눌러서 탈출합니다.
(위 복붙입니다.)
다시 여기로 돌아왔습니다. 왜냐하면 getInstance메서드 호출 후 plus를 호출했거든요.
다시 F5를 누르면 이제 plus 메서드로 들어갑니다.
문제의 메서드로 들어왔습니다.
아직 오른쪽을 봐도 얻을 수 있는 게 없군요.
F6을 눌러서 다음 라인으로 넘어갑니다.
이런.. 정말 졸면서 코딩했나 봅니다. result가 null인데 이 길이를 구하려다 보니 NullPointerException이 발생했나 보네요. 해당 라인에서 F6을 누르면
우리가 처음 봤던 에러 StackTrace가 콘솔에 나옵니다.
해당 라인에 있는 코드가 문제라는 걸 알았으니 우리는 고치기만 하면 됩니다.
덤으로 원하는 변수에 마우스 커서를 올리면 어떤 값이 들어있는지 보입니다.
이런 식으로 디버깅을 하면 됩니다.
아주 기초적인 부분들만 설명한 거라 더 자세한 내용도 나중에 설명하도록 하겠습니다.
'JAVA' 카테고리의 다른 글
[JAVA] new와 ""의 차이 / string constant pool (0) | 2021.06.06 |
---|---|
접근 제어자 (0) | 2021.05.05 |
JVM -XX Options (0) | 2021.03.01 |
JVM 구조 (2) | 2021.03.01 |
자바 GUI프로그램 IOConsole 글자 수 조절하기 (0) | 2020.11.15 |